Ir para conteúdo
  • Cadastre-se

  • Este tópico foi criado há 176 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Consultores
Postado

Olá pessoal,

   Por favor deem atenção.

Excuse Me Focus GIF by Cameo

 

Como sabem estamos aos poucos saindo das units "pcn". E um dos passos para fazermos isso foi criar uma unit chamada ACBrDFe.Conversao.pas (Veja aqui sobre).

Mas essa unit tinha alguns problemas e mudanças de comportamento indesejados então precisamos refazê-la. Isso pode quebrar o seu código e por isso precisamos de sua atenção.

TL/DR: A unit ACBrDFe.Conversao.pas não é uma cópia da pcnConversao.pas com outro nome. A pcnConversao.pas ainda funciona, mas quando você for utilizar a ACBrDFe.Conversao.pas, vai precisar fazer ajustes!

Ainda está aí? Beleza, agora vamos aos detalhes.

Em primeiro lugar queremos deixar claro que ela vai continuar sendo parte da migração para fora das units "pcn*" em especial a pcnConversao.pas.

Vamos resumir aqui no entanto algumas alterações que foram feitas:

  1. A constante LineBreak foi removida. Se você precisa dela no seu código, use a constante que já vem no Delphi/Lazarus SLineBreak.
  2. Diversos tipos foram renomeados. Listamos abaixo alguns:
      TpcnTipoCampo = TACBrTipoCampo;
      TpcnTagAssinatura = TACBrTagAssinatura;
      TpcnTipoImpressao = TACBrTipoImpressao;
      TpcnTipoEmissao = TACBrTipoEmissao;
      TpcnTipoAmbiente = TACBrTipoAmbiente;
      TpcnProcessoEmissao = TACBrProcessoEmissao;
      TpcnTpEvento = TACBrTipoEvento;
      TpcteModal = TModal;
      TpcnTipoNFe = TTipoNFe;
      TpcnOrigemMercadoria = TOrigemMercadoria;
      TpcnCSTIcms = TCSTIcms;
      TpcnCSOSNIcms = TCSOSNIcms;
      TpcnCstPis = TCSTPis;
      TpcnCstCofins = TCSTCofins;
      TpcteTipoRodado = TTipoRodado;
      TpcteTipoCarroceria = TTipoCarroceria;
      TpcnUnidTransp = TUnidTransp;
      TpcnUnidCarga  = TUnidCarga;
      TpcteProp = TtpProp;
      TpcnindIEDest = TindIEDest;
      TpcnRegTribISSQN = TRegTribISSQN;
      TpcnindIncentivo = TindIncentivo;
      TpcnRegTrib = TRegTrib;
      TpcnindRatISSQN = TindRatISSQN;
      TpcnindRegra = TindRegra;
      TpcnCodigoMP = TCodigoMP;
  3. As funções de conversões de tipos enumerados foram refeitas para seguir o padrão "Try-Parse".
    Esse é um padrão comum em linguagens de programação (incluindo o Delphi com as funções TryStrToDate e StrToDate).
    A função que tem no nome o prefixo "Try" realiza a verificação de uma possível conversão sem lançar exceções, retornando um booleano para indicar se a conversão foi bem-sucedida e armazenando o resultado, em caso de sucesso, em um parâmetro de saída.
    A função que não tem esse prefixo, gera uma exception quando o tipo não puder ser convertido.
    Essa função que inicia com "Try" substitui a função anterior que tinha um parâmetro "ok". 
    Um dos objetivos de usar esse padrão é porque muitas pessoas nem se dão conta que é preciso verificar o parâmetro "ok" antes de usar o resultado da função.
    Como sabemos disso? Bem, este tipo de uso é frequente em contribuições e até mesmo no código antigo do ACBr... 🥲

Almejamos assim deixar o código mais claro. Por enquanto o seu código que usa a pcnConversao vai continuar funcionando. Mas vai retornar vários warnings. A ideia é que você possa ir corrigindo no seu tempo. 

Nós mesmo estamos usando e isso vai aumentar a quantidade de warnings gerados que você vê ao compilar os componentes ACBr ...

Por outro lado, vamos modificar o código do ACBr para deixar de utilizar a unit pcnConversao internamente o quanto antes.

Os hints/warnings estão sendo ajustados na unit pcnConversao.pas para refletir o que foi delineado aqui.

E como sempre, fiquem a vontade para reportar quaisquer problemas, sugestões e melhorias.

Obrigado pela atenção pessoal.

  • Curtir 15
  • Obrigado 2

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • 1 mês depois ...
  • Consultores
Postado

Sobre o item 3 podemos ver um exemplo na função StrToCSTICMS.

Na pcnConversao com a implementação usando o parametro "ok":

function StrToCSTICMS(out ok: boolean; const s: string): TpcnCSTIcms;
begin
  result := StrToEnumerado(ok, s, ['', '00', '10', '20', '30', '40', '41', '45', '50', '51', '60',
                                   '70', '80', '81', '90', '91', 'SN',
                                   '10part', '90part', '41rep', '60rep',
                                   '02', '15', '53', '61'],
                                  [cstVazio, cst00, cst10, cst20, cst30, cst40, cst41, cst45, cst50, cst51, cst60,
                                   cst70, cst80, cst81, cst90, cstICMSOutraUF, cstICMSSN,
                                   cstPart10, cstPart90, cstRep41, cstRep60,
                                   cst02, cst15, cst53, cst61]);
end;

Já na ACBr.Conversao sem o uso do parametro "ok":

function StrToCSTICMS(const s: string): TCSTIcms;
begin
  if not TryStrToCSTICMS(s, Result) then
    raise EACBrException.CreateFmt('Valor string inválido para TCSTIcms: %s', [s]);
end;

 

Em 27/10/2025 at 17:33, EMBarbosa disse:

Essa função que inicia com "Try" substitui a função anterior que tinha um parâmetro "ok". 

Veja no exemplo a Função "Try" citada e como ela já vai realizar o tratamento que seria feito pelo "ok" que era um parametro antes.

function TryStrToCSTICMS(const s: string; out Value: TCSTIcms): Boolean;
var
  idx: TCSTIcms;
begin
  Result := False;
  for idx := Low(TCSTIcmsArrayStringsEnt) to High(TCSTIcmsArrayStringsEnt) do
  begin
    if TCSTIcmsArrayStringsEnt[idx] = s then
    begin
      Value := idx;
      Result := True;
      Exit;
    end;
  end;
end;

Perceba também a mudança do nome do Tipo do retorno das duas funções de TpcnCSTIcms para TCSTIcms.

Fique atento aos detalhes e atualize o seu código sempre que possível!

  • Curtir 4
image.png

Alexandre de Paula
Gerente de Projetos
Ajude o Projeto ACBr crescer - Assine o Clube PRO                    

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  ícone Discórdia Discord   

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

 

 

×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.