Ir para conteúdo
  • Cadastre-se

dev botao

Obter Cstat Xml De Inutilização


Ver Solução Respondido por Italo Giurizzato Junior,
  • Este tópico foi criado há 3994 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado (editado)

Pessoal não descobri como fazer para carregar um xml de Inutilização de numeração e obter o cstat

tentei até fazer uma gambiarra aqui mas não deu certo:

            Stream:=TStringStream.Create;
            Stream.Clear;
            TBlobField(dm.TblGedNfe.FieldByName('xml')).SaveToStream(Stream);
           //carrega o xml
            Inut:=TRetInutNFe.Create;
            inut.Leitor.Arquivo:= Stream.DataString;
            if Inut.LerXml then
              begin
                if Inut.cStat = 102 then Result:='NUM. INUTILIZADA'
                else Result:='DESCONHECIDA';
              end;
 
Retorna cstat=0
 
Acho que devido essa parte do fonte do acbr:
function TRetInutNFe.LerXml: boolean;
var
  ok: boolean;
begin
  Result := False;
  try
    if leitor.rExtrai(1, 'infInut') <> '' then //imagino que aqui deveria ser: if leitor.rExtrai(2, 'infInut')
    begin
      (*DR05 *)FtpAmb := StrToTpAmb(ok, Leitor.rCampo(tcStr, 'tpAmb'));
      (*DR06 *)FverAplic := Leitor.rCampo(tcStr, 'verAplic');
      (*DR07 *)FcStat := Leitor.rCampo(tcInt, 'cStat');
      (*DR08 *)FxMotivo := Leitor.rCampo(tcStr, 'xMotivo');
      (*DR09 *)FcUF := Leitor.rCampo(tcInt, 'cUF');
      (*DR10 *)Fano := Leitor.rCampo(tcInt, 'ano');
      (*DR11 *)FCNPJ := Leitor.rCampo(tcStr, 'CNPJ');
      (*DR12 *)FModelo := Leitor.rCampo(tcInt, 'mod');
      (*DR13 *)FSerie := Leitor.rCampo(tcInt, 'serie');
      (*DR14 *)FnNFIni := Leitor.rCampo(tcInt, 'nNFIni');
      (*DR15 *)FnNFFin := Leitor.rCampo(tcInt, 'nNFFin');
      (*DR16 *)FdhRecbto := Leitor.rCampo(tcDatHor, 'dhRecbto');
      (*DR17 *)FnProt := Leitor.rCampo(tcStr, 'nProt');
      Result := True;
    end;
  except
    result := False;
  end;
end;
 
Tem alguma maneira de fazer isso nativamente no componente
ou o caminho criar uma nova classe baseada na TRetInutNFe mesmo?
 

Segue em anexo xml

 

Grato pela atenção.

xml.xml

Editado por Delcio Sbeghen
  • Moderadores
Postado
É muito simples, segue exemplo completo:
 
Meu exemplo
ACBrNFe.WebServices.Inutiliza(cnpj, justificativa, ano, 55, serie, numero inicial, numero final);

if ACBrNFe.WebServices.Inutilizacao.cStat = 102 then
begin
  ACBrNFe.WebServices.Inutilizacao.cStat,             
  ACBrNFe.WebServices.Inutilizacao.xMotivo
  ACBrNFe.WebServices.Inutilizacao.Protocolo,
  ACBrNFe.WebServices.Inutilizacao.dhRecbto
end
else
  raise EDatabaseError.CreateFmt('Código:%d  Motivo: %s', [ACBrNFe.WebServices.Inutilizacao.cStat, ACBrNFe.WebServices.Inutilizacao.xMotivo]);

Exemplo retirado do demo do ACBrNFe:

procedure TForm1.btnInutilizarClick(Sender: TObject);
var
 Modelo, Serie, Ano, NumeroInicial, NumeroFinal, Justificativa : String;
