Josafar Nascimento da Silv's post in Rejeição 685: total do valor dos tributos difere do somatório dos itens was marked as the answer
21 Setembro, 2018
O problema estava nas totalizações. Para resolver, criei algumas variáveis para os totalizadores. Abaixo, listo o código do detalhamento da nota, incluindo mais de um item.
// inclusão dos itens
DM.ACBrNFe.NotasFiscais[0].NFe.det.clear;
vnumitem:= 0;
if DM.cdsAux.Active = True then
DM.cdsAux.Close;
DM.cdsAux.CommandText := 'Select I.*, P.Id, P.Desc, P.CodBarra, P.Unid, P.NCM From TABITENSFAT I '+
'Left Join TABPRO P on I.CodPro = P.Id '+
'Where I.Id = '+#39+edtAlt.Text+#39+'Order by I.Id';
DM.cdsAux.Open;
while not DM.cdsAux.eof do
begin
inc(vnumitem);
with Det.Add do
begin
Prod.nItem := vnumitem;
Prod.cProd := DM.cdsAux.FieldByName('CodBarra').AsString; // ou... DM.cdsAux.FieldByName('CodPro').AsString;
Prod.cEAN := DM.cdsAux.FieldByName('CodBarra').AsString;
Prod.xProd := DM.cdsAux.FieldByName('Desc').AsString;
Prod.NCM := DM.cdsAux.FieldByName('NCM').AsString;
Prod.EXTIPI := '';
Prod.CFOP := DM.cdsAux.FieldByName('CFOP').AsString;
Prod.uCom := DM.cdsAux.FieldByName('Unid').AsString;
Prod.qCom := DM.cdsAux.FieldByName('Quant').AsFloat;
Prod.vUnCom:= DM.cdsAux.FieldByName('Preun').AsFloat;
Prod.vProd:= Prod.qCom * Prod.vUnCom;
vtotprod:= vtotprod + Prod.vProd;
Prod.vDesc:= DM.cdsAux.FieldByName('ValorDesc').AsFloat;
Prod.uTrib:= DM.cdsAux.FieldByName('Unid').AsString;
Prod.qTrib:= DM.cdsAux.FieldByName('Quant').AsFloat;
Prod.vUnTrib:= DM.cdsAux.FieldByName('Preun').AsFloat;
Prod.cEANTrib:= DM.cdsAux.FieldByName('CodBarra').AsString;
with Imposto do
begin
// ICMS
ICMS.orig := oenacional;
ICMS.CST := cst00;
ICMS.modBC := dbiValorOperacao;
ICMS.vBC:= DM.cdsAux.FieldByName('VlrLiq').AsFloat;
vtotbcicms:= vtotbcicms + ICMS.vBC;
ICMS.pICMS:= DM.cdsAux.FieldByName('PercIcms').AsFloat;
ICMS.vICMS:= (DM.cdsAux.FieldByName('VlrLiq').AsFloat * DM.cdsAux.FieldByName('PercIcms').AsFloat) / 100;
vtoticms:= vtoticms + ICMS.vICMS;
//Valor Aproximado dos Impostos IBPT
ACBrIBPTax1.AbrirTabela(ExtractFilePath(Application.ExeName)+
'tabela_ibpt\TabelaIBPTaxPE18.1.B.csv');
//Buscar NCM da mercadoria
ACBrIBPTax1.Procurar(DM.cdsAux.FieldByName('NCM').AsString,ex, descricao, tabela, aliqFedNac,
aliqFedImp, aliqEst, aliqMun, False);
//Campo NF-e valor aproximado dos impostos;
vTotTrib:= ((Prod.vProd - Prod.vDesc) * (aliqFedNac + aliqEst + aliqMun)) / 100;
vtotaltrib:= vtotaltrib + vtottrib;
end;
end;
DM.cdsAux.Next;
end;
DM.cdsAux.Close;
// totalização da nota fiscal
Total.ICMSTot.vNF := vvlrnf;
Total.ICMSTot.vBC := vtotbcicms;
Total.ICMSTot.vICMS := vtoticms;
Total.ICMSTot.vProd := vtotprod;
Total.ICMSTot.vTotTrib := vtotaltrib;