Boa tarde,
Ao efetuar alguns testes com os componentes do ACBr para transmitir notas fiscais de importação e exportação, percebi que algumas vezes gerava um alerta na unit pcnNFeW quando caia no método GerarDestEnderDest e validava a UF, e outras vezes não. Abaixo segue um dos testes que gerava alerta.
if not ValidarUF(xUF) then
Gerador.wAlerta('E12', 'UF', DSC_UF, ERR_MSG_INVALIDO);
Alertas:
TAG:<dest><enderDest> ID:E11/xMun(Nome do Município) - Nenhum valor informado.
TAG:<dest><enderDest> ID:E12/UF(Sigla da UF) - Nenhum valor informado.
TAG:<dest><enderDest> ID:E12/UF(Sigla da UF) - Conteúdo inválido.
Debuguei o código até entender que a causa desse comportamento seriam as typed constants definidas na pcnNFe
const
CMUN_EXTERIOR: Integer = 9999999;
XMUN_EXTERIOR: String = 'EXTERIOR';
UF_EXTERIOR: String = 'EX';
Para simular, tive que seguir os passos a seguir: abro o sistema; em seguida abro um form no qual cadastro a NFe (este form está em outra bpl). Faço uma nota de importação ou exportação e salvo ela. No momento que salva, é gerado o XML da NFe através da pcnNFeW.GerarXML. Nesse primeiro momento, tudo funciona corretamente. Mas se eu fechar a tela da nota fiscal, entrar novamente e cadastrar outra NF-e de importação ou exportação, no momento que gerar o XML, as constantes acima do tipo String estarão em branco (''). Logo, o método AjustarMunicipioUF não vai atualizar as variáveis corretamente, ocasionando o alerta. Busquei na internet soluções para isso e descobri que essas typed constants são diferentes das true constants e que algumas pessoas não recomendam usar elas para tipos simples como Integer e String. Somente para arrays, ponteiros,...
Enfim, retirei os tipos das constantes e funcionou corretamente.
const
CMUN_EXTERIOR = 9999999;
XMUN_EXTERIOR = 'EXTERIOR';
UF_EXTERIOR = 'EX';
Não sei porquê os valores ficavam em branco na segunda vez que eu entrava na tela, mas pesquisando entendi que o uso das typed constants não é amplamente recomendado. Sugiro tirar os tipos dessas constantes (e outras de tipos simples, caso houver) no ACBr para evitar problemas assim, ou se alguém conseguir me explicar porquê isso acontece, seria útil.
Obs: Eu informo o nome real da cidade, mesmo que ela seja do exterior e deixo que o ACBr trate para quando for operação com exterior, colocar os valores das constantes.
Um link que aborda o problema:
https://stackoverflow.com/questions/2714365/delphi-all-constants-are-constant-but-some-are-more-constant-than-others