Ir para conteúdo
  • Cadastre-se

dev botao

Cte - Conhecimentos - LoadFromFile (XML)


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

Recommended Posts

Postado

Boa tarde !

Aqui na empresa aumentaram os números de recebimento de conhecimento de transportes. Como existia um sistema muito antigo aqui onde a pessoa ainda tem que digitar o cadastro deste CTe, resolvi fazer um novo sistema de cadastramento, mas de forma automática pela carga do XML. 

Segui o demo do ACBR, mas tem um campos do CTe que não consegui localizar, como por ex:

Valor total da mercadoria, peso, volumes, valor total do serviço, valor a receber e código do cfop.

Como acessar estes valores citados acima ?

Fiz um load bem básico do xml, apenas para acessar os valores e depois implementar no sistema, que pode ser visualizado no código abaixo:

Anexe o código não cole, fica extenso e ruim para ler

  • Consultores
  • Solution
Postado

Bom dia,

Os nomes dos campos no componente seguem a mesma nomenclatura do manual.

Te aconselho a abrir a Unit pcteCTeR.pas e procurar pelo nome do campo desejado.

Assim fica mais fácil de achar o que deseja.

Por exemplo o CFOP do CT-e:

    (*B02*)CTe.Ide.cUF      := Leitor.rCampo(tcInt, 'cUF');
    (*B03*)CTe.Ide.cCT      := Leitor.rCampo(tcStr, 'cCT');
    (*B04*)CTe.Ide.CFOP     := Leitor.rCampo(tcStr, 'CFOP');    <=== é essa linha que lê a tag <CFOP> do XML e armazena o seu valor no campo CFOP.
    (*B05*)CTe.Ide.natOp    := Leitor.rCampo(tcStr, 'natOp');

Acredito que você esteja carregando um XML por vez, ou seja:

    ACBrCTe1.Conhecimentos.Clear;
    ACBrCTe1.Conhecimentos.LoadFromFile(xNomeDoXml);

Logo para obter o CFOP do CT-e carregado temos:

  xCFOP := ACBrCTe1.Conhecimentos.Items[0].CTe.ide.CFOP;

Simples assim.

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

Se ajudar segue exemplo de código:


procedure TfrmCTE_Importacao.btXMLClick(Sender: TObject);
var sfilter, sFileName, mCONHEC,mCOD_CTRC : String;
    ArquivoXML : TStringList;
    TipoDFE : Integer;
begin
  OpenDialog1.Title := 'Selecione o CTe';
  OpenDialog1.DefaultExt := '*-cte.xml';
  OpenDialog1.Filter :=
    'Arquivos CTe (*-cte.xml)|*-cte.xml|Arquivos XML (*.xml)|*.xml|Todos os Arquivos (*.*)|*.*';
  OpenDialog1.InitialDir := ACBrCTE1.Configuracoes.Arquivos.PathSalvar;


  if OpenDialog1.Execute then
  begin
    sFileName := OpenDialog1.FileName;
    ArquivoXML := TStringList.Create;
    ArquivoXML.LoadFromFile(sFileName);

    TipoDFE := 0;
    if pos('<infNFe', ArquivoXML.Text) > 0
      then TipoDFE := 1;
    if pos('<infCte', ArquivoXML.Text) > 0
      then TipoDFE := 2;
    if pos('InfNfse', ArquivoXML.Text) > 0
      then TipoDFE := 3;
    if pos('infMDFe', ArquivoXML.Text) > 0
      then TipoDFE := 4;
    if pos('procEventoNFe', ArquivoXML.Text) > 0
      then TipoDFE := 5;
    if pos('procEventoCTe', ArquivoXML.Text) > 0
      then TipoDFE := 6;
    if pos('procEventoMDFe', ArquivoXML.Text) > 0
      then TipoDFE := 7;

    ArquivoXML.Free;

    mCONHEC := LeftStr(RightStr(sFileName,25),7);
    mCOD_CTRC := mCONHEC+IntToStr(spFCODIGO.Value);


    sFilter:='COD_CTRC = '+ QuotedStr(mCOD_CTRC)+'';
    dm1.Nota.Query(sFilter);
    dm1.Nota.First;

    if  (TipoDFE<>2) then
    begin
       messagedlg('Este XML não é de CTe, favor baixar direto do site do SEFAZ !',mterror,[mbok],0);
       exit;
    end;

    if dm1.Nota.Eof  then
    begin
       importaCteDoXML( sFileName);
       messagedlg('CTE '+mCONHEC+' foi importado com sucesso !!!',mtInformation,[mbok],0);
    end
    else
       messagedlg('Este CTE já existe no sistema !',mtError,[mbok],0);

  end;

