Ir para conteúdo
  • Cadastre-se

dev botao

Ipi_Cst Retorna Ipi00 Mesmo Quando A Tag Não Existe No Xml


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

Recommended Posts

Saudações a todos:

 

Eu utilizo os componentes ACBR para NF-e, SPED entre outros e no meu banco de dados eu uso obter o Índice de algumas propriedades: algo como:

 

cdNF_ItemIPI_CST.Value := Integer(NFE1.NotasFiscais.Items[x].NFe.Det.Items.Imposto.IPI.CST); 

 

 

Assim, para o CST IPI = 49 eu gravo o índice 1 (ipi49).

 

O que ocorre é que quando o XML não possui a informação (exemplo abaixo) o componente retorna Imposto.IPI.CST

= ipi00 (indice 0);

 

Assim, eu não tenho como saber se o cst IPI é realmente ipi00 ou não existe no XML. 

 

18/05 - Melhorando o tópico:

 

Analisando os códigos percebi o seguinte:

Unit pcnNFeR -  function TNFeR.LerXml: boolean;

...

 

 

    if Leitor.rExtrai(3, 'IPI') <> '' then
    begin
      (*O02*)NFe.Det.Imposto.IPI.clEnq := Leitor.rCampo(tcStr, 'clEnq');
      (*O03*)NFe.Det.Imposto.IPI.CNPJProd := Leitor.rCampo(tcStr, 'CNPJProd');
      (*O04*)NFe.Det.Imposto.IPI.cSelo := Leitor.rCampo(tcStr, 'cSelo');
      (*O05*)NFe.Det.Imposto.IPI.qSelo := Leitor.rCampo(tcInt, 'qSelo');
      (*O06*)NFe.Det.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.Imposto.IPI.CST := ipi53;
      if NFe.ide.tpNF = tnSaida then
        NFe.Det.Imposto.IPI.CST := ipi03;

 

 

Este trecho resolve o problema. O que ocorre é que o valor default  da propriedade é ipi00. Se não existe a tag no XML a função <Leitor.rExtrai(3, 'IPI')> retorna '' e o código é pulado.

 

Creio que a resolução está em colocar a rotina acima antes do if:

 

 

 
    if NFe.ide.tpNF = tnEntrada then
        NFe.Det.Imposto.IPI.CST := ipi53;
    if NFe.ide.tpNF = tnSaida then
        NFe.Det.Imposto.IPI.CST := ipi03;

 

 

    if Leitor.rExtrai(3, 'IPI') <> '' then
    begin

...

 

Dessa forma, mesmo que não ocorra a tag no XML, a propriedade será corretamente setada.

 

Ocorre o mesmo com outras propriedades (PIS e COFINS ate onde eu vi).

 

Att,

 

Alfredo Koplin

 

Trecho do XML sem tag IPI:

 

<imposto>
<ICMS>

<ICMS40>

<orig>0</orig>

<CST>40</CST>
</ICMS40>
</ICMS>
<PIS>

<PISNT>

<CST>06</CST>
</PISNT>
</PIS>
<COFINS>

<COFINSNT>

<CST>06</CST>
</COFINSNT>
</COFINS>
</imposto>
Editado por koplin
Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...
  • 1 ano depois...
  • Moderadores

Olá, estou com o problema descrito no tópico, onde no XML não possui IPI, e mesmo assim o cst retorna ipi00.

Alguém tem alguma solução?

Bom dia!

Seja bem vindo ao fórum !

peço para que aproveite e faça a leitura das regras gerais do fórum!

 

lá descreve para postar em um local e aguardar! no caso esse é o segundo tópico que está postando o mesmo problema!

por favor tenha atenção a isso. obrigado

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

  • 10 meses depois ...

Estou com o mesmo problema com o ICMS. 

 

Quando empresa simples nacional ele apresenta 00 para o CST, contudo, não exite a TAG.

 

O que fiz foi verificar se a empresa era simples nacional ou não para então decidir qual campo pegar (CST ou CSOSN).

      if  CRTToStr(Emit.CRT)<>'3' then
        begin
            cds_produtoscsosn.AsString:= OrigToStr(det.Items.Imposto.ICMS.orig)+csosnICMSToStr(det.Items.Imposto.ICMS.CSosn);
        end
        else
        begin
              cds_produtoscst.AsString:=  OrigToStr(det.Items.Imposto.ICMS.orig)+cstICMSToStr(det.Items.Imposto.ICMS.cst);
        end;

 

Contudo, existe uma forma de identificar se o campo está ou não informado no XML?

Editado por Joao_Paulo
Link para o comentário
Compartilhar em outros sites

  • 2 anos depois...

Prezados, bom dia.

Sei que o tópico é antigo, mas eu estou tendo problemas com a importação de XML sem IPI.

Eu faço load do xml para o componente e depois extraio os dados dele [componente] para importar para minha base de dados. Quando IPI não é informado ele sempre vem ipi00. 

Já tem alguma coisa que resolva isso?

Obrigado.

 

NFiscal := ACBR_ImpXML.NotasFiscais.Items[0];
if NFiscal.NFe.Det[i].Imposto.IPI.CST in [ipi00, ipi01, ipi02, ipi03, ipi04, ipi05, ipi49, ipi50, ipi51, ipi52, ipi53, ipi54, ipi55, ipi99] then 

 

35170803386358000192550090000005201000005620-nfe.xml

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
  • 2 meses depois ...

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!

Link para o comentário
Compartilhar em outros sites

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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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...