Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

Boa tarde,

 

Fiz uma alteração na Unit pmdfeMDFeW adicionando a condição na function GerarXml


  if trim(MDFe.infMDFe.ID) = '' then
    MDFe.infMDFe.ID := chave;

Ficou assim


function TMDFeW.GerarXml: boolean;
var
  chave: AnsiString;
  Gerar: boolean;
  xProtMDFe: String;
begin
  chave := '';

  if not GerarChave(Chave, MDFe.ide.cUF, MDFe.ide.cMDF, StrToInt(MDFe.ide.modelo), MDFe.ide.serie,
    MDFe.ide.nMDF, StrToInt(TpEmisToStr(MDFe.ide.tpEmis)), MDFe.ide.dhEmi, MDFe.emit.CNPJ) then
    Gerador.wAlerta('#001', 'infMDFe', DSC_CHAVE, ERR_MSG_GERAR_CHAVE);

  chave           := StringReplace(chave,'NFe','MDFe',[rfReplaceAll]);

  if trim(MDFe.infMDFe.ID) = '' then
    MDFe.infMDFe.ID := chave;
  MDFe.ide.cDV    := RetornarDigito(MDFe.infMDFe.ID);
  MDFe.Ide.cMDF   := RetornarCodigoNumerico(MDFe.infMDFe.ID, 2);

  // Carrega Layout que sera utilizado para gera o txt
  Gerador.LayoutArquivoTXT.Clear;
  Gerador.ArquivoFormatoXML := '';
  Gerador.ArquivoFormatoTXT := '';

  Gerador.wGrupo(ENCODING_UTF8, '', False);

  if MDFe.procMDFe.nProt <> ''
   then Gerador.wGrupo('mdfeProc versao="' + MDFeEnviMDFe + '" ' + NAME_SPACE_MDFe, '');

  Gerador.wGrupo('MDFe ' + NAME_SPACE_MDFe);
  Gerador.wGrupo('infMDFe Id="' + MDFe.infMDFe.ID + '" versao="' + MDFeEnviMDFe + '"');
  GerarInfMDFe;
  Gerador.wGrupo('/infMDFe');

  if FOpcoes.GerarTagAssinatura <> taNunca then
  begin
    Gerar := true;
    if FOpcoes.GerarTagAssinatura = taSomenteSeAssinada then
      Gerar := ((MDFe.signature.DigestValue <> '') and (MDFe.signature.SignatureValue <> '') and (MDFe.signature.X509Certificate <> ''));
    if FOpcoes.GerarTagAssinatura = taSomenteParaNaoAssinada then
      Gerar := ((MDFe.signature.DigestValue = '') and (MDFe.signature.SignatureValue = '') and (MDFe.signature.X509Certificate = ''));
    if Gerar then
    begin
      FMDFe.signature.URI := somenteNumeros(MDFe.infMDFe.ID);
      FMDFe.signature.Gerador.Opcoes.IdentarXML := Gerador.Opcoes.IdentarXML;
      FMDFe.signature.GerarXML;
      Gerador.ArquivoFormatoXML := Gerador.ArquivoFormatoXML + FMDFe.signature.Gerador.ArquivoFormatoXML;
    end;
  end;
  Gerador.wGrupo('/MDFe');

  if MDFe.procMDFe.nProt <> '' then
   begin
     xProtMDFe :=
           '<protMDFe versao="' + MDFeEnviMDFe + '">' +
             '<infProt>'+
               '<tpAmb>'+TpAmbToStr(MDFe.procMDFe.tpAmb)+'</tpAmb>'+
               '<verAplic>'+MDFe.procMDFe.verAplic+'</verAplic>'+
               '<chMDFe>'+MDFe.procMDFe.chMDFe+'</chMDFe>'+
               '<dhRecbto>'+FormatDateTime('yyyy-mm-dd"T"hh:nn:ss',MDFe.procMDFe.dhRecbto)+'</dhRecbto>'+
               '<nProt>'+MDFe.procMDFe.nProt+'</nProt>'+
               '<digVal>'+MDFe.procMDFe.digVal+'</digVal>'+
               '<cStat>'+IntToStr(MDFe.procMDFe.cStat)+'</cStat>'+
               '<xMotivo>'+MDFe.procMDFe.xMotivo+'</xMotivo>'+
             '</infProt>'+
           '</protMDFe>';

     Gerador.wTexto(xProtMDFe);
     Gerador.wGrupo('/mdfeProc');
   end;

  Gerador.gtAjustarRegistros(MDFe.infMDFe.ID);
  Result := (Gerador.ListaDeAlertas.Count = 0);
