Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

    Olá pessoal, boa tarde.

 

    Apesar de estar gerando os CT-e em minha aplicação, ainda tenho algumas dúvidas à respeito do ACBrCTE. Tenho algumas dúvidas a respeito do exemplo EnviarLote do componente ACBrCTE.

 

    Gostaria de quem souber possa me explicar.

 

    Peço antecipadamente desculpas pois sou novo no Delphi, e desde já agradeço muito a atenção de todos..

 

   EnviarLote.PAS

 

     // Gera o XML, Assina e Salva o Arquivo
 DMCTE.CTe.Conhecimentos.Assinar;      //  eh necessario usar esta linha ?????? a função CTE.enviar ja não faz isso ?
 MemoStatus.Lines.Add(' Assinado(s)');

 // Valida os dados do XML salvo
 DMCTE.CTe.Conhecimentos.Valida;    //  eh necessario usar esta linha ?????? a função CTE.enviar ja não faz isso ? ou esta linha é usada somente para testar os campos que o usuario digitou ?
 MemoStatus.Lines.Add(' Validado(s)');

 // EnviaSefaz = variável booleana
 // Se False, apenas gera o XML, assina, valida e Imprime o DACTe não protocolado
 // Se True, gera o XML, assina, valida, envia para o SEFAZ e Imprime o DACTe protocolado
 if DM_CTA.EnviaSefaz
  then begin
   MemoStatus.Lines.Add(' Aguarde Enviando...');
   // Envia o lote de Conhecimentos para o SEFAZ e Imprime o DACTe
   // Lote = variável que contem o numero do lote (numero sequencial)
   DMCTE.CTe.Enviar(Lote);   // Caso der erro no envio do lote, o programa prosegueria normalmente daqui pra frente ou causaria uma exceção ?

   sRecibo   := DMCTE.CTe.WebServices.Enviar.Recibo;
   sStat     := IntToStr(DMCTE.CTe.WebServices.Enviar.cStat);
   sMotivo   := DMCTE.CTe.WebServices.Enviar.xMotivo;     //  Este xMotivo, listaria o erro caso o mesmo existisse ?
   sDataHora := DateTimeToStr(DMCTE.CTe.WebServices.Enviar.dhRecbto);
   MemoStatus.Lines.Add('-------------------------------------------------------------------------------------------');
   MemoStatus.Lines.Add(' =>  Recibo nº ' + sRecibo);
   MemoStatus.Lines.Add('-------------------------------------------------------------------------------------------');
   MemoStatus.Lines.Add('  Data / Hora      Status do CT-e');
   MemoStatus.Lines.Add('  ---------------- ---------------------------------------');
   MemoStatus.Lines.Add('  ' + sDataHora + '  ' + sStat + ' - ' + sMotivo);
   MemoStatus.Lines.Add('-------------------------------------------------------------------------------------------');
   MemoStatus.Lines.Add('  ');
   MemoStatus.Lines.Add('-------------------------------------------------------------------------------------------');
   MemoStatus.Lines.Add(' =>  Consultando Recibo nº ' + sRecibo);
   MemoStatus.Lines.Add('-------------------------------------------------------------------------------------------');
   DMCTE.CTe.WebServices.Retorno.Recibo := sRecibo;         // este WebServices.Retorno é necessário pra verificar se houve erro ? e se houve erro no Enviar(Lote) esta linha seria processada ?
   DMCTE.CTe.WebServices.Retorno.Executar;
   MemoStatus.Lines.Add('  Conhecimento Número do protocolo                  Status do CT-e');
   MemoStatus.Lines.Add('  ------------ -----------------------------------  ---------------------------------------');
   for i := 0 to (DMCTE.Cte.WebServices.Retorno.CteRetorno.ProtCTe.Count - 1) do
    begin
     sDataHora     := DateTimeToStr(DMCTE.CTe.WebServices.Retorno.CteRetorno.ProtCTe.Items.dhRecbto);
     sProtocolo    := DMCTE.CTe.WebServices.Retorno.CteRetorno.ProtCTe.Items.nProt;
     sStat         := IntToStr(DMCTE.CTe.WebServices.Retorno.CteRetorno.ProtCTe.Items.cStat);
     sMotivo       := DMCTE.CTe.WebServices.Retorno.CteRetorno.ProtCTe.Items.xMotivo;
     sConhecimento := Copy(DMCTE.CTe.WebServices.Retorno.CteRetorno.ProtCTe.Items.chCTe, 26, 3)
                      + '.' + Copy(DMCTE.CTe.WebServices.Retorno.CteRetorno.ProtCTe.Items.chCTe, 29, 3)
                      + '.' + Copy(DMCTE.CTe.WebServices.Retorno.CteRetorno.ProtCTe.Items.chCTe, 32, 3);

     MemoStatus.Lines.Add('  ' + sConhecimento + '  ' + sProtocolo + ' ' + sDataHora + '  ' + sStat + ' - ' + sMotivo);

     if DMCTE.CTe.WebServices.Retorno.CTeRetorno.ProtCTe.Items.cStat=100
      then begin
       DM_CNT.IncAltDel.SQL.Clear;
       DM_CNT.IncAltDel.SQL.Add('Update Cnt_Conhecimento Set');
       DM_CNT.IncAltDel.SQL.Add('Emissao = :xEmissao,');
       DM_CNT.IncAltDel.SQL.Add('ChaveCTe = :xChave,');
       DM_CNT.IncAltDel.SQL.Add('Enviado = :xEnviado,');
       DM_CNT.IncAltDel.SQL.Add('Protocolado = :xProtocolado,');
       DM_CNT.IncAltDel.SQL.Add('Protocolo = :xProtocolo,');
       DM_CNT.IncAltDel.SQL.Add('Impresso = :xImpresso');
       DM_CNT.IncAltDel.SQL.Add('Where Serie = :xSerie');
       DM_CNT.IncAltDel.SQL.Add('and Numero = :xNumero');
       DM_CNT.IncAltDel.Params[0].AsDateTime:=DateOf(DMCTE.CTe.Conhecimentos.Items.CTe.Ide.dhEmi);
       DM_CNT.IncAltDel.Params[1].AsString:=Copy(DMCTE.CTe.Conhecimentos.Items.CTe.inFCTe.ID,4,44);
       DM_CNT.IncAltDel.Params[2].AsString:='S';
       DM_CNT.IncAltDel.Params[3].AsString:='S';
       DM_CNT.IncAltDel.Params[4].AsString:=sProtocolo;
       DM_CNT.IncAltDel.Params[5].AsString:='S';
       DM_CNT.IncAltDel.Params[6].AsInteger:=DMCTE.CTe.Conhecimentos.Items.CTe.Ide.serie;
       DM_CNT.IncAltDel.Params[7].AsInteger:=DMCTE.CTe.Conhecimentos.Items.CTe.Ide.nCT;
       DM_CNT.IncAltDel.ExecSQL;
      end;
    end;
   MemoStatus.Lines.Add('-------------------------------------------------------------------------------------------');
  end
  else begin
   MemoStatus.Lines.Add(' Aguarde Imprimindo...');
   // Somente imprime o CTe
   DMCTE.CTe.Conhecimentos.Imprimir;  // a rotina enviar(lote) jã nao imprimiria o Dacte ou realmente esta linha é necessario ?

   for i := 0 to (DMCTE.CTe.Conhecimentos.Count - 1) do
    begin
     DM_CNT.IncAltDel.SQL.Clear;
     DM_CNT.IncAltDel.SQL.Add('Update Cnt_Conhecimento Set');
     DM_CNT.IncAltDel.SQL.Add('Emissao = :xEmissao,');
     DM_CNT.IncAltDel.SQL.Add('ChaveCTe = :xChave,');
     DM_CNT.IncAltDel.SQL.Add('Impresso = :xImpresso');
     DM_CNT.IncAltDel.SQL.Add('Where Serie = :xSerie');
     DM_CNT.IncAltDel.SQL.Add('and Numero = :xNumero');
     DM_CNT.IncAltDel.Params[0].AsDateTime:=DateOf(DMCTE.CTe.Conhecimentos.Items.CTe.Ide.dhEmi);
     DM_CNT.IncAltDel.Params[1].AsString:=Copy(DMCTE.CTe.Conhecimentos.Items.CTe.inFCTe.ID,4,44);
     DM_CNT.IncAltDel.Params[2].AsString:='S';
     DM_CNT.IncAltDel.Params[3].AsInteger:=DMCTE.CTe.Conhecimentos.Items.CTe.Ide.serie;
     DM_CNT.IncAltDel.Params[4].AsInteger:=DMCTE.CTe.Conhecimentos.Items.CTe.Ide.nCT;
     DM_CNT.IncAltDel.ExecSQL;
    end;
  end;
end;

 

 


 

  • Consultores
Postado

Boa tarde Leandro,

 

Algumas coisas você tem razão, o comando Enviar, se encarrega de gerar o XML, assinar e validar antes de enviar e finalmente imprimir o DACTE.

 

Portanto você remover as linhas que contem o comando que assina e valida sem nenhum problema.

 

Essa rotina faz parte da minha aplicação.

 

Coloquei o Assinar e o valida, pois na época que iniciei a implementação não possuia um certificado valido para acessar os webservices da SEFAZ.

 

Usei como um quebra galho um certificado disponibilizado pela SEFAZ-RS que permite apenas assinar.

 

Desta forma tive condições de testar a minha aplicação e o componente no que diz respeito a Gerar o XML, Assinar e validar.

 

Note que existe um  if DM_CTA.EnviaSefaz
 

Essa variavel EnviaSefaz é boolean e atribui inicialmente o valor False, pelo simples fato de não possuir o certificado. 

 

Desta forma após gerar o XML, assinar e validar ocorria a impressão do DACTE.

 

 if DM_CTA.EnviaSefaz
  then begin

   (...)

  end
  else begin
   MemoStatus.Lines.Add(' Aguarde Imprimindo...');
   // Somente imprime o CTe
   DMCTE.CTe.Conhecimentos.Imprimir; 

   (...)

  end;

 

Portanto essa rotina é apenas um exemplo, para que você possa a partir dela desenvolver a sua.

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

    Ok muito obrigado por tirar estas dúvidas.. Ítalo você está de parabéns com sua iniciativa.

 

    Mas ainda me restou um dúvida.

 

    Ha respeito do controle de erros e mostrar os erros ao usuário final, Veja abaixo estas linhas do seu exemplo:

 

   DMCTE.CTe.WebServices.Retorno.Recibo := sRecibo;         // este WebServices.Retorno é necessário pra verificar se houve erro ? e se houve erro no Enviar(Lote) esta linha seria processada ?
   DMCTE.CTe.WebServices.Retorno.Executar;
 

   Estas duas linhas acima, são necessárias colocar quando da certo a validação ou quando da errado a validação ou então eu coloco ela nos dois casos ?

 

   Agradeço sua atenção.

  • Consultores
Postado

Leandro,

 

Se não me falha a memória devo ter pego esse trecho de código de um exemplo que há um bom tempo foi postado no antigo fórum.

 

A rotina por sinal se referia a NF-e, como os comandos são os mesmos acabei fazendo igual.

 

A minha aplicação para emissão de CTe foi feita a mais de 2 anos, tem coisas que preciso parar analisar o porque eu coloquei.

 

Não me recordo de tudo.

 

Mas essas 2 linhas são para realizar uma consulta na SEFAZ utilizando o numero do recibo de entrega de lote.

 

O componente possui duas formas de ser utilizado, principalmente os comandos que estabelecem a conexão com os webservices.

 

As linhas que você postou é a segunda forma, que nos permite ter um controle maior, ou seja tratar de forma mais eficiente os retornos, evitando assim as telas exceções que os comandos ( primeira forma) do componente gera quando algo esta errado.

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

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