Ir para conteúdo
  • Cadastre-se

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

Recommended Posts

  • Membro Pro Verificado
Postado

Estou desenvolvendo uma solução para ler o xml de nf de entrada e gravar, campo a campo, em um banco de dados.

Alguem ja fez ou viu isso?

abs,

Elton

  • Membro Pro Verificado
Postado

se tiver pressa, estude o Demo do ACBR NFe que já tem a parte que lê o XML.. mas se quer reinventar a roda... boa sorte!

eu nao tenho a meno intensao de reinventar nada, mas nao estou conseguindo resolver isso.

estou fazendo em xHarbour, ja leio o xml todo, mas estou com dificuldades para ler as tags com varias linhas, tais como DET, IMPOSTOS, COBRANCA, etc.

Eu nao conheco este demo, mas acredito que esteja em Delphi e ai nao vai me ajudar muito.

Briguei um monte com uma classe chamada XmlDocument, mas ela nao 'sabe' em que nivel do xml e esta e ai nao consigo resolver. Tem uma TXmlNode mas nao consigo usar nem a pau.

quem puder me ajudar, sera muito bem vindo.

ps. estamos dispostos a reembolsar pela consultoria/programa pronto. basicamente o que preciso eh gravar em tabelas (sql ou dbf) o conteudo de uma nfe.

Postado

nao conheco xHarbour, mas acredito que vc esteja usando o monitor ne?

tem 2 saidas no meu ponto de vista:

1- vc pode ler o xml como txt e pegar os valores que estao entre as tags. Qdo tiver essas tags repetidas, uma ideia é ir deletando o que vc ja leu, dai vc faz um for/while até existir a tag. (com ctz faça uma copia do xml antes)

2- vc pode instalar o delphi, e acrescentar uma rotina sua mesmo no monitor (nao é tão dificil), dai vc faz um comando pro monitor ler um arquivo XML e te devolver um arquivo INI (alias ja nao tem algo assim???)

Postado

sim, só que eu utilizo o XMLDocument para isso...

Como vc resolveu os niveis, tag det, impostos, etc?

Desenvolvi tudo em delphi...

Não sei se ajuda, mas de qualquer forma segue abaixo:

var

NodeInfNfe,NodeIde,NodEmi,NodeEnderEmit,NodeCobr,NodeDup: IXMLNode;

vXMLDoc: TXMLDocument;

sIDForn: String;

begin

//-- abre arquivo xml

FComercio.OpenDialog1.DefaultExt := 'xml';

FComercio.OpenDialog1.Filter := 'Documentos XML (*.xml)|*.xml';

FComercio.OpenDialog1.InitialDir := '%USERPROFILE%\Desktop\';

FComercio.OpenDialog1.Execute;

if empty( FComercio.OpenDialog1.FileName ) then Abort;

try

//-- cria componente

vXMLDoc := TXMLDocument.Create(Self);

//-- atribui arquivo ao componente

vXMLDoc.LoadFromFile(FComercio.OpenDialog1.FileName);

//-- começa a ler o arquivo xml

NodeInfNfe := vXMLDoc.DocumentElement.childNodes.First.ChildNodes.FindNode('infNFe');

//-- pega valores da ide da nfe

NodeIde := NodeInfNfe.ChildNodes.FindNode('ide');

NodeIde.ChildNodes.First;

//-- pega dados do emitente

NodEmi := NodeInfNfe.ChildNodes.FindNode('emit');

NodEmi.ChildNodes.First;

//-- pega endereco emitente

NodeEnderEmit := NodEmi.ChildNodes.FindNode('enderEmit');

NodeEnderEmit.ChildNodes.First;

if sn('Confirma inclusão da NF-e no Contas a Pagar?') = 'N' then Abort;

//-- pega valores de cobrança

NodeCobr := NodeInfNfe.ChildNodes.FindNode('cobr');

NodeCobr.ChildNodes.First;

//-- pega duplicata

NodeDup := NodeCobr.ChildNodes['dup'];

NodeDup.ChildNodes.First;

//-- consulta o fornecedor

with QConsForn do

begin

Close;

SQL.Clear;

SQL.Add(' SELECT idfornecedor,nome,cgc ');

SQL.Add(' FROM fornecedores ');

SQL.Add(' WHERE cgc = '+aspas(colocacgccpf(NodEmi.ChildNodes['CNPJ'].Text)));

Open;

end;

sIDForn := QConsFornIDFornecedor.AsString;

if empty( QConsFornCGC.AsString ) then

begin

//-- inclui fornecedor

Alert('Atenção... Fornecedor não Cadastrado!','!');

if sn('Cadastrar Fornecedor?') = 'N' then Abort;

{ implementado nesse caso em 25.07.2012 }

AbreParametros;

//-- salva número do fornecedor em parametros

dm.TBParametros.Edit;

dm.TBParametrosCodFornecedor.AsInteger := ( dm.TBParametrosCodFornecedor.AsInteger + 1 );

dm.TBParametros.Post;

//-- busca estado

with CQUF do

begin

Close;

SQL.Clear;

SQL.Add(' SELECT iduf,sigla ');

SQL.Add(' FROM estados ');

SQL.Add(' WHERE sigla = '+QuotedStr(NodeEnderEmit.ChildNodes['UF'].Text));

Open;

end;

//-- insere dados coletados do xml

with dm.qpadrao do

begin

Close;

SQL.Clear;

SQL.Add(' INSERT INTO fornecedores (idfornecedor,tipofornecedor, ');

SQL.Add(' nome,endereco,cep,cidade,cgc,ie,telefone,uf,datainicial, ');

SQL.Add(' bairro,nomefantasia,codmunnfe,numero) ');

