Bom dia a todos.
Tive o mesmo problema na leitura do XML.
O problema é que o TIPI.CST tem default ipi00.
property CST: TpcnCstIpi read FCST write FCST default ipi00;
Como a leitura do XML ignora quando não tem a tag IPI (Código abaixo), acaba ficando 00 para todos que não tem ela.
if Leitor.rExtrai(3, 'IPI') <> '' then
begin
(*O02*)NFe.Det[i].Imposto.IPI.clEnq := Leitor.rCampo(tcStr, 'clEnq');
(*O03*)NFe.Det[i].Imposto.IPI.CNPJProd := Leitor.rCampo(tcStr, 'CNPJProd');
(*O04*)NFe.Det[i].Imposto.IPI.cSelo := Leitor.rCampo(tcStr, 'cSelo');
(*O05*)NFe.Det[i].Imposto.IPI.qSelo := Leitor.rCampo(tcInt, 'qSelo');
(*O06*)NFe.Det[i].Imposto.IPI.cEnq := Leitor.rCampo(tcStr, 'cEnq');
// Inicializa CST com sendo Não tributada e conforme o TIPO entrada ou saida
// Caso a Tag não seja informada sera gravada com sendo não tributada
if NFe.ide.tpNF = tnEntrada then
NFe.Det[i].Imposto.IPI.CST := ipi53;
if NFe.ide.tpNF = tnSaida then
NFe.Det[i].Imposto.IPI.CST := ipi03;
if Leitor.rExtrai(3, 'IPITrib') <> '' then
begin
(*O09*)NFe.Det[i].Imposto.IPI.CST := StrToCSTIPI(ok, Leitor.rCampo(tcStr, 'CST'));
(*O10*)NFe.Det[i].Imposto.IPI.vBC := Leitor.rCampo(tcDe2, 'vBC');
(*O11*)NFe.Det[i].Imposto.IPI.qUnid := Leitor.rCampo(tcDe4, 'qUnid');
(*O12*)NFe.Det[i].Imposto.IPI.vUnid := Leitor.rCampo(tcDe4, 'vUnid');
(*O13*)NFe.Det[i].Imposto.IPI.pIPI := Leitor.rCampo(tcDe2, 'pIPI');
(*O14*)NFe.Det[i].Imposto.IPI.vIPI := Leitor.rCampo(tcDe2, 'vIPI');
end;
if Leitor.rExtrai(3, 'IPINT') <> '' then
begin
(*O09*)NFe.Det[i].Imposto.IPI.CST := StrToCSTIPI(ok, Leitor.rCampo(tcStr, 'CST'));
end;
end;
Não me parece o mais certo, ainda mais porque ele é "Entrada com recuperação de crédito".
Vejam que ele até seta valores padrões, mas só quando tem a tag IPI. (Errados a meu ver, pois em notas de entrada seta o 53 ("Saída Não-Tributada") e nas notas da saída seta o 03 ("Entrada Não-Tributada"). )
Então eu movi esse bloco para fora do IF setando um valor padrão sempre, independente se tem ou não a tag de IPI, e inverti os CST de entrada e saída.
// Inicializa CST com sendo Não tributada e conforme o TIPO entrada ou saida
// Caso a Tag não seja informada sera gravada com sendo não tributada
if NFe.ide.tpNF = tnEntrada then
NFe.Det[i].Imposto.IPI.CST := ipi03;
if NFe.ide.tpNF = tnSaida then
NFe.Det[i].Imposto.IPI.CST := ipi53;
if Leitor.rExtrai(3, 'IPI') <> '' then
begin
//Carrega os dados do IPI
end;
Pra mim resolveu!
Espero ter ajudado!