end;


procedure TfrmCTE_Importacao.importaCteDoXML(sFile: String);
var
  sRandom, sNatureza,sChaveCTE, mConhec : String;
  mIBGE_ENT,mCENTREGA,mENT_UF, mIBGE_COL,mCCOLETA,mCOL_UF: String;
  mCESPECIE, mCNATU, mCNATUC, mCUBAGEM: String;

  mTARIFA, mCVALOR, mFRTPESO, mXFRETE, mPEDAGIO, mCOUTROS, mCTOTAL, mCBASECALC,mCALIQUOTA, mCICMS : double;

  mCDATA :TDate;
  iSerie,iConhec : Integer;

  mCCLIENTE1, mCCLIENTE2, mCCLIENTE3, mCCLIENTE4 : String;
  mAPAGAR4, mPAGO4, mAPAGAR3, mPAGO3, mCALCULADO, mCOBS, mCOBS3:String;
  mFCODIGO, mCOD_CTRC, mTOMADOR : String;
  iVarreComps, iQtdComps, mQTD : Integer;
  xQTD_Converte, mCPESO, mTSECCAT, mTDESPACHO, mFRTVALOR : Double;

  mRecibo, sChaveNFE, mNomeArq, mChaveCTE, mProtoc : String;


begin

   ACBrCTe1.Conhecimentos.Clear;
   if not FileExists(sFile) then exit;

   ACBrCTe1.Conhecimentos.LoadFromFile(sFile);

//   showmessage(IntToStr(ACBrCTe1.Conhecimentos.Items[0].cStat));

   if ACBrCTe1.Conhecimentos.Count>0 then
   begin
     sNatureza := ACBrCTe1.Conhecimentos.Items[0].CTE.ide.natOp;
     sRandom    := IntToStr(ACBrCTe1.Conhecimentos.Items[0].CTE.ide.cCT);
     mCDATA     := ACBrCTe1.Conhecimentos.Items[0].CTE.ide.dhEmi;

     mConhec    := IntToStr(ACBrCTe1.Conhecimentos.Items[0].CTE.ide.nCT);
     mCONHEC    := tbStrZero(StrToInt(Mconhec),7);

     mCNATU     := IntToStr(ACBrCTe1.Conhecimentos.Items[0].CTE.ide.CFOP);

     mIBGE_COL  := IntToStr(ACBrCTe1.Conhecimentos.Items[0].CTE.ide.cMunIni);
     mCCOLETA    := ACBrCTe1.Conhecimentos.Items[0].CTE.ide.xMunIni;
     mCOL_UF    := ACBrCTe1.Conhecimentos.Items[0].CTE.ide.UFIni;

     mIBGE_ENT  := IntToStr(ACBrCTe1.Conhecimentos.Items[0].CTE.ide.cMunFim);
     mCENTREGA    := ACBrCTe1.Conhecimentos.Items[0].CTE.ide.xMunFim;
     mENT_UF    := ACBrCTe1.Conhecimentos.Items[0].CTE.ide.UFFim;

     mCCLIENTE1 := ACBrCTe1.Conhecimentos.Items[0].CTE.rem.CNPJCPF;
     mCCLIENTE2 := ACBrCTe1.Conhecimentos.Items[0].CTE.dest.CNPJCPF;
     mCCLIENTE3 := ACBrCTe1.Conhecimentos.Items[0].CTE.exped.CNPJCPF;
     mCCLIENTE4 := ACBrCTe1.Conhecimentos.Items[0].CTE.receb.CNPJCPF;

     if ACBrCTe1.Conhecimentos.Items[0].CTE.ide.toma03.Toma = tmRemetente then
         mTOMADOR := mCCLIENTE1;
     if ACBrCTe1.Conhecimentos.Items[0].CTE.ide.toma03.Toma = tmDestinatario then
         mTOMADOR := mCCLIENTE2;
     if ACBrCTe1.Conhecimentos.Items[0].CTE.ide.toma03.Toma = tmExpedidor then
         mTOMADOR := mCCLIENTE3;
     if ACBrCTe1.Conhecimentos.Items[0].CTE.ide.toma03.Toma = tmRecebedor then
         mTOMADOR := mCCLIENTE4;

     if copy(Mccliente1,1,1)<>'' then
         mCCLIENTE1:=FUNCOES1.FormataCNPJ(mCCLIENTE1);
     if copy(Mccliente2,1,1)<>'' then
         mCCLIENTE2:=FUNCOES1.FormataCNPJ(mCCLIENTE2);
     if copy(Mccliente3,1,1)<>'' then
         mCCLIENTE3:=FUNCOES1.FormataCNPJ(mCCLIENTE3);
     if copy(Mccliente4,1,1)<>'' then
         mCCLIENTE4:=FUNCOES1.FormataCNPJ(mCCLIENTE4);
     if copy(mTOMADOR,1,1)<>'' then
         mTOMADOR:=FUNCOES1.FormataCNPJ(mTOMADOR);


     if mCCLIENTE1=mTOMADOR then
         mPAGO3 := 'X';
     if mCCLIENTE2=mTOMADOR then
         mAPAGAR3 := 'X';
     if mCCLIENTE3=mTOMADOR then
         mPAGO4:= 'X';
     if mCCLIENTE4=mTOMADOR then
         mAPAGAR4:= 'X';

     mCALCULADO := ACBrCTe1.Conhecimentos.Items[0].CTE.ide.xMunFim;


     iQtdComps := ACBrCTe1.Conhecimentos.Items[0].CTE.infCTeNorm.infCarga.infQ.Count;
     iVarreComps:=0;
     while iVarreComps<iQtdComps do
     begin
       IF ACBrCTe1.Conhecimentos.Items[0].CTE.infCTeNorm.infCarga.infQ[iVarreComps].tpMed <> 'Kg' then
           xQTD_Converte       := ACBrCTe1.Conhecimentos.Items[0].CTE.infCTeNorm.infCarga.infQ[iVarreComps].qCarga;

       IF ACBrCTe1.Conhecimentos.Items[0].CTE.infCTeNorm.infCarga.infQ[iVarreComps].tpMed = 'Kg' then
           mCPESO       := ACBrCTe1.Conhecimentos.Items[0].CTE.infCTeNorm.infCarga.infQ[iVarreComps].qCarga;

       inc(iVarreComps);
     end;

     mQTD := Round(xQTD_Converte);

     mCVALOR    := ACBrCTe1.Conhecimentos.Items[0].CTE.infCTeNorm.infCarga.vCarga;
     mCNATUC    := ACBrCTe1.Conhecimentos.Items[0].CTE.infCTeNorm.infCarga.proPred;
     mCESPECIE  := ACBrCTe1.Conhecimentos.Items[0].CTE.infCTeNorm.infCarga.xOutCat;

     mCTOTAL    := ACBrCTe1.Conhecimentos.Items[0].CTE.vPrest.vTPrest;

     mProtoc    := ACBrCTe1.Conhecimentos.Items[0].CTE.procCTe.nProt;
     mNomeArq   := ACBrCTe1.Conhecimentos.Items[0].NomeArq;
     mChaveCTE  := ACBrCTe1.Conhecimentos.Items[0].CTE.procCTe.chCTe;
     mRECIBO    := ACBrCTe1.Conhecimentos.Items[0].CTE.procCTe.XML_prot; // será que é o recibo?