SQL.Add(' VALUES ('+aspas(Colzers(dm.TBParametrosCodFornecedor.AsString,5)));

SQL.Add(' ,'+aspas('1')+', '+aspas(UPPERCASE(onlycharscomespaco(semacento(NodEmi.ChildNodes['xNome'].Text))))+', ');

SQL.Add(' '+aspas(UPPERCASE(NodeEnderEmit.ChildNodes['xLgr'].Text))+', ');

SQL.Add(' '+aspas(NodeEnderEmit.ChildNodes['CEP'].Text)+', ');

SQL.Add(' '+aspas(UPPERCASE(NodeEnderEmit.ChildNodes['xMun'].Text))+', ');

SQL.Add(' '+aspas(colocacgccpf(NodEmi.ChildNodes['CNPJ'].Text))+', ');

SQL.Add(' '+aspas(NodEmi.ChildNodes['IE'].Text)+', ');

SQL.Add(' '+aspas(NodeEnderEmit.ChildNodes['fone'].Text)+', ');

SQL.Add(' '+aspas(CQUFiduf.AsString)+', ');

SQL.Add(' CURRENT_DATE, ');

SQL.Add(' '+aspas(UPPERCASE(NodeEnderEmit.ChildNodes['xBairro'].Text))+', ');

SQL.Add(' '+aspas(UPPERCASE(onlycharscomespaco(semacento(NodEmi.ChildNodes['xFant'].Text))))+', ');

SQL.Add(' '+aspas(NodeEnderEmit.ChildNodes['cMun'].Text)+', ');

SQL.Add(' '+aspas(NodeEnderEmit.ChildNodes['nro'].Text)+' ) ');

ExecSQL;

ApplyUpdates;

end;

{ abre cadastro de fornecedores }

FCadFornecedores := (TestaForm(TFCadFornecedores,Self) as TFCadFornecedores);

FComercio.FechaCad := True;

//-- tratar erro na atualização das querys

DSContasPagar.Enabled := False;

//-- edita

FCadFornecedores.BitBtn2Click(Sender);

//-- trava a procedure até cadastrar o fornecedor

while ( FComercio.FechaCad = True ) do

begin

Application.ProcessMessages;

end;

end;

//-- consulta o fornecedor

with QConsForn do

begin

Close;

SQL.Clear;

SQL.Add(' SELECT idfornecedor,nome,cgc ');

SQL.Add(' FROM fornecedores ');

SQL.Add(' WHERE cgc = '+aspas(colocacgccpf(NodEmi.ChildNodes['CNPJ'].Text)));

Open;

end;

sIDForn := QConsFornIDFornecedor.AsString;

//-- loop p/ pegar duplicatas

repeat

//-- começa inclusão

QContasPagar.Append;

QContasPagarNumeroDocumento.Value := NodeDup.ChildNodes['nDup'].Text;

QContasPagarTipo.Value := '1';

QContasPagarNotaFiscal.Value := NodeIde.ChildNodes['nNF'].Text;

QContasPagarFornecedor.Value := sIDForn;

QContasPagarDocumentoOriginal.Value := NodeDup.ChildNodes['nDup'].Text;

QContasPagarEmissao.AsString := AcertaData(NodeIde.ChildNodes['dEmi'].Text);

if empty(bancoXML) then

begin

//-- atribui qual tela

FComercio.IdentTela := 4;

//-- procura banco

FProcuraBanco := (TestaForm(TFProcuraBanco,Self) as TFProcuraBanco);

FComercio.FechaCad := True;

//-- trava a procedure até cadastrar o fornecedor

while FComercio.FechaCad = True do

begin

Application.ProcessMessages;

end;

end;

QContasPagarBancoCobranca.Value := bancoXML;

QContasPagarValorDuplicata.AsString := PontoPorVirgula(NodeDup.ChildNodes['vDup'].Text);

QContasPagarDataVencimento.AsString := AcertaData(NodeDup.ChildNodes['dVenc'].Text);

QContasPagarDigitacao.Value := (now);

QContasPagarUsuario.Value := FComercio.XUsuario.Text;

QContasPagarOrigem.Value := 'XML';

QContasPagarValorOriginal.AsString := PontoPorVirgula(NodeDup.ChildNodes['vDup'].Text);

QContasPagar.Post;

//-- vai p/ próxima duplicata

NodeDup := NodeDup.NextSibling;

//-- até zerar

until NodeDup = nil;

{ qualquer erro na importação, retorna (31.07.2012) }

except

Alert('Erro no XML, não foi possível fazer a importação!','!');

Abort;

end;

DSContasPagar.Enabled := True;

//-- atualiza form

Self.FormShow(Sender);

  • Curtir 1
  • 2 anos depois...
Postado

Qual é o banco de dados? se for SQL Server tenho a rotina completa (ou quase) para NFe e CTe

 

Mark, você poderia disponibilizar a rotina em SQL?

 

Abraços

  • 3 anos depois...
Postado
Em 20/09/2012 at 14:03, Mark Apollo disse:

Qual é o banco de dados? se for SQL Server tenho a rotina completa (ou quase) para NFe e CTe

Pode me conseguir a rotina ?

  • 2 meses depois ...
Postado

Pessoal, tudo bem??

Desculpem minha ausência, minha realidade mudou muito, já tem uns 4 anos que não estou no projeto mais, portanto não tenho as rotinas.

 

Mas basicamente o que fiz foi salvar o conteudo do xml em um campo do tipo "XML" no sql server. Lembrando que fiz com c# e/ou diretamente no SQL Server.

 

Até mais!

  • Curtir 1

- Sou desenvolvedor.

- De que linguagem, delphi? .NET? Java?

- Qualquer uma, sou desenvolvedor.

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

The popup will be closed in 10 segundos...
The popup will be closed in 10 segundos...