end;

Espero ter contribuído

 

 

Abraços

Postado (editado)

Olá,

 

Estou gerado uns MDFe para homologar a atualização do ACBr e me deparei um com problema que pode estar relacionado a este post.

Ao validar o XML apresenta o erro:

 

"'42141211111111111111580010000000201003358722' violates pattern constraint of 'MDFe[0-9]{44}'.

The attribute 'Id' with value '42141211111111111111580010000000201003358722' failed to parse."

 

Avaliando XML pude verificar que o atributo "Id" da tag "infMDFe" foi gerado sem o prefixo "MDFe".

 

Acredito que a unit "pmdfeMDFeR" tbm precise de ajustes.
Ao executar o load de um XML, esta lendo o atributo ID da seguinte forma:

MDFe.infMDFe.ID := SomenteNumeros(Leitor.rAtributo('Id=')); 

Desta forma lê somente os nros e não o prefixo MDFe;

 

Minha forma de trabalho é a seguinte:

1º Carrego o componente com as informações;

     Atribuindo os valores ao atributos;

2º Gerado o XML;

3º Carrego o componente através da leitura do XML;

4º Solicito a validação;

     Neste ponto apresenta o erro.

 

 

Não tenho ideia de como resolver isso.

 

Avaliando os commits na revisão 7173 foi adicionado o uso do método "SomenteNumeros" ao obter o valor o atributo ID, e adicionado um tratamento para verificar se o campo esta preenchido.

 

Valeu.

Editado por carlosmarian

Carlos H. Marian

Analista de Sistemas

|/-\|

  • Consultores
Postado

Boa tarde Carlos,

 

Em vez de:

 

1º Carrego o componente com as informações;

     Atribuindo os valores ao atributos;

2º Gerado o XML;

3º Carrego o componente através da leitura do XML;

4º Solicito a validação;

 

Porque não:

1º Carrego o componente com as informações;

     Atribuindo os valores ao atributos;

2º Enviar;

 

Lembre-se que o Enviar: Gera o XML, Assina, Valida, se OK Envia.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Olá Italo,

  Sua sugestão é correta, mas temos algumas atividades/processos que devem ser executados durante cada fase de emissão da nota e por isso trabalhamos desta forma.

  

Obrigado.

Carlos H. Marian

Analista de Sistemas

|/-\|

  • 1 mês depois ...
  • Moderadores
Postado

Uma dúvida: Em que situação, ao gerar o xml, é necessário informar previamente a chave de acesso e ser preciso manter a chave informada manualmente não deixando que o componente a substitua?

  • Consultores
Postado

Boa noite Graça,

 

Sinceramente, até hoje eu não entendi porque foi feite desta forma no ACBrNFe e que agora deixei igual no ACBrCTe e ACBrMDFe.

 

No meu entendimento o componente deveria ignorar qualquer dado atribuído a propriedade ID assim que a chave for gerada pelo próprio componente.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

  • 3 semanas depois ...
  • Membros Pro
Postado

Boa noite

Estou com uma dúvida, carreguei o componente ACBRNFe com as informações, atribuindo os valores ao atributos;

Se eu gerar o xml, a chave de acesso é gerada normalmente.

Mas como faço para obter a chave de acesso antes de gerar o xml?

  • Membros Pro
Postado

Bom dia!

 

Eu apenas estava em dúvida quanto a sequencia correta de chamada das rotinas, após a carga dos atributos.

 

Agora estou chamando GerarNFE, logo após a carga dos atributos, a qual já gera o ID (e deve gerar também o XML).

 

Grato.

  • Este tópico foi criado há 3568 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.