Ir para conteúdo
  • Cadastre-se

Cte - Conhecimentos - LoadFromFile (XML)


Ver Solução Respondido por Italo Giurizzato Junior,
  • Este tópico foi criado há 1911 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
  • Consultores
Postado

Obrigado por reportar.

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

Consultora ACBr Pro

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á 1911 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.

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...