Ir para conteúdo
  • Cadastre-se

dev botao

Eventos como salvar em arquivo um evento carregado


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

Recommended Posts

Boa tarde pessoal

D7+FB+3Camandas+Capicom

Estou modificando minha aplicação para salvar os XMLs no banco e agora me surgiu uma grande duvida.

Fiz o envio do evento, já consegui salvar no banco de dados, agora, vou mandar os XMLs ao contador, então estou fazendo o seguinte:

Faço um looping na tabela de NFe e até ai tudo bem, com a NFe não estou tendo nenhum problema, mas dentro do looping da NFe

eu faço a pesquisa para ver se essa nota tem algum evento, uma vez encontrado um ou mais evento, entro num segundo looping para passar por todos os eventos da nota,

já consegui carregar o XML do banco para dentro do componente em eventos, o que está complicado agora é que uma vez que o evento esteja carregado com o xml de evento, não estou sabendo como fazer para gerar um arquivo XML/PDF do evento para poder anexar ao email que estou enviando ao contador.

Ficou mais ou menos assim:

vLista=TStringlist
vLista.clear
qNotas.Filtrados
qEventos.Filtrados
while not qNotas.eof do begin
   acbrNFe.NotasFiscais.Clear;
   acbrNFe.NotasFiscais.LoadFromString(qNotas.FieldByName('XML').AsString);
   acbrNFe.NotasFiscais.GravarXML(Path_NFe+qNotas.FieldByName('Danfe').AsString+'-nfe.XML');
   acbrNFe.NotasFiscais.ImprimirPDF;
   if FileExists(Path_NFe+qNotas.FieldByName('DANFE').AsString+'-nfe.pdf') then begin
      vLista.Add(Path_NFe+qNotas.FieldByName('DANFE').AsString+'-nfe.pdf');
   end;
   vLista.Add(Path_NFe+qNotas.FieldByName('DANFE').AsString+'-nfe.xml');
   
   qEventos.Pesquisar
   While not qEventos.eof do begin
      acbrNFe.EventoNFe.Evento.Clear;
      acbrNFe.EventoNFe.LerXMLFromString(qEventos.fieldByName('XML').AsString);

      ??? aqui como posso Salvar o XMLEvento que está carregado no componente ???

      acbrNFe.ImprimirEventoPDF;
      if FileExists(Path_NFe+qEventos.FieldByName('TpEvento').AsString+qEventos.FieldByName('Chave').AsString+FormatFloat('00',qEventos.FieldByName('IdEvento').AsInteger)+'-procEventoNFE.PDF') then begin
         vLista.Add(Path_NFe+qEventos.FieldByName('TpEvento').AsString+qEventos.FieldByName('Chave').AsString+FormatFloat('00',qEventos.FieldByName('IdEvento').AsInteger)+'-procEventoNFE.PDF');
      end;
      vLista.Add(Path_NFe+qEventos.FieldByName('TpEvento').AsString+qEventos.FieldByName('Chave').AsString+qEventos.FormatFloat('00',qEventos.FieldByName('IdEvento').AsInteger)+'-procEventoNFE.XML');
      qEventos.Next
   end;        

   qNotas.next;
End;

 

Obrigado pela atenção

 

Link para o comentário
Compartilhar em outros sites

      ??? aqui como posso Salvar o XMLEvento que está carregado no componente ???

 acbrNFe.EventoNFe.GerarXML;

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Link para o comentário
Compartilhar em outros sites

Ola Isaque, valeu pela resposta, porém encontrei uma outra forma de Salvar o XML em arquivo, afinal, eu tenho ele salvo no Banco, então nas interrogações acima eu fiz o seguinte. qEvento.FieldByName('xml').SaveToFile(tpEvento+Chave+IdEvento+'-procEventoNFe.xml');

Deu certinho.

Testei o que voce respondeu mas infelizmente não fez absolutamente nada, estou definindo Salvar Evento, salvar aquivos, etcc..

ainda no mesmo assunto, porém em situação diferente. veja:

Agora estamos falando da Consulta. Como eu faço a consulta da NFe cuja também não tenho nenhum problema, seguindo no caso de evento.

Tenho uma nfe validada em (homologação) e junto dela tenho uma CC-e, tipo (alteração de dados da entrega), no portal está correto, tudo certinho.

Supomos que por algum motivo, após o envio do evento, o sistema não tenha conseguido salvar o XML do evento no momento do envio, e como padrão, os clientes já se acostumaram enviar novamente até receber a mensagem de Duplicidade, bom neste caso, o cliente faz uma consulta, com a consulta, faço seguinte:

