Ir para conteúdo
  • Cadastre-se

dev botao

NFe - Método LoadFromFile capturar tags do XML


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

Recommended Posts

Boa noite pessoal!

Estou usando o Acbr para carregar um XML de NFe, e posteriormente, trabalhar com os dados dentro do sistema.

Para isso, utilizo o método ACBrNFeXML.NotasFiscais.LoadFromFile, que me permite acessar todos os valores das tags deste xml...

Dentro do bloco Ide, por exemplo, obtenho os valores...

QryRecebeXML.FieldByName('CUF').AsInteger := cUF;
QryRecebeXML.FieldByName('CNF').AsInteger := cNF;
QryRecebeXML.FieldByName('NATOP').AsString := natOp;

desta maneira, relaciono cada tag e faço a inserção no meu banco de dados...

Existe alguma forma de fazer algo dinâmico, por exemplo, algum laço para que pudesse passar por todas as tags de Ide sem ter que relacionar uma a uma?

Não sei se consegui expressar corretamente minha dúvida...

Desde já agradeço...

Link para o comentário
Compartilhar em outros sites

Boa noite! Obrigada Juliomar

Vou mostrar aqui pra vocês o método encontrado...

procedure TFrmLeituraXML.getPropList(Classe: TClass);
var T: TRttiType;
    P: TRttiProperty;
    Ctx: TRttiContext;
begin
  Ctx := TRttiContext.Create;
  Memo1.Lines.Clear;

  T := Ctx.GetType(Classe);
  for P in T.GetDeclaredProperties do
    Memo1.Lines.Add(P.Name);
end;

Para Chamar a procedure em um botão por exemplo: getPropList(pcnNFe.TIde);

Obs: declarar System.RTTI e pcnNFe

 

Agora estou pesquisando como buscar os valores...

Encontrei este método:

ctxRtti  := TRttiContext.Create;
typeRtti := ctxRtti.GetType( pcnNFe.TIde. ClassType );

for propRtti in typeRtti.GetProperties do
  Memo1.Lines.Add(propRtti.Name+':'+ propRtti.PropertyType.ToString +'='+ propRtti.GetValue(pcnNFe.TIde).ToString);

ctxRtti.Free;

 

porém acusa o seguinte erro: 

This form of method call only allowed for class methods or constructor

Alguém sabe a causa? 

Link para o comentário
Compartilhar em outros sites

Olá!

Consegui fazendo o seguinte:

Declarei as seguintes variáveis:

EmitXML      : TEmit;

ctxRtti  : TRttiContext;
typeRtti : TRttiType;
propRtti : TRttiProperty;

 

e depois do método LoadFromFile:

for J := 0 to ACBrNFeXML.NotasFiscais.Count - 1 do

begin

with ACBrNFeXML.NotasFiscais.Items[J].NFe.Ide do

begin

          with ACBrNFeXML.NotasFiscais.Items[J].NFe.Emit do
          begin
            EmitXML := TEmit.Create;
            typeRtti := ctxRtti.GetType(EmitXML.ClassType);
            EmitXML := ACBrNFeXML.NotasFiscais.Items[J].NFe.Emit;
            for propRtti in typeRtti.GetProperties do
              ShowMessage(propRtti.GetValue(EmitXML).ToString);
          end;

end;

end;

 

Obrigada!

 

 

 

 

 

 

 

 

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

  • Administradores

Obrigado por reportar.

Fechando. Para novas dúvidas, criar um novo tópico.

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link para o comentário
Compartilhar em outros sites

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