begin
 if not(InputQuery('WebServices Inutilização ', 'Ano',    Ano)) then
    exit;
 if not(InputQuery('WebServices Inutilização ', 'Modelo', Modelo)) then
    exit;
 if not(InputQuery('WebServices Inutilização ', 'Serie',  Serie)) then
    exit;
 if not(InputQuery('WebServices Inutilização ', 'Número Inicial', NumeroInicial)) then
    exit;
 if not(InputQuery('WebServices Inutilização ', 'Número Inicial', NumeroFinal)) then
    exit;
 if not(InputQuery('WebServices Inutilização ', 'Justificativa', Justificativa)) then
    exit;
  ACBrNFe1.WebServices.Inutiliza(edtEmitCNPJ.Text, Justificativa, StrToInt(Ano), StrToInt(Modelo), StrToInt(Serie), StrToInt(NumeroInicial), StrToInt(NumeroFinal));
  MemoResp.Lines.Text :=  UTF8Encode(ACBrNFe1.WebServices.Inutilizacao.RetWS);
  memoRespWS.Lines.Text :=  UTF8Encode(ACBrNFe1.WebServices.Inutilizacao.RetornoWS);  
  LoadXML(MemoResp, WBResposta);


{  ACBrNFe1.WebServices.Inutilizacao.TpAmb
  ACBrNFe1.WebServices.Inutilizacao.verAplic
  ACBrNFe1.WebServices.Inutilizacao.cStat
  ACBrNFe1.WebServices.Inutilizacao.xMotivo
  ACBrNFe1.WebServices.Inutilizacao.cUF
  ACBrNFe1.WebServices.Inutilizacao.Ano
  ACBrNFe1.WebServices.Inutilizacao.CNPJ
  ACBrNFe1.WebServices.Inutilizacao.Modelo
  ACBrNFe1.WebServices.Inutilizacao.Serie
  ACBrNFe1.WebServices.Inutilizacao.NumeroInicial
  ACBrNFe1.WebServices.Inutilizacao.NumeroFinal
  ACBrNFe1.WebServices.Inutilizacao.dhRecbto
  ACBrNFe1.WebServices.Inutilizacao.Protocolo    }
end;

Equipe ACBr

Régys Borges da Silveira

http://www.regys.com.br

certificacao delphicertificacao delphi
Postado

Régys, Obrigado pela atenção, mas acho que não me expressei direito.

O cenário é o seguinte:

Tenho um sistema de gerenciamento eletrônico de documentos, nele existe uma tabela que armazena todos os xml importados pelo cliente,

só que esses xml estão misturados, nfe autorizadas, canceladas, inutilizações de numeração. Preciso ler cada um desses xml e apresentar dados em um dbgrid, como por ex: Tipo de Xml, status, etc.

Para isso carrego cada registro da tabela no acbrnfe e leio o cstat para poder saber se é Autorização, Cancelamento ou Inutilização. Para os xml de nfe autorizadas e canceladas, ele me retorna o cstat corretamente, mas quando carrego um xml de inutilização de numeração, ele me retorna cstat=0; 

A inutilização de numeração já foi processada, e tenho o xml dela, oque preciso é ler esse xml e obter o cstat.

  • Consultores
Postado

Bom dia Delcio,

 

Tenho uma aplicação que me permite carregar um XML salvo em disco e apresentar o seu Documento Auxiliar.

 

O XML pode ser de uma NF-e ou CTe ou NFS-e, como é feito a detecção ?

 

Veja este fragmento de código.

 

procedure TfrmEmissorDFE.CarregaArquivo;
var
 ArquivoXML: TStringList;
 Tamanho: Integer;
begin
 ArquivoXML := TStringList.Create;
 ArquivoXML.LoadFromFile(edtArquivo.Text);

 if pos('<infNFe', ArquivoXML.Text) > 0
  then TipoDFE := 1;
 if pos('<infCte', ArquivoXML.Text) > 0
  then TipoDFE := 2;
 if pos('InfNfse', ArquivoXML.Text) > 0
  then TipoDFE := 3;

 ArquivoXML.Free;

 

  (...)

