Ir para conteúdo
  • Cadastre-se

dev botao

Geração da ID de eventos


Ver Solução Respondido por EMBarbosa,
  • Este tópico foi criado há 779 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Bom dia!

Depois de um bom tempo sem atualizar o ACBR, fiz o update e notei que houve uma importante reestruturação na unit ACBrUtil. Realizei então diversos testes com a geração dos eventos do eSocial, e me deparei com um pequeno problema que possivelmente mais alguém possa vir a enfrentar.

O problema consistia em que, ao realizar a validação de schema do XML de um lote de eventos, por vezes aparecia uma mensagem semelhante à seguinte:
Element '{http://www.esocial.gov.br/schema/lote/eventos/envio/v1_1_1}evento', attribute 'Id': 'IDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' is not a valid value of the atomic type 'xs:ID'.

Analisando o XML do lote gerado, me dei conta de que o erro era devido ao fato haver mais de uma ocorrência de eventos do mesmo tipo com a mesma ID.

Depurei o processo de geração da ID dos eventos, e descobri que por conta da reestruturação, na implementação da função TeSocialEvento.GerarChaveEsocial na unit pcesGerador, o uso da unit ACBrUtil.Base tomou precedência em relação à pcnAuxiliar, e que ambas possuem uma implementação da função IntToStrZero, porém, com comportamentos ligeiramente diferentes. Assim, a função utilizada para gerar o número sequencial da ID dos eventos passou a utilizar a função IntToStrZero da unit nova, e a ter um novo comportamento em alguns casos.

Resumidamente, ambas as funções IntToStrZero retornam uma string com um número inteiro completando com zeros à esquerda, porém, a função IntToStrZero da pcnAuxiliar faz o truncamento do campo à esquerda ("123456" -> "23456"), ao passo que a função IntToStrZero da unit ACBrUtil.Base faz o truncamento à direita ("123456" -> "12345").

Essa diferença no retorno das funções em geral seria irrelevante para a geração da ID do evento, exceto quando o sequencial informado tenha um comprimento maior que cinco dígitos. Por coincidência, este era exatamente o meu caso, pois utilizo um generator de banco de dados para informar o sequencial, cujo valor ultrapassou a casa dos cinco dígitos, fazendo com que eventos gerados para a mesma empresa dentro do mesmo segundo ficassem com o mesmo sequencial, e portanto, a mesma ID.

A mudança no comportamento na geração da ID talvez seja proposital, talvez seja acidental, mas de qualquer maneira, deixo aqui minha sugestão de alteração para que a geração da ID volte a ter o comportamento anterior.

Em anexo está a alteração que realizei na unit pcesGerador, especificando na função TeSocialEvento.GerarChaveEsocial que a chamada à IntToStrZero seja a da que está implementada na unit pcnAuxiliar, tal como era anteriormente.

De qualquer modo, mesmo que a equipe do projeto ACBR decida não acatar a minha sugestão, sabendo o que ocasionou o problema, fica fácil resolver alterando a minha aplicação.

pcesGerador.pas

Link para o comentário
Compartilhar em outros sites

  • Administradores

Obrigado pela contribuição, em breve será validada para possível inclusão ao svn

TK-2586

  • Curtir 1
Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

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

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


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
  • Consultores
  • Solution
Em 25/04/2022 at 08:49, Danúbio Viana Nogueira disse:

Bom dia!

Depois de um bom tempo sem atualizar o ACBR, fiz o update e notei que houve uma importante reestruturação na unit ACBrUtil. Realizei então diversos testes com a geração dos eventos do eSocial, e me deparei com um pequeno problema que possivelmente mais alguém possa vir a enfrentar.

O problema consistia em que, ao realizar a validação de schema do XML de um lote de eventos, por vezes aparecia uma mensagem semelhante à seguinte:
Element '{http://www.esocial.gov.br/schema/lote/eventos/envio/v1_1_1}evento', attribute 'Id': 'IDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' is not a valid value of the atomic type 'xs:ID'.

Analisando o XML do lote gerado, me dei conta de que o erro era devido ao fato haver mais de uma ocorrência de eventos do mesmo tipo com a mesma ID.

Depurei o processo de geração da ID dos eventos, e descobri que por conta da reestruturação, na implementação da função TeSocialEvento.GerarChaveEsocial na unit pcesGerador, o uso da unit ACBrUtil.Base tomou precedência em relação à pcnAuxiliar, e que ambas possuem uma implementação da função IntToStrZero, porém, com comportamentos ligeiramente diferentes. Assim, a função utilizada para gerar o número sequencial da ID dos eventos passou a utilizar a função IntToStrZero da unit nova, e a ter um novo comportamento em alguns casos.

Resumidamente, ambas as funções IntToStrZero retornam uma string com um número inteiro completando com zeros à esquerda, porém, a função IntToStrZero da pcnAuxiliar faz o truncamento do campo à esquerda ("123456" -> "23456"), ao passo que a função IntToStrZero da unit ACBrUtil.Base faz o truncamento à direita ("123456" -> "12345").

Essa diferença no retorno das funções em geral seria irrelevante para a geração da ID do evento, exceto quando o sequencial informado tenha um comprimento maior que cinco dígitos. Por coincidência, este era exatamente o meu caso, pois utilizo um generator de banco de dados para informar o sequencial, cujo valor ultrapassou a casa dos cinco dígitos, fazendo com que eventos gerados para a mesma empresa dentro do mesmo segundo ficassem com o mesmo sequencial, e portanto, a mesma ID.

A mudança no comportamento na geração da ID talvez seja proposital, talvez seja acidental, mas de qualquer maneira, deixo aqui minha sugestão de alteração para que a geração da ID volte a ter o comportamento anterior.

Em anexo está a alteração que realizei na unit pcesGerador, especificando na função TeSocialEvento.GerarChaveEsocial que a chamada à IntToStrZero seja a da que está implementada na unit pcnAuxiliar, tal como era anteriormente.

De qualquer modo, mesmo que a equipe do projeto ACBR decida não acatar a minha sugestão, sabendo o que ocasionou o problema, fica fácil resolver alterando a minha aplicação.

pcesGerador.pas 76 kB · 4 downloads

Olá.

Muito obrigado pela sugestão e análise.

Depois de verificar a situação, decidimos subir a alteração por questão de retrocompatibilidade.

Mas por favor, faça a alteração de sua aplicação pois no futuro isso pode ser alterado.

A questão é que o problema acontece se, e somente se, for preenchido o campo "sequencial" com valores maiores do que ele deveria permitir (ou seja, 5 caracteres).

Além disso, a nossa ideia é ir eliminando aos poucos os códigos repetidos ou muito semelhantes. E esse código da específico da PCNAuxiliar já está na nossa mira. :)

Subi as alterações para o SVN na Revisão  25780.
Pelo que vi está tudo certo.
Queira por favor atualizar, testar e reportar qualquer problema.

Mais uma vez obrigado.

[]'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.
Link para o comentário
Compartilhar em outros sites

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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.