Jump to content

dev botao

XML Carta de Correção


Go to solution Solved by Italo Giurizzato Junior,
  • Este tópico foi criado há 1632 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro

Estou tentando a tempos resolver o problema sem sucesso, mas um dos meus clientes começou a cobrar enfaticamente a solução, eu até oje não consigo gravar o XML de retorno com o protocolo da carta de correção no BD. Faço assim :

	if MD.ACBrNFe.EnviarEvento(l_num_nf) then
	begin
		with MD.ACBrNFe.WebServices.EnvEvento do
		begin
			// retornos
			v_data_hora_evento := EventoRetorno.retEvento.Items[0].RetInfEvento.dhRegEvento;
			v_numero_protocolo := EventoRetorno.retEvento.Items[0].RetInfEvento.nProt;
			v_xml := EventoRetorno.retEvento.Items[0].RetInfEvento.XML;
			v_codigo_status := EventoRetorno.retEvento.Items[0].RetInfEvento.cStat;
			v_motivo_status := EventoRetorno.retEvento.Items[0].RetInfEvento.xMotivo;
		end;
	end

	if v_codigo_status in [101, 135, 128] then
	begin
		try
			MD.ACBrNFe.EventoNFe.GerarXML;

			v_nome_arquivo := MD.ACBrNFe.Configuracoes.Arquivos.PathSalvar +
						cdsCarta_Correcao.FieldByName('C_CHAVE_ACESSO_NF').AsString + '11011' +
								F_strzero(v_seq_carta_correcao, 2)+'-procEventoNFe.xml';

			cdsNF0600.Edit;
			cdsNF0600C_NOME_ARQUIVO_GERADO_CORRECAO.AsString := v_nome_arquivo;
			cdsNF0600C_ARQUIVO_CORRECAO.LoadFromFile(v_nome_arquivo);
			cdsNF0600.ApplyUpdates(0);

			try
				P_Imprime_Carta_Correcao(l_num_nf, l_cod_impressora);
			except
				MessageDlg('Erro ao IMPRIMIR a CARTA de CORREÇÃO !', mtError, [mbOk], 0);
			end;

		except
			MessageDlg('Erro ao GRAVAR o ARQUIVO .xml da Carta de Correção no banco de dados !',
				mtError, [mbOk], 0);
			P_Log_Varejo(g_cod_caixa, g_caminho_arquivo_log_rede, 'Carta de Correção da NFe '+IntToStr(l_num_nf)+' Seq: '+
				IntToStr(v_seq_carta_correcao)+' - Erro : '+
				'Erro ao GRAVAR o ARQUIVO .xml da Carta de Correção no banco de dados !', g_login, Now,
				ExtractFileDir(Application.ExeName)+'\Logs\NFe\LogCartaCorrecaoNFe '+IntToStr(l_num_nf)+'.txt');
		end;

		P_Log_Varejo(g_cod_caixa, g_caminho_arquivo_log_rede, 'Carta de Correção da NFe '+IntToStr(l_num_nf)+
			' - Seq: '+IntToStr(v_seq_carta_correcao)+' : '+
			v_motivo_status, g_login, Now,  ExtractFileDir(Application.ExeName)+'\Logs\NFe\LogCartaCorrecaoNFe '+IntToStr(l_num_nf)+'.txt');

		MessageDlg('Carta de Correção EFETUADA com sucesso. '+#13#10+#13#10+
					'Protocolo : '+v_numero_protocolo+#13#10+#13#10+
					'Status : '+IntToStr(v_codigo_status), mtConfirmation, [mbOk], 0);
	end;

Mas sempre gera o erro pois o arquivo ainda não está salvo no disco, porém após dar o erro e fechar a tela o arquivo xml aparece no disco..

Em qual momento o arquivo e salvo ?

Ou ainda como faço pra salvar o arquivo manualmente, após o envio do evento ?

Muito Obrigado !

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

Link to comment
Share on other sites

  • Consultores

Boa tarde Edevair

Me explica o porque da rotina abaixo?

if v_codigo_status in [101, 135, 128] then
begin
  (...)
end;

O componente salva automaticamente o arquivo *-procEventoNFe.xml em disco desde que a propriedade de configuração abaixo esteja com o valor True.

Configuracoes.Arquivos.Salvar

  • Like 1
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

Link to comment
Share on other sites

  • Membros Pro
17 horas atrás, Italo Jurisato Junior disse:

Boa tarde Edevair

Me explica o porque da rotina abaixo?


if v_codigo_status in [101, 135, 128] then
begin
  (...)
end;

O componente salva automaticamente o arquivo *-procEventoNFe.xml em disco desde que a propriedade de configuração abaixo esteja com o valor True.

Configuracoes.Arquivos.Salvar

@Italo Jurisato Junior muito obrigado por responder..

Respondendo sua pergunta Pq se dá erro no retorno do evento o arquivo salvo fica em branco, por isso faço a consistência pra não gravar no banco de dados, já que deu erro...

A propriedade Configuracoes.Arquivos.Salvar está como true, o arquivo realmente está salvando em disco, porém preciso saber em qual momento o arquivo é salvo, pq preciso gravar ele no banco de dados.. Está dando erro exatamente na hora de gravar o arquivo :

			cdsNF0600.Edit;
			cdsNF0600C_NOME_ARQUIVO_GERADO_CORRECAO.AsString := v_nome_arquivo;
			cdsNF0600C_ARQUIVO_CORRECAO.LoadFromFile(v_nome_arquivo); //Aqui ocorre o erro
			cdsNF0600.ApplyUpdates(0);

