Ir para conteúdo
  • Cadastre-se

dev botao

Item '0' e vazio na NFe 4.0 [<det nItem="0">]


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

Recommended Posts

Postado

Eu depurei o código. É realizada apenas 1 chamada para Det.Add por item.

O mais estranho é que o código funciona normalmente, há muito tempo, para a versão 3.10. 

O problema se manifesta simplesmente alterando a propriedade VersaoDF do componente para ve400

  • Moderadores
Postado
15 minutos atrás, joedbat disse:

Eu depurei o código. É realizada apenas 1 chamada para Det.Add por item.

O mais estranho é que o código funciona normalmente, há muito tempo, para a versão 3.10. 

O problema se manifesta simplesmente alterando a propriedade VersaoDF do componente para ve400

Mostre o passo a passo pra simular o problema, usando o demo do ACBrNFe.

Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

Postado (editado)

Apesar de seguir a mesma lógica do exemplo do ACBrNFe, o código é diferente, pois aplica algumas regras de negócio específicas. Mas basicamente pega os dados de um dataset, preenchendo o componente, chamando o Det.Add, para cada registro

Segue abaixo o código utilizado, para a geração dos itens da NFe:

 

        dsCorpo.First;
        repeat
            with Det.Add do
            begin
                Prod.nItem := dsCorpo.FieldByName('nitem').AsInteger;
                Prod.cProd := dsCorpo.FieldByName('cprod').AsString;
        Prod.cEAN := dsCorpo.FieldByName('cean').AsString;
        Prod.cEANTrib := dsCorpo.FieldByName('cean').AsString;
                Prod.xProd := dsCorpo.FieldByName('xprod').AsString;

                Prod.NCM := dsCorpo.FieldByName('ncm').AsString;
        if dsCorpo.FindField('cest') <> Nil then
          Prod.CEST := dsCorpo.FieldByName('cest').AsString;
                Prod.CFOP := dsCorpo.FieldByName('cfop').AsString;
                // Se houver uma ocorrência de cfop de exportação, mudar a variavel
                if SubStr(Prod.CFOP, 1, 1) = '7' then
                    bExportacao := True;
                Prod.uCom := dsCorpo.FieldByName('ucom').AsString;
                Prod.uTrib := dsCorpo.FieldByName('ucom').AsString;
                Prod.qCom := dsCorpo.FieldByName('qcom').AsFloat;
                Prod.qTrib := dsCorpo.FieldByName('qcom').AsFloat;
                Prod.vUnCom := dsCorpo.FieldByName('vuncom').AsFloat;
                Prod.vUnTrib := dsCorpo.FieldByName('vuncom').AsFloat;
                Prod.vProd := dsCorpo.FieldByName('vprod').AsFloat;
        if not bForcarDestaqueFrete then
        begin
          if ((SubStr(Prod.CFOP, 1, 1) = '5') or (SubStr(Prod.CFOP, 1, 1) = '6')
            or (SubStr(Prod.CFOP, 1, 1) = '1')) then
          begin
            bDestacarFrete := False;
            bDestacarSeguro := False;
            Prod.vFrete := 0;
            Prod.vSeg := 0;
          end
          else
          begin
            if bDestacaFreteNFExp then
            begin
              Prod.vFrete := dsCorpo.FieldByName('vfrete').AsFloat;
              Prod.vSeg := dsCorpo.FieldByName('vseg').AsFloat;
            end
            else
            begin
              bDestacarFrete := False;
              bDestacarSeguro := False;
              Prod.vFrete := 0;
              Prod.vSeg := 0;
            end;
          end;
        end
        else
        begin
          Prod.vFrete := dsCorpo.FieldByName('vfrete').AsFloat;
          Prod.vSeg := dsCorpo.FieldByName('vseg').AsFloat;
        end;
                Prod.vDesc := dsCorpo.FieldByName('vdesc').AsFloat;
                Prod.vOutro := dsCorpo.FieldByName('voutro').AsFloat;

                if (dsCorpo.FindField('ndi') <> Nil) then
                    if (dsCorpo.FieldByName('ndi').AsString <> EmptyStr) then
                    begin
                        with Prod.DI.Add do
                        begin
                            nDi := dsCorpo.FieldByName('ndi').AsString;
                            dDi := dsCorpo.FieldByName('ddi').AsDateTime;
                            xLocDesemb := dsCorpo.FieldByName('xlocdesemb').AsString;
                            UFDesemb := dsCorpo.FieldByName('ufdesemb').AsString;
                            dDesemb := dsCorpo.FieldByName('ddesemb').AsDateTime;
                            cExportador := dsNF.FieldByName('docdestinatario').AsString;
                            // necessário, pois o campo dest_cnpjcpf fica em branco para clientes EX
              if (dsCorpo.FindField('nadicao') <> Nil) then
              begin
                with adi.Add do
                begin
                  nAdicao := dsCorpo.FieldByName('nadicao').AsInteger;
                  nSeqAdi := dsCorpo.FieldByName('nseqadic').AsInteger;
                  cFabricante := dsCorpo.FieldByName('cfabricante').AsString;
                  vDescDI := dsCorpo.FieldByName('vdescdi').AsFloat;
                  nDraw := dsCorpo.FieldByName('ndraw').AsString;
                end;
              end;
                        end;
                    end;
        if (dsCorpo.FindField('xped') <> Nil) then
          if (dsCorpo.FieldByName('xped').AsString <> EmptyStr) then
          begin
            Prod.xPed := dsCorpo.FieldByName('xped').AsString;
            Prod.nItemPed := dsCorpo.FieldByName('nitemped').AsString;
          end;
        if Assigned(cdsDetExp) then
        begin
          if not cdsDetExp.IsEmpty then
          begin
            cdsDetExp.First;
            repeat
              if cdsDetExp.FieldByName('item').AsString =
                dsCorpo.FieldByName('cprod').AsString then
              with Prod.detExport.Add do
              begin
                nDraw := cdsDetExp.FieldByName('ndraw').AsString;
                nRE := cdsDetExp.FieldByName('nre').AsString;
                chNFe := cdsDetExp.FieldByName('chnfe').AsString;
                qExport := cdsDetExp.FieldByName('qexport').AsFloat;
              end;
              cdsDetExp.Next;
            until(cdsDetExp.Eof);
          end;
        end;
                with Imposto do
                begin
                    ICMS.CST := StrToCSTICMS(bConv, dsCorpo.FieldByName('icms_cst').AsString);
                    ICMS.orig := StrToOrig(bConv, dsCorpo.FieldByName('icms_orig').AsString);
                    ICMS.modBC := StrTomodBC(bConv, dsCorpo.FieldByName('icms_modbc').AsString);
                    if dsCorpo.FieldByName('icms_vicms').AsFloat > 0 then
                    begin
                        ICMS.vBC := dsCorpo.FieldByName('icms_vbc').AsFloat;
                        ICMS.pRedBC := dsCorpo.FieldByName('icms_predbc').AsFloat;
                        ICMS.pICMS := dsCorpo.FieldByName('icms_picms').AsFloat;
                        ICMS.vICMS := dsCorpo.FieldByName('icms_vicms').AsFloat;
            if (dsCorpo.FindField('icms_pdif') <> Nil) then
            begin
              if dsCorpo.FindField('icms_pdif').AsFloat > 0 then
              begin
                ICMS.vICMSOp := dsCorpo.FieldByName('icms_vicms').AsFloat;
                ICMS.pDif := dsCorpo.FieldByName('icms_pdif').AsFloat;
                ICMS.vICMSDif := dsCorpo.FieldByName('icms_vicmsdif').AsFloat;
                ICMS.vICMS := ICMS.vICMSOp - ICMS.vICMSDif;
              end;
            end;
            if (ide.idDest = doInterestadual) and (Dest.indIEDest = inNaoContribuinte)
              and (ide.indFinal = cfConsumidorFinal) then
            begin
              if (dsCorpo.FindField('icmsufdest_picmsinter') <> Nil) then
              begin
                ICMSUFDest.vBCUFDest := dsCorpo.FieldByName('icms_vbc').AsFloat;
                ICMSUFDest.pFCPUFDest := dsCorpo.FieldByName('icmsufdest_pfcpufdest').AsFloat;
                ICMSUFDest.pICMSUFDest := dsCorpo.FieldByName('icmsufdest_picmsufdest').AsFloat;
                ICMSUFDest.pICMSInter := dsCorpo.FieldByName('icmsufdest_picmsinter').AsFloat;
                ICMSUFDest.pICMSInterPart := dsCorpo.FieldByName('icmsufdest_picmsinterpart').AsFloat;
                ICMSUFDest.vFCPUFDest := Usar2Dec((ICMSUFDest.vBCUFDest * ICMSUFDest.pFCPUFDest) / 100);
                vtmpICMSUFDest := Usar2Dec((ICMSUFDest.vBCUFDest * (ICMSUFDest.pICMSUFDest - ICMSUFDest.pICMSInter)) / 100);
                ICMSUFDest.vICMSUFDest := Usar2Dec((vtmpICMSUFDest * ICMSUFDest.pICMSInterPart) / 100);
                ICMSUFDest.vICMSUFRemet := Usar2Dec((vtmpICMSUFDest * (100 - ICMSUFDest.pICMSInterPart)) / 100);
                vTotFCPUFDest := vTotFCPUFDest + ICMSUFDest.vFCPUFDest;
                vTotICMSUFDest := vTotICMSUFDest + ICMSUFDest.vICMSUFDest;
                vTotICMSUFRemet := vTotICMSUFRemet + ICMSUFDest.vICMSUFRemet;
              end;
            end;

                    end;
                    IPI.CST := StrToCSTIPI(bConv, dsCorpo.FieldByName('ipi_cst').AsString);
                    if dsCorpo.FieldByName('ipi_pipi').AsFloat > 0 then
                    begin
                        IPI.vBC := dsCorpo.FieldByName('ipi_vbc').AsFloat;
                        IPI.pIPI := dsCorpo.FieldByName('ipi_pipi').AsFloat;
                        IPI.vIPI := dsCorpo.FieldByName('ipi_vipi').AsFloat;
                    end;
                    if (dsCorpo.FindField('icmsst_modbcst') <> Nil) then
                        if (dsCorpo.FieldByName('icmsst_vbcst').AsFloat > 0) then
                        begin
                            ICMS.modBCST := StrTomodBCST(bConv,
                                dsCorpo.FieldByName('icmsst_modbcst').AsString);
                            ICMS.vBCST := dsCorpo.FieldByName('icmsst_vbcst').AsFloat;
                            ICMS.pICMSST := dsCorpo.FieldByName('icmsst_picmsst').AsFloat;
                            ICMS.vICMSST := dsCorpo.FieldByName('icmsst_valicmsst').AsFloat;
                        end;
                    // Para o CFOP de importação, deve ser informado o II,
                    // independente da alíquota
                    if SubStr(Prod.CFOP, 1, 1) = '3' then
                    begin
                        II.vBC := dsCorpo.FieldByName('ii_vbc').AsFloat;
                        II.vDespAdu := dsCorpo.FieldByName('vdespadu').AsFloat;
                        II.vIOF := 0;
                        II.vII := dsCorpo.FieldByName('ii_vii').AsFloat;
                    end;

                    PIS.CST := StrToCSTPIS(bConv, dsCorpo.FieldByName('pis_cst')
                        .AsString);
                    PIS.vBC := dsCorpo.FieldByName('pis_vbc').AsFloat;
                    PIS.pPIS := dsCorpo.FieldByName('pis_ppis').AsFloat;
                    PIS.vPIS := dsCorpo.FieldByName('pis_vpis').AsFloat;
                    COFINS.CST := StrToCSTCOFINS(bConv, dsCorpo.FieldByName('cofins_cst')
                        .AsString);
                    COFINS.vBC := dsCorpo.FieldByName('cofins_vbc').AsFloat;
                    COFINS.pCOFINS := dsCorpo.FieldByName('cofins_pcofins').AsFloat;
                    COFINS.vCOFINS := dsCorpo.FieldByName('cofins_vcofins').AsFloat;
                end;
            end;
            dsCorpo.Next;
        until (dsCorpo.Eof);
 

Editado por joedbat
  • Moderadores
Postado
19 minutos atrás, joedbat disse:

Apesar de seguir a mesma lógica do exemplo do ACBrNFe, o código é diferente, pois aplica algumas regras de negócio específicas. Mas basicamente pega os dados de um dataset, preenchendo o componente, chamando o Det.Add, para cada registro

Segue abaixo o código utilizado, para a geração dos itens da NFe:

Por esse trecho de código não é possível identificar o problema. Com certeza não estará dentro do loop de itens senão haveria um item em branco pra cada item da nota, o que pelo seu XML, não é o caso.

Você tentou simular o problema usando o demo do ACBrNFe?

Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

Postado

Encontrei o problema.  Fora do loop de itens, havia uma chamada a Det.Add (nos detalhes de pgto).

Obrigado por sua disposição em ajudar.

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