end;

 

Uma outra solução seria implementar um LerXML / LerXMLFromString aos moldes do que foi feito para Eventos, unit pcnEnvEventoNFe.

 

Essa implementação seria feita na unit pcnInutNFe e uma pequena alteração na unit ACBrNFe.

 

A sua utilização seria bem simples no caso do evento é desta forma:

 

    ACBrNFe1.EventoNFe.LerXML(sFileName);

ou
    ACBrNFe1.EventoNFe.LerXMLFromString(sXML);
 

Fica ai a dica.

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

  • Consultores
  • Solution
Postado

Bom dia Régys,

 

Implementei para o CTe o LerXML e LerXMLFromString aos moldes do Evento.

 

Para realizar a leitura é desta forma:

 

    ACBrCTe1.InutCTe.LerXML(sFileName);

ou
    ACBrCTe1.InutCTe.LerXMLFromString(sXML);
 

Para obter os valores das tags em particular o Status:

 

Status :=  ACBrCTe1.InutCTe.InutCTe.cStat;
 

Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Isso aí pessoal imaginei que seria por aí mesmo, apenas queria ter certeza que não existisse já essa implementação no acbr.

As duas idéias foram bem vindas, vou utilizar as duas.

 

Depois de pronto posto o código aí caso alguém mais precise.

 

Por hora, obrigado pela atenção.

  • Consultores
Postado

Delcio,

 

A solução que postei logo acima, se refere a uma implementação que fiz no componente ACBrCTe agora de pouco e já encontra-se disponivel.

 

Não testei.

 

Podemos implementar aos mesmos moldes no componente ACBrNFe.

  • Curtir 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado (editado)

Pessoal, acabei criando uma classe herdada fora dos fontes ACBR, não gosto de alterar os fontes ACBR localmente, pois cada vez que baixo as atualizações deles, dá confusão, assim criei a seguinte classe:

 

unit UnitStatusInutNfe;
 
interface
 
uses classes, pcnRetInutNFe, pcnConversao;
 
 
type TStatusInutNfe = class(TRetInutNFe)
  public
    function LoadFromStream(Stream:Tstringstream): boolean;
end;
 
implementation
 
{ TStatusInutNfe }
 
function TStatusInutNfe.LoadFromStream(Stream:Tstringstream): boolean;
var
  ok: boolean;
begin
  Result := False;
  try
    //carrega o stream para o leitor acbr
    Leitor.Arquivo:= Stream.DataString;
 
    //lê os dados do leitor.arquivo e carrega no objeto
    if leitor.rExtrai(1, 'retInutNFe') <> '' then        //Basicamente aqui está a diferença: de infInut para retInutNFe pois os retornos conforme o anexo tem 2 tags infInut e ele só lia a primeira deixando o cstat que está na segunda como 0
    begin
      (*DR05 *)self.tpAmb := StrToTpAmb(ok, Leitor.rCampo(tcStr, 'tpAmb'));
      (*DR06 *)self.verAplic := Leitor.rCampo(tcStr, 'verAplic');
      (*DR07 *)self.cStat := Leitor.rCampo(tcInt, 'cStat');
      (*DR08 *)self.xMotivo := Leitor.rCampo(tcStr, 'xMotivo');
      (*DR09 *)self.cUF := Leitor.rCampo(tcInt, 'cUF');
      (*DR10 *)self.ano := Leitor.rCampo(tcInt, 'ano');
      (*DR11 *)self.CNPJ := Leitor.rCampo(tcStr, 'CNPJ');
      (*DR12 *)self.Modelo := Leitor.rCampo(tcInt, 'mod');
      (*DR13 *)self.Serie := Leitor.rCampo(tcInt, 'serie');
      (*DR14 *)self.nNFIni := Leitor.rCampo(tcInt, 'nNFIni');
      (*DR15 *)self.nNFFin := Leitor.rCampo(tcInt, 'nNFFin');
      (*DR16 *)self.dhRecbto := Leitor.rCampo(tcDatHor, 'dhRecbto');
      (*DR17 *)self.nProt := Leitor.rCampo(tcStr, 'nProt');
      Result := True;
    end;
  except
    result := False;
  end;
