Ir para conteúdo
  • Cadastre-se

dev botao

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


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

Recommended Posts

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

Link para o comentário
Compartilhar em outros sites

  • Moderadores
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

 

 

Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

  • Moderadores
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

 

 

Link para o comentário
Compartilhar em outros sites

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