Ir para conteúdo
  • Cadastre-se

dev botao

NFE to SQL


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

Recommended Posts

  • Membros Pro

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.

Link para o comentário
Compartilhar em outros sites

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???)

Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

  • 2 anos depois...
  • 3 anos depois...
  • 2 meses depois ...

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.

Link para o comentário
Compartilhar em outros sites

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