//     mChaveCTE  := RightStr(LeftSTR(mNomeArq,52),44);

     // componentes do frete

     iQtdComps := ACBrCTe1.Conhecimentos.Items[0].CTE.vPrest.Comp.Count;
     iVarreComps:=0;
     while iVarreComps<iQtdComps do
     begin
       with ACBrCTe1.Conhecimentos.Items[0].CTE.vPrest do
       begin

         if Comp.Items[iVarreComps].xNome='Frete Valor' then
            mFRTValor := Comp.Items[iVarreComps].vComp;

         if Comp.Items[iVarreComps].xNome='Frete Peso' then
            mFRTPeso := Comp.Items[iVarreComps].vComp;

         if Comp.Items[iVarreComps].xNome='Coleta' then
            mTARIFA := Comp.Items[iVarreComps].vComp;

         if Comp.Items[iVarreComps].xNome='Sec-Cat' then
            mTSECCAT := Comp.Items[iVarreComps].vComp;

         if Comp.Items[iVarreComps].xNome='Pedagio' then
            mPEDAGIO := Comp.Items[iVarreComps].vComp;

         if Comp.Items[iVarreComps].xNome='Despacho' then
            mTDESPACHO := Comp.Items[iVarreComps].vComp;

         if Comp.Items[iVarreComps].xNome='Outros Valores' then
            mCOUTROS := Comp.Items[iVarreComps].vComp;

         // incrementa
         inc(iVarreComps);
       end;

     end;

     // nota2