end;
 
end.
 
A minha função que verifica o XML ficou assim:
 
function TFrmGedNfe.VerificaStatusXml: string;
var
Inut:TStatusInutNfe;
Stream:TStringStream;
begin
  try
    //para nfe rejeitada
    if FrmFuncoes.nfe.NotasFiscais.Items[0].NFe.procNFe.cStat > 200 then
      begin
        Result:='NFE REJEITADA';
        exit;
      end;
   
   //para outros cstat
    case FrmFuncoes.nfe.NotasFiscais.Items[0].NFe.procNFe.cStat of
      100: Result:='AUTORIZADA';
      101: Result:='CANCELADA';
      102: Result:='NUM. INUTILIZADA';
           
                                   //caso o cstat retorne 0
      0:  begin               //testa se é xml de inutilização
            Stream:=TStringStream.Create;
            Stream.Clear;
            TBlobField(dm.TblGedNfe.FieldByName('xml')).SaveToStream(Stream);               //carrega o xml no stream
            Inut:=TStatusInutNfe.Create;
            if Inut.LoadFromStream(Stream) then                            //carrega e lê o xml a partir do Stream
              begin
                if Inut.cStat = 102 then Result:='NUM. INUTILIZADA'
                else if Inut.cStat > 200 then Result:='INUT. REJEITADA'
                else Result:='DESCONHECIDA';
              end;
            try FreeAndNil(Stream) except end;                    //depois de alguns problemas com
            try FreeAndNil(Inut) except end;                        //.free, passei a usar desta forma
                                                                                 //assim, se  o objeto por algum motivo não tiver sido criado, não me retorna
                                                                         //um AV e não preciso usar o assigned para testar se está instanciado.
          end;
    end;
  except
    Result:='DESCONHECIDA';
  end;
end;
 
Agora funcionando, estou fazendo uns testes para ver se está tudo ok.
Se alguém quiser adicionar o método TACBrNFe.InutNFe.LerXMLFromString(sXML);
vai facilitar a vida de outros que por ventura vierem a precisar
por hora vou utilizar desta forma.
 
Obrigado a todos.
 
 
Editado por Delcio Sbeghen
  • Consultores
Postado

Bom dia Régys,

 

Implementação feita e disponibilizada.

 

Delcio, se você puder testar fico agradecido.

 

Para a NF-e os comandos são identicos ao do CT-e.

 

Para realizar a leitura é desta forma:

 

    ACBrNFe1.InutNFe.LerXML(sFileName);

ou
    ACBrNFe1.InutNFe.LerXMLFromString(sXML);
 

Para obter os valores das tags em particular o Status:

 

Status :=  ACBrNFe1.InutNFe.InutNFe.cStat;

  • Curtir 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / Araraquara-SP

Araraquara - A era dos Trólebus

Postado

Italo, desculpe a demora, estava terminando outro módulo que estava atrasado...

 

Para xml's  de inutilização com assinatura, ele me retorna cstat=0,

teste no xml em anexo.

para que funcione tive que alterar a linha do leitor:

de  if leitor.rExtrai(1, ' infInut ') <> '' then para if leitor.rExtrai(1, 'retInutNFe') <> '' then 

aí me retorna cstat=102

 

acho que está lendo somente o primeiro bloco <InfInut, e o cstat está no segundo bloco, veja no anexo.

 

Grato pela disposição em implementar.

 

 

xml.xml

UnitStatusInutNfe.pas

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