Debugando, no momento do loadfromfile o arquivo não existe no diretório, por isso o erro, aí se eu debugar até o fim, após finalizar, o arquivo esta gravado... Gostaria de saber em qual momento o arquivo é criado para poder gravar no BD !

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

Link to comment
Share on other sites

  • Membros Pro
11 minutos atrás, Rafael Dias disse:

Já tentou a propriedade EventoRetorno.Xml ?
Senão me engano o xml do evento fica nesta propriedade.

Na verdade eu uso esta propriedade, conforme consta no código, mas nela só contém os dados do retorno e não do protocolo, o arquivo salvo pelo componente contém todas as informações necessárias.

O único detalhe é que não estou conseguindo salvar este arquivo no banco...

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

Link to comment
Share on other sites

  • Membros Pro
47 minutos atrás, Rafael Dias disse:

E a propriedade Webservices.EnvEvento.RetWS não tem o retorno completo ?

Na verdade é a junção dos dois, mas não seria mais fácil descobrir em qual momento o arquivo é salvo ?

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

Link to comment
Share on other sites

  • Membros Pro
1 hora atrás, Rafael Dias disse:

o arquivo é salvo assim que baixado o Webservice e finalizado a requisição,  não entendi o motivo de ele não estar salvando.

Já tenou usar o DoEvents antes de ler as coisas.

E quando é finalizada a requisição ?

Não usei DoEvents, o que seria ?? E como uso ?

Muito Obrigado !

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

Link to comment
Share on other sites

  • Consultores

Bom dia Edevair,

Faça o seguinte:

sEvento :=   ACBrNFe1.WebServices.EnvEvento.EventoRetorno.retEvento.Items[0].RetInfEvento.XML;

Se o evento for rejeitado a propriedade XML conterá uma string vazia.

Pelo o que eu entendi, você deseja salvar no banco de dados o XML completo, ou seja, o conteúdo do *-procEventoNFe.xml, nesse XML temos a solicitação do evento assinada e o retorno da SEFAZ que acusa que o evento esta vinculado ao documento, bem como o numero do protocolo gerado pela SEFAZ.

 

Analisando a sua rotina, você já esta lendo a propriedade XML, porque você não pega o conteúdo dela e salva no banco de dados?

Porque você esta tentando gerar novamente o XML do evento?

Como já postei acima o bloco:
 

if v_codigo_status in [101, 135, 128] then
begin
  (...)
end;

Não faz nenhum sentido.
 

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

Link to comment
Share on other sites

  • 4 months later...
  • Membros Pro
Em 09/12/2019 at 10:06, Italo Jurisato Junior disse:

Bom dia Edevair,

Faça o seguinte:

sEvento :=   ACBrNFe1.WebServices.EnvEvento.EventoRetorno.retEvento.Items[0].RetInfEvento.XML;

Se o evento for rejeitado a propriedade XML conterá uma string vazia.

Pelo o que eu entendi, você deseja salvar no banco de dados o XML completo, ou seja, o conteúdo do *-procEventoNFe.xml, nesse XML temos a solicitação do evento assinada e o retorno da SEFAZ que acusa que o evento esta vinculado ao documento, bem como o numero do protocolo gerado pela SEFAZ.

 

Analisando a sua rotina, você já esta lendo a propriedade XML, porque você não pega o conteúdo dela e salva no banco de dados?

Porque você esta tentando gerar novamente o XML do evento?

Como já postei acima o bloco:
 


if v_codigo_status in [101, 135, 128] then
begin
  (...)
end;

Não faz nenhum sentido.
 

@Italo Jurisato Junior eu preciso gerar o XML completo para imprimir o evento, gerar um PDF para envio pro Cliente. Por isso preciso do arquivo. A maior dúvida é pq o XML da carta de correção não está sendo gerada no disco !

_____________________________________

Junior - Rhovanion Tecnologia

(11) 4224.6543

Link to comment
Share on other sites

  • Consultores
  • Solution

Boa tarde Edevair,

Todos os eventos não importa qual, é gerado 3 XML.

*-ped-eve.xml ===> Pedido de Evento, esse XML é enviado para SEFAZ.

*-eve.xml         ===> Retorno da SEFAZ contendo o protocolo de autorização do evento, caso este tenha sido aceito pela SEFAZ.

*-procEventoNFe.xml  ===> É gerado pelo componente, ele contem os outros dois acima.

É este ultimo que devemos carregar juntamente com o XML da nota para poder imprimir o DAEvento um Documento Auxiliar do Evento, gerar o PDF através do método ImprimirPDF e inclusive enviar o Evento por e-mail através do método EnviarEmailEvento.

No programa exemplo do ACBrNFe temos um botão para cada uma dessas funcionalidades.

Com relação a salvar o XML em disco, é preciso verificar a configuração do componente.

Os dois primeiros arquivos só são salvos se a propriedade Configuracoes.Geral.Salvar estiver com o valor True, já o terceiro só se Configurações.Arquivos.Salvar estiver com o valor True.

Outra coisa os XMLs dos eventos não são salvos na mesma pasta que são salvos os XMLs das NF-e.

É criado uma pasta chamada Evento e dentro desta uma pasta com o nome do tipo de evento e dentro desta os XMLs.

  • Like 2
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

Link to comment
Share on other sites

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.