//     with infCTeNorm.infDoc.InfNFe.Add do
     iQtdComps := ACBrCTe1.Conhecimentos.Items[0].CTE.infCTeNorm.infDoc.infNFe.Count;
     iVarreComps:=0;
     while iVarreComps<iQtdComps do
     begin
       with ACBrCTe1.Conhecimentos.Items[0].CTE.infCTeNorm.infDoc do
       begin
         sChaveNFE := infNFe.Items[iVarreComps].chave;
         // vai lancando no nota2
         dm1.Nota2.Append;
         dm1.Nota2.FieldByName('CONHEC').AsString := mConhec;
         dm1.Nota2.FieldByName('FCODIGO').AsString:= IntToStr(spFCODIGO.Value); // verificar
         dm1.Nota2.FieldByName('COD_CTRC').AsString := mCONHEC+'51'; // verificar
         dm1.Nota2.FieldByName('NFE').AsString   := sChaveNFE;
         dm1.Nota2.FieldByName('NOTA2').AsString := copy(sChaveNfe,26,9);
         dm1.Nota2.FieldByName('SERIE').AsString := copy(sChaveNfe,23,3);
         dm1.Nota2.FieldByName('DATA2').AsDateTime  := mCDATA;
         dm1.Nota2.Commit;

         // incrementa
         inc(iVarreComps);
       end;

     end;
     dm1.Nota.Append;
     with dm1 do
     begin
        Nota.FieldByName('CONHEC').AsString       := mCONHEC;
        Nota.FieldByName('FCODIGO').AsString      := IntToStr(spFCODIGO.Value); // verificar
        Nota.FieldByName('COD_CTRC').AsString     := mConhec+IntToStr(spFCODIGO.Value);
        Nota.FieldByName('CDATA').AsDateTime      := mCDATA;
        Nota.FieldByName('CNATU').AsString        := mCNATU;
        Nota.FieldByName('CCLIENTE1').AsString    := mCCLIENTE1;
        Nota.FieldByName('CCLIENTE2').AsString    := mCCLIENTE2;
        Nota.FieldByName('CCLIENTE3').AsString    := mCCLIENTE3;
        Nota.FieldByName('CCLIENTE4').AsString    := mCCLIENTE4;

        Nota.FieldByName('PAGO3').AsString        := mPAGO3;
        Nota.FieldByName('APAGAR3').AsString      := mAPAGAR3;
        Nota.FieldByName('PAGO4').AsString        := mPAGO4;
        Nota.FieldByName('APAGAR4').AsString      := mAPAGAR4;

        Nota.FieldByName('CALCULADO').AsString    := mCALCULADO;
        Nota.FieldByName('CCOLETA').AsString      := mCCOLETA;
        Nota.FieldByName('COL_UF').AsString       := mCOL_UF;
        Nota.FieldByName('IBGE_COL').AsString     := mIBGE_COL;
        Nota.FieldByName('CENTREGA').AsString     := mCENTREGA;
        Nota.FieldByName('ENT_UF').AsString       := mENT_UF;
        Nota.FieldByName('IBGE_ENT').AsString     := mIBGE_ENT;


//        Nota.FieldByName('TSECCAT').AsFloat       := mTSECCAT;
        Nota.FieldByName('COUTROS').AsFloat       := mCOUTROS;
//        Nota.FieldByName('TDESPACHO').AsFloat     := mTDESPACHO;
        Nota.FieldByName('TARIFA').AsFloat        := mTARIFA;
//        Nota.FieldByName('FRTVALOR').AsFloat      := mFRTVALOR;
        Nota.FieldByName('QTD').AsFloat           := mQTD;
//        Nota.FieldByName('CPESO').AsFloat         := mCPESO;
        Nota.FieldByName('CTOTAL').AsFloat        := mCTOTAL;
        Nota.FieldByName('FRTPESO').AsFloat       := mFRTPESO;

        Nota.FieldByName('PROTOC').AsString       := mProtoc;
        Nota.FieldByName('ARQUIVO').AsString      := mNomeArq;
        Nota.FieldByName('CHAVECTE').AsString     := mChaveCTE;
        Nota.FieldByName('PEDAGIO').AsFloat       := mPEDAGIO;
        Nota.FieldByName('GLOBAL').AsString       := 'N'; // modificar este campo qdo for usar para outros clientes

        Nota.FieldByName('CVALOR').AsFloat        := mCVALOR;
        Nota.FieldByName('CNATUC').AsString       := mCNATUC;
        Nota.FieldByName('CESPECIE').AsString     := mCESPECIE;


     end;
     dm1.Nota.Commit;


   end;
end;
 

Postado

Obrigado a todos que responderam.

As informações ajudaram sim e muito. O cadastramento que eu precisava fazer já esta pronto e sendo testado.

Vai ajudar a funcionária do setor que estava dando entrada ''manual' nos Cte´s em média de 100 por dia.

Valeu pela força !

 

 

 

  • Curtir 1
  • Administradores
Postado

Obrigado por reportar.

Fechando. Para novas dúvidas, criar um novo tópico.

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 !!

  • Este tópico foi criado há 1339 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.