Se no banco de dados não existir o xml gravado, mando gerar+validar+assinar e em seguida recebo a resposta do portal quanto a validade da xml, de outra forma, se a xml existir no banco, simplesmente digo ao sistema que a nfe é legal.

Porém, seguindo adiante, eu ja li bastante que quando se faz a consulta, os xmls dos eventos também descem junto, o que eu não estou conseguindo fazer agora é essa junção do xml orginal com a resposta do SEFAZ, ou seja, quando mando salvar xml evento no banco o que consegui pegar pelo componente, parece ser um xml de evento todo quebrado. Veja, sei que não tem nada de errado no componente, é só um pedido de ajuda para ver se eu me sincronizo com as coisas.

Veja a resposta que estou conseguindo, e se puder me auxiliar, de forma que eu consiga construir o XML do evento de forma completa, agradeço muito.

O mais engraçado é que quando é o caso de cancelamento, ele traz certinho, mas quando CCe não to conseguindo trazer

Veja como cancelamento faço assim:  VarXml := acbrNFe.WebServices.Consulta.procEventoNFe.Items.RetEventoNFe.XML; 

como CC-e não funciona do mesmo jeito..

Bom, a ultima atualização que fiz foi dia 01/10/2015, vou atualizar novamente o componente pra ver o que acontece.

abraços

 

 

XMLEventoCapturadopeloComponente.bmp

Editado por marcelonarezzi
Link para o comentário
Compartilhar em outros sites

Olá Estou de volta, acabei de atualizar o acbr e tentei a mesma operação de consultar um NFE que contem 1 evento de alteração de endereço de entrega

Após o retorno da consulta eu tento imprimir o evento e ele imprime normalmente, porém se eu tentar abrir o xml usando o navegador ele da a seguinte mensagem

A página XML não pode ser exibida

Não é possível exibir a entrada XML usando a folha de estilos XSL. Corrija o erro e clique no botão Atualizar ou tente novamente mais tarde.


Caractere inválido encontrado no texto. Erro ao processar o recurso 'file:///D:/CLIENTES/HOMOLOGA/NFE/110110351510680503500...


 

só que o texto que tem na CC-e é exatamente este "CORRECAO DO ENDERECO DE ENTREGA" ou seja, nenhum caracter especial, nenhum acento, nenhuma quebra de linha, enfim nada. 

Esse fato, está gerando um problema, quando mando enviar o xml de evento tanto ao destinatario quanto ao contador, pois eles não conseguem abrir ou importar o xml.

abraço

Link para o comentário
Compartilhar em outros sites

Bom dia Regys

Nossa, estou lutando pra trazer o XML, agora não consigo mais nem trazer o que estava meio quebrado como informei anteriormente, ta uma confusão na minha cabeça 

puxa, me da uma dica de como fazer o passo a passo na consulta de forma que eu possa tanto ter localmente os XMLs tanto da NFE quanto do Evento bem como, quais as propriedade que posso utilizar para obter o XML da NFE e do evento para armazenar em memoria, a fim de salvar no de dados.

Só isso que preciso, no mais estou muito feliz.

#######################################################

tipo:

acbrnfe.consultar

Retorno
NomedoArquivo:=acbrnfe.consulta.retorno.nomedoarquivo
xml:=acbrnfe.consulta.retorno.ConteudodoXMLOriginal

Retorno dos Eventos
For i:=0 to QtdeEventos do begin
    NomedoArquivoEvento:=acbrnfe.consulta.retorno.nomedoarquivo;
    xml:=acbrnfe.consulta.retorno.ConteudodoXMLOriginal
end;

#######################################################

Regys, tenho certeza que essa é a duvida de muitos outros e que as vezes, assim como eu, acaba fazendo uma POG pois não consegue usar os recursos fantasticos desse Componente chamado ACBR.  

Queria eu, poder trabalhar ao lado de voces e ter a condição de conhecimento sobre componente, ter a possibilidade de escrever sempre um passo a passo para todos os contribuintes do ACBR seja ele financeiro ou de desenvolvimento.

Se voce não puder ajudar neste aspecto, espero que uma boa alma possa pelo menos dar umas dicas.

abraço a todos

Link para o comentário
Compartilhar em outros sites

Regys

Agora acho que consegui gerar o XML 

Eu estou fazendo assim:

#######################################

procedure TF_NFE.acSincronizarXMLExecute(Sender: TObject);
Var
  vRet:integer;
  vArquivo,vIdEvento,vTpEvento,vChave:String;
  vXml:string;
  zVenda:TZQuery;
  i:integer;
begin
  if Permitido(dm.LoginCNPJ.AsString,'NFE_6')=False then begin //consultar
    Exit;
  End;

  zVenda:=TZQuery.Create(nil);
  zVenda.Connection:=dm.BD;
  Try
    if dm15.NFE.RecordCount>0 then begin
      if dm15.NFEDANFE.AsString='' then begin
        mBox('NF-e sem chave. Tente enviar novamente e depois sincronize','E',[mbok]);
        Exit;
      end;
      dm00.acbrNFe.NotasFiscais.Clear;
      if dm15.NFE.FieldByName('xml').AsString<>'' then begin
        dm00.acbrNFe.NotasFiscais.LoadFromString(dm15.NFE.FieldByName('xml').AsString);
      end else begin
        acGerarXML.Execute;
        dm00.acbrNFe.NotasFiscais.Assinar;
      end;
      dm00.acbrNFe.WebServices.Consulta.NFeChave := dm15.NFE.FieldByname('DANFE').AsString;
      dm00.acbrNFe.WebServices.Consulta.Executar;
      vRet:=dm00.acbrNFe.WebServices.Consulta.cStat;
      case vRet of
      100,150:Begin
                Case vRet of
                100:mBox('Autorizada ','I',[MBOK]);
                150:mBox('Autorizada Fora do Prazo','I',[MBOK]);
                end;
                dm15.NFE.Edit;
                dm15.NFE.FieldByName('SITUACAO').AsString   :='1'; //Validada
                dm15.NFE.FieldByName('DANFE').AsString      :=dm00.acbrNFe.WebServices.Consulta.NFeChave;
                dm15.NFE.FieldByName('LOTE').AsInteger      :=dm15.NFENOTA.AsInteger;
                dm15.NFE.FieldByName('PROTOCOLO').AsString  :=dm00.acbrNFe.WebServices.Consulta.Protocolo;
                dm15.NFE.FieldByName('XML').AsString        :=dm00.acbrNFe.NotasFiscais.Items[0].XML;
                dm15.NFE.Post;
                dm15.NFE.ApplyUpdates(-1);
                {Aqui o componente Consulta retorna todos os eventos ligados a NF-e}
                For i:=0 to dm00.acbrNFe.WebServices.Consulta.procEventoNFe.Count-1 do begin
                  vIdEvento:=FormatFloat('00',dm00.acbrNFe.WebServices.Consulta.procEventoNFe.Items.RetEventoNFe.InfEvento.nSeqEvento);
                  dm00.acbrNFe.WebServices.Consulta.procEventoNFe.Items.RetEventoNFe.LerXml;
                  vXml:=dm00.acbrNFe.WebServices.Consulta.procEventoNFe.Items.RetEventoNFe.XML;
                  dm15.EventoConsulta.Close;
                  dm15.EventoConsulta.Params.ParamByName('pNota').AsInteger     :=dm15.NFE.fieldbyname('nota').AsInteger;
                  dm15.EventoConsulta.Params.ParamByName('pSerie').AsString     :=dm15.NFE.fieldbyname('Serie').AsString;
                  dm15.EventoConsulta.Params.ParamByName('pIdEvento').AsInteger :=StrToInt(vIdEvento);
                  dm15.EventoConsulta.Open;
                  if dm15.EventoConsulta.RecordCount>0 then begin
                    dm15.EventoConsulta.Edit;
                    dm15.EventoConsulta.FieldByName('XML').AsString:=   vXml;
                    dm15.EventoConsulta.Post;
                    dm15.EventoConsulta.ApplyUpdates(-1);
                  end;
                end;
              End;
      101,151,155:Begin

#######################################

Entao, estou usando a linha em negrito para armazenar o conteudo do XML Evento na variavel vXML e posterior, gravar no banco de dados logo abaixo

Segue anexo o que estou recebendo nessa vXml

 

Desculpe se fui áspero em algumas palavras, sou um ser humano.

abraço a todos

 

a.xml

Editado por marcelonarezzi
Link para o comentário
Compartilhar em outros sites

  • Fundadores

Marcelo,

Talvez você não esteja sendo muito objetivo em explicar o problema, e como reproduzi-lo... Não adianta muito fazer posts longos e postar trechos de código que não conseguimos executar...

O melhor a fazer é:

- Descrever um passo a passo em detalhes, como reproduzir o problema no programa Demo do ACBr...

- Se isso não for possível, crie um mini projeto, com apenas um botão e poucos componentes, que você possa compartilhar conosco...

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

Bom dia

Seguinte, desculpe se não fui claro, é fato, realmente lendo o post desde o incio, acabei misturando as duvidas, porém são dúvidas que se resolvidas em uma delas, as demais também serão resolvidas, então vamos fazer o seguinte: apaga tudo que perguntei acima e vamos começar do zero.

Infelizmente não consigo fazer um passo a passo usando o demo, pois no demo não tem a possibilidade de fazer conforme o que estou precisando, mas vou tentar explicar passo a passo.

Primeiro:

a) Quando faço um evento CC-e, consigo enviar normalmente;

b.) Após o envio, uso a opção vXML:=acbrNFe.WebServices.EnvEvento.EventoRetorno.retEvento.Items[0].RetInfEvento.XML; para capturar o conteúdo do XMLEvento para salvar no Banco de dados;

c) Neste momento, eu consigo imprimir o Evento com os comandos abaixo o que ocorre normalmente, ou seja é impresso.

With acbrNFe do begin
  if qEvento.fieldByName('XML').AsString<>'' then begin
    EventoNFe.Evento.Clear;
    EventoNFe.LerXMLFromString(qEvento.fieldByName('XML').AsString);
    ImprimirEvento;
  end else begin
    Showmessage('XML não Existe no Banco de Dados');
  end;
end;

d) Bom, até ai, eu já tenho o XMLEvento armazenado no banco de dados conforme o campo qEvento.FieldByName('XML').AsString

e) Agora, eu preciso salvar esse XMLEvento que foi gravado no bando de dados para um arquivo externo, cujo, possa ser enviado tando para o destinatário como para o contador no final do mês. só que o conteúdo do XMLEvento que foi salvo conforme letra {b} acima, se eu tentar copia-lo ou salva-lo como arquivo, ao tentar verificar seu conteúdo utilizando um navegador ocorre um erro dizendo que o XMLEvento está mal formado conforme foi Postado segunda às 23:44

 

Segundo:

Consulta NFE

Supondo que tenha ocorrido alguma impossibilidade de eu salvar no banco de dados o XMLOriginal no momento do Envio e ou salvar o XMLEventoOriginal no momento do EnvioEvento, venho expor:

a) Neste caso, Executo uma Consulta e faço uso dos comandos abaixo:

acbrNFe.NotasFiscais.Clear;
if qNota.FieldByName('xml').AsString<>'' then begin
  acbrNFe.NotasFiscais.LoadFromString(qNota.FieldByName('xml').AsString);
end else begin
  Função_GerarXML;
  acbrNFe.NotasFiscais.Assinar;
end;
acbrNFe.WebServices.Consulta.NFeChave := qNota.FieldByname('DANFE').AsString;
acbrNFe.WebServices.Consulta.Executar;
VarRetorno := acbrNFe.WebServices.Consulta.cStat;

 

 

b.) Para Capturar o Retorno do conteúdo da XML da Nota eu utilizo 

vXML := acbrNFe.NotasFiscais.Items[0].XML;

c) Agora, devido a essa nota conter Eventos vinculados a ela, fiz um For para percorrer todos os eventos vinculados a nota conforme os comandos abaixo:

For i:=0 to acbrNFe.WebServices.Consulta.procEventoNFe.Count-1 do begin
  vIdEvento := FormatFloat('00',acbrNFe.WebServices.Consulta.procEventoNFe.Items.RetEventoNFe.InfEvento.nSeqEvento);
  vXml           := acbrNFe.WebServices.EnvEvento.EventoRetorno.retEvento.Items.RetInfEvento.XML;

 

d) Com os comandos acima, eu tenho a possibilidade de Salvar o conteúdo do XML da nota no banco de dados e ou o conteúdo do XMLEvento no banco de dados, bem como, se eu quiser imprimir o evento depois disso, também consigo imprimir normante conforme a letra {c} acima, no entanto se eu tentar copia-lo ou salva-lo como arquivo, ao tentar verificar seu conteúdo utilizando um navegador ocorre um erro dizendo que o XMLEvento está mal formado conforme foi Postado segunda às 23:44

É só isso que estou tentando dizer, veja, não estou dizendo que o componente tem erros, e sim tentando perguntar a voces se o que estou executando está correto dentro daquilo que estou desejando fazer, visto que ocorre essa dificuldade.  Pois, ao enviar o XMLEvento para o destinatário, o mesmo reclama que não consegue abrir o XMLEvento que foi enviado para ele.

Espero que agora eu tenha descrito o problema de uma maneira geral.

abraço a todos

 

 

Link para o comentário
Compartilhar em outros sites

Pessoal acho que o problema nesse XMLEvento está na acentuação do Texto do Retorno onde diz:

</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
</evento>
<retEvento versao="1.00">
<infEvento><tpAmb>2</tpAmb>
<verAplic>SP_EVENTOS_PL_100</verAplic>
<cOrgao>35</cOrgao>
<cStat>135</cStat>
<xMotivo>Evento registrado e vinculado a NF-e</xMotivo>
<chNFe>35151068050350000104550010000000021000000024</chNFe>
<tpEvento>110110</tpEvento>
<xEvento>Carta de Correção registrada</xEvento>
<nSeqEvento>2</nSeqEvento>
<CNPJDest>03679163000130</CNPJDest>
<dhRegEvento>2015-10-17T12:09:47-03:00</dhRegEvento>
<nProt>135150004820391</nProt>
</infEvento>
</retEvento>
</procEventoNFe>

Pois, editei o XMLEvento no bloco de notas e fui acertando as posições até onde ele informava o erro ao abrir no navegador, então deixei esse texto em negrito da seguinte forma, "<xEvento>Carta de Correcao registrada</xEvento>" , tirei o acento, e depois salve o texto como xml novamente, pasmem, o xml abriu normalmente no navegador, agora não sei se procuro um POG para resolver ou se voces podem me auxiliar quanto a esse problema.

 

Link para o comentário
Compartilhar em outros sites

  • Moderadores

O problema é que você deve estar salvando o arquivo sem o cabeçalho XML, dai o navegador internet explorer que provavelmente é o que você está usando para visualizar não entende os caracteres acentuados, basta adicionar o cabeçalho XML que ele consegue abrir corretamente.

<?xml version="1.0" encoding="UTF-8"?>
  • Curtir 1

Equipe ACBr

Régys Borges da Silveira

http://www.regys.com.br

certificacao delphicertificacao delphi
Link para o comentário
Compartilhar em outros sites

Boa Regys, 

Mas me responde como adiciono o cabeçalho, visto que estou pegando esse conteúdo da XMLEvento que vem do componente ?

Seu eu fizer isso, acredito que vai ser uma baita gambiarra

For i:=0 to acbrNFe.WebServices.Consulta.procEventoNFe.Count-1 do begin
  vIdEvento := FormatFloat('00',acbrNFe.WebServices.Consulta.procEventoNFe.Items.RetEventoNFe.InfEvento.nSeqEvento);
  vXml           :=
'<?xml version="1.0" encoding="UTF-8"?>'+acbrNFe.WebServices.EnvEvento.EventoRetorno.retEvento.Items.RetInfEvento.XML;

 

 

Editado por marcelonarezzi
Link para o comentário
Compartilhar em outros sites

Bom dia Regys e demais companheiros

Não sei como voce fez o seu teste, mas nem sempre a forma que se faz por ai é igual a que é necessária por arqui, bom mas isso não vem ao caso agora,

o importante é que consegui resolver o problema usando uma função acho que do acbr

For i:=0 to dm00.acbrNFe.WebServices.Consulta.procEventoNFe.Count-1 do begin
 vIdEvento:=FormatFloat('00',dm00.acbrNFe.WebServices.Consulta.procEventoNFe.Items.RetEventoNFe.InfEvento.nSeqEvento);
 vXml:=ConverteXMLtoUTF8(dm00.acbrNFe.WebServices.Consulta.procEventoNFe.Items.RetEventoNFe.XML);

Era somente isso que eu queria e tentei explicar desde o inicio, o XML quando abria no navegador aparecia que estava com falhas, na realidade é porque no XML contem palavras acentuadas e o componente não retornava o XML com cabeçalho de UTF8.

Obrigado a quem me ajudou

Bom dia a todos

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

  • Fundadores

Sua analise está correta... pois os acentos retornados por "RetEventoNFe.XML", estão em UNICODE (ou ANSI) dependendo da versão do seu Delphi...

o método ConvertesXMLtoUTF8, irá converter esses acentos para UTF8 e anexar o cabeçalho...

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

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

The popup will be closed in 10 segundos...