Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-03-2017
jourdan jourdan is offline
Miembro
 
Registrado: may 2003
Ubicación: Mexico
Posts: 151
Poder: 21
jourdan Va por buen camino
leer nodo tfd de un cfdi xml

Hola a todos, alguien sabe como puedo leer el nodo tfd de un comprobante fiscal digital de México.
Lo que estoy buscando es obtener el valor UUID que esta en ese nodo.
Ya logre leer los demas valores del archivo xml usando xml data binding y un documento xmldocument pero no logro accesar el nodo tfd en particular

Ejemplo del nodo:

<tfd:TimbreFiscalDigital xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" FechaTimbrado="2017-03-01T14:00:38" UUID="BD9FF401-FXB9-11E6-8B61-00166D014007" noCertificadoSAT="00001000000403557578" selloSAT="XK/wZ07qqTewD+2/eWO/p8S/RIkpRdmxWL/z+T71KPgdMtBg9vGDLDF7nkRVOzWcS+XAYhvpk1FD2nOxr+/5XgijTKNbArvoW/JroP6nsGrj4kndNe1wh+pv9iQVHXInob7DLPw03KEMWPjTEm2Oa/e4e5l0BPKNrdwBMYY3LT4AcOuU30ilF7Q5fPiFYt0JSVx0CS/h3JtzhLthuttUrjiEKnGQqs5Sh8jKfsDVjnfxMFZDeFWp+5TtV7+F9o6Z+iYpcBGNUVFc/IZ3+/JMUmCp7uSZj5po5Zs0aQN+kmzft3m6TiiUQEvL3+vKWCUhzb6SoA0vxsdroCrclAbWL4Hg==" selloCFD="VQWrJlCa5u96NfNgHmImrz2eIGWXr/TD8KJDC3aH/IRH0JnrGA1XAsQre1spHH9NfxJe9QkVXk6JX2wwE8iLcG4YPz/nxC2mO8mU8IC+J5Wk/QzhoQhNTB0iGepOx8l5sQRYZPpaHjfI0xy3cpxBuW0qAvBy3bRiuQG5Vgri6hc=" version="1.0" xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/TimbreFiscalDigital/TimbreFiscalDigital.xsd"/>

De antemano muchas gracias y saludos
__________________
Alejandro Jourdan
Responder Con Cita
  #2  
Antiguo 08-03-2017
tmsanchez tmsanchez is offline
Miembro
 
Registrado: abr 2004
Ubicación: Mexico
Posts: 67
Poder: 21
tmsanchez Va por buen camino
Que tal.

Probablemente esto te sirva:

Código Delphi [-]
procedure TfrmPrincipal.generaPdf(archivo: String);
var
    recibo: IXMLComprobante;
    timbreFiscal: IXMLTimbreFiscalDigital;
    XMLDocument1: TXMLDocument;  
begin
  // cargar el comprogante a partir del nombre del archivo
  recibo := LoadComprobante(archivo);

  // obtener el nodo del timbre fiscal
  XMLDocument1.Xml.Text := recibo.Complemento.ChildNodes.FindNode('tfd:TimbreFiscalDigital', '').Xml;
  XMLDocument1.Active := True;
  timbreFiscal := GetTimbreFiscalDigital(XMLDocument1);

  showMessage(timbreFiscal.UUID);
end;
Responder Con Cita
  #3  
Antiguo 08-03-2017
jourdan jourdan is offline
Miembro
 
Registrado: may 2003
Ubicación: Mexico
Posts: 151
Poder: 21
jourdan Va por buen camino
Hola, es exactamente lo que estoy buscando peor no logre que funcionara el código.

La variable IXMLTimbreFiscalDigital no la reconoce!

Hay alguna otra unidad que hay que registrar?

Muchas gracias por tu ayuda
__________________
Alejandro Jourdan
Responder Con Cita
  #4  
Antiguo 08-03-2017
tmsanchez tmsanchez is offline
Miembro
 
Registrado: abr 2004
Ubicación: Mexico
Posts: 67
Poder: 21
tmsanchez Va por buen camino
Te paso el código de la unidad TimbreFiscalDigital:

Código Delphi [-]

{**********************************************************************************************}
{                                                                                              }
{                                       XML Data Binding                                       }
{                                                                                              }
{         Generated on: 24/04/2014 11:29:42 p.m.                                               }
{       Generated from: CFDI3.2\TimbreFiscalDigital.xsd   }
{                                                                                              }
{**********************************************************************************************}

unit TimbreFiscalDigital;

interface

uses xmldom, XMLDoc, XMLIntf;

type

{ Forward Decls }

  IXMLTimbreFiscalDigital = interface;

{ IXMLTimbreFiscalDigital }

  IXMLTimbreFiscalDigital = interface(IXMLNode)
    ['{366D5D21-F94B-4BCB-9724-A79988C03709}']
    { Property Accessors }
    function Get_Version: UnicodeString;
    function Get_UUID: UnicodeString;
    function Get_FechaTimbrado: UnicodeString;
    function Get_SelloCFD: UnicodeString;
    function Get_NoCertificadoSAT: UnicodeString;
    function Get_SelloSAT: UnicodeString;
    procedure Set_Version(Value: UnicodeString);
    procedure Set_UUID(Value: UnicodeString);
    procedure Set_FechaTimbrado(Value: UnicodeString);
    procedure Set_SelloCFD(Value: UnicodeString);
    procedure Set_NoCertificadoSAT(Value: UnicodeString);
    procedure Set_SelloSAT(Value: UnicodeString);
    { Methods & Properties }
    property Version: UnicodeString read Get_Version write Set_Version;
    property UUID: UnicodeString read Get_UUID write Set_UUID;
    property FechaTimbrado: UnicodeString read Get_FechaTimbrado write Set_FechaTimbrado;
    property SelloCFD: UnicodeString read Get_SelloCFD write Set_SelloCFD;
    property NoCertificadoSAT: UnicodeString read Get_NoCertificadoSAT write Set_NoCertificadoSAT;
    property SelloSAT: UnicodeString read Get_SelloSAT write Set_SelloSAT;
  end;

{ Forward Decls }

  TXMLTimbreFiscalDigital = class;

{ TXMLTimbreFiscalDigital }

  TXMLTimbreFiscalDigital = class(TXMLNode, IXMLTimbreFiscalDigital)
  protected
    { IXMLTimbreFiscalDigital }
    function Get_Version: UnicodeString;
    function Get_UUID: UnicodeString;
    function Get_FechaTimbrado: UnicodeString;
    function Get_SelloCFD: UnicodeString;
    function Get_NoCertificadoSAT: UnicodeString;
    function Get_SelloSAT: UnicodeString;
    procedure Set_Version(Value: UnicodeString);
    procedure Set_UUID(Value: UnicodeString);
    procedure Set_FechaTimbrado(Value: UnicodeString);
    procedure Set_SelloCFD(Value: UnicodeString);
    procedure Set_NoCertificadoSAT(Value: UnicodeString);
    procedure Set_SelloSAT(Value: UnicodeString);
  end;

{ Global Functions }

function GetTimbreFiscalDigital(Doc: IXMLDocument): IXMLTimbreFiscalDigital;
function LoadTimbreFiscalDigital(const FileName: string): IXMLTimbreFiscalDigital;
function NewTimbreFiscalDigital: IXMLTimbreFiscalDigital;

const
  TargetNamespace = 'http://www.sat.gob.mx/TimbreFiscalDigital';

implementation

{ Global Functions }

function GetTimbreFiscalDigital(Doc: IXMLDocument): IXMLTimbreFiscalDigital;
begin
  Result := Doc.GetDocBinding('TimbreFiscalDigital', TXMLTimbreFiscalDigital, TargetNamespace) as IXMLTimbreFiscalDigital;
end;

function LoadTimbreFiscalDigital(const FileName: string): IXMLTimbreFiscalDigital;
begin
  Result := LoadXMLDocument(FileName).GetDocBinding('TimbreFiscalDigital', TXMLTimbreFiscalDigital, TargetNamespace) as IXMLTimbreFiscalDigital;
end;

function NewTimbreFiscalDigital: IXMLTimbreFiscalDigital;
begin
  Result := NewXMLDocument.GetDocBinding('TimbreFiscalDigital', TXMLTimbreFiscalDigital, TargetNamespace) as IXMLTimbreFiscalDigital;
end;

{ TXMLTimbreFiscalDigital }

function TXMLTimbreFiscalDigital.Get_Version: UnicodeString;
begin
  Result := AttributeNodes['version'].Text;
end;

procedure TXMLTimbreFiscalDigital.Set_Version(Value: UnicodeString);
begin
  SetAttribute('version', Value);
end;

function TXMLTimbreFiscalDigital.Get_UUID: UnicodeString;
begin
  Result := AttributeNodes['UUID'].Text;
end;

procedure TXMLTimbreFiscalDigital.Set_UUID(Value: UnicodeString);
begin
  SetAttribute('UUID', Value);
end;

function TXMLTimbreFiscalDigital.Get_FechaTimbrado: UnicodeString;
begin
  Result := AttributeNodes['FechaTimbrado'].Text;
end;

procedure TXMLTimbreFiscalDigital.Set_FechaTimbrado(Value: UnicodeString);
begin
  SetAttribute('FechaTimbrado', Value);
end;

function TXMLTimbreFiscalDigital.Get_SelloCFD: UnicodeString;
begin
  Result := AttributeNodes['selloCFD'].Text;
end;

procedure TXMLTimbreFiscalDigital.Set_SelloCFD(Value: UnicodeString);
begin
  SetAttribute('selloCFD', Value);
end;

function TXMLTimbreFiscalDigital.Get_NoCertificadoSAT: UnicodeString;
begin
  Result := AttributeNodes['noCertificadoSAT'].Text;
end;

procedure TXMLTimbreFiscalDigital.Set_NoCertificadoSAT(Value: UnicodeString);
begin
  SetAttribute('noCertificadoSAT', Value);
end;

function TXMLTimbreFiscalDigital.Get_SelloSAT: UnicodeString;
begin
  Result := AttributeNodes['selloSAT'].Text;
end;

procedure TXMLTimbreFiscalDigital.Set_SelloSAT(Value: UnicodeString);
begin
  SetAttribute('selloSAT', Value);
end;

end.
Responder Con Cita
  #5  
Antiguo 08-03-2017
jourdan jourdan is offline
Miembro
 
Registrado: may 2003
Ubicación: Mexico
Posts: 151
Poder: 21
jourdan Va por buen camino
Muchisimas gracias, me pongo a hacer pruebas inmediatamente!
Saludos
__________________
Alejandro Jourdan
Responder Con Cita
  #6  
Antiguo 09-03-2017
tmsanchez tmsanchez is offline
Miembro
 
Registrado: abr 2004
Ubicación: Mexico
Posts: 67
Poder: 21
tmsanchez Va por buen camino
Cita:
Empezado por jourdan Ver Mensaje
Muchisimas gracias, me pongo a hacer pruebas inmediatamente!
Saludos
Excelente, espero que el código te sea de ayuda.
Responder Con Cita
  #7  
Antiguo 09-03-2017
jourdan jourdan is offline
Miembro
 
Registrado: may 2003
Ubicación: Mexico
Posts: 151
Poder: 21
jourdan Va por buen camino
Sigo sin lograr leer el UUID, me sale el siguiente error:

---------------------------
Debugger Exception Notification
---------------------------
Project Sube_xml.exe raised exception class EAccessViolation with message 'Access violation at address 004056F1 in module 'Sube_xml.exe'. Read of address C35B5E01'.
---------------------------

Algún otro norte que me puedas dar

Muchas gracias y saludos
__________________
Alejandro Jourdan
Responder Con Cita
  #8  
Antiguo 10-03-2017
tmsanchez tmsanchez is offline
Miembro
 
Registrado: abr 2004
Ubicación: Mexico
Posts: 67
Poder: 21
tmsanchez Va por buen camino
Hola, solo falta crear la instancia del objeto XMLDocument1 o simplemente agrega a tu formulario un componente TXMLDocument de la paleta Intenet (comentas la línea donde se define la variable XMLDocument1 )
// XMLDocument1: TXMLDocument;
Código Delphi [-]
procedure TfrmPrincipal.generaPdf(archivo: String); var     recibo: IXMLComprobante;     timbreFiscal: IXMLTimbreFiscalDigital;     XMLDocument1: TXMLDocument;   begin   // cargar el comprogante a partir del nombre del archivo   recibo := LoadComprobante(archivo); 
  // una opción es crear una instancia de TXMLDocument
  XMLDocument1 := TXMLDocument.Create(Self);

 // obtener el nodo del timbre fiscal   XMLDocument1.Xml.Text := recibo.Complemento.ChildNodes.FindNode('tfd:TimbreFiscalDigital', '').Xml;   XMLDocument1.Active := True;   timbreFiscal := GetTimbreFiscalDigital(XMLDocument1);    showMessage(timbreFiscal.UUID); end;
Responder Con Cita
  #9  
Antiguo 10-03-2017
jourdan jourdan is offline
Miembro
 
Registrado: may 2003
Ubicación: Mexico
Posts: 151
Poder: 21
jourdan Va por buen camino
Si tengo el XMLDocument1 en el formulario, ya revise de nuevo todo y sigue mandando el eaccess violation.
Voy a seguir intentandole a ver si encuentro la falla
Nuevamente muchas gracias por tu ayuda
__________________
Alejandro Jourdan
Responder Con Cita
  #10  
Antiguo 12-10-2017
luislynx luislynx is offline
Registrado
NULL
 
Registrado: may 2011
Posts: 3
Poder: 0
luislynx Va por buen camino
Ya encontraste la solucion ya que yo tambien tengo el mismo problema
Responder Con Cita
  #11  
Antiguo 12-10-2017
jourdan jourdan is offline
Miembro
 
Registrado: may 2003
Ubicación: Mexico
Posts: 151
Poder: 21
jourdan Va por buen camino
Con delphi nunca pude, lo solucione muy fácil con visualstudio
Saludos
__________________
Alejandro Jourdan
Responder Con Cita
  #12  
Antiguo 12-10-2017
luislynx luislynx is offline
Registrado
NULL
 
Registrado: may 2011
Posts: 3
Poder: 0
luislynx Va por buen camino
yo lo logre pero lo hice de la manera arcaica separando cadenas si le interesa con gusto se los comparto
Responder Con Cita
  #13  
Antiguo 18-10-2017
jourdan jourdan is offline
Miembro
 
Registrado: may 2003
Ubicación: Mexico
Posts: 151
Poder: 21
jourdan Va por buen camino
Cita:
Empezado por luislynx Ver Mensaje
yo lo logre pero lo hice de la manera arcaica separando cadenas si le interesa con gusto se los comparto
Si por favor, me ayudarías mucho
Muchas gracias y saludos
__________________
Alejandro Jourdan

Última edición por Casimiro Notevi fecha: 18-10-2017 a las 00:40:42. Razón: Eliminar email. Lee nuestra guía de estilo.
Responder Con Cita
  #14  
Antiguo 18-10-2017
luislynx luislynx is offline
Registrado
NULL
 
Registrado: may 2011
Posts: 3
Poder: 0
luislynx Va por buen camino
Pasame tu email para enviartelo
Responder Con Cita
  #15  
Antiguo 18-10-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Por favor, leed nuestra guía de estilo, gracias.
Punto 14:
No solicitar respuestas por email, estas son contrarias a la filosofía de compartir conocimiento del Club.
Responder Con Cita
  #16  
Antiguo 12-01-2018
jourdan jourdan is offline
Miembro
 
Registrado: may 2003
Ubicación: Mexico
Posts: 151
Poder: 21
jourdan Va por buen camino
Aquí encontré la solución: https://github.com/bambucode/tfacturaelectronica
Los programadores de bambucode son unos fregones.
Saludos
__________________
Alejandro Jourdan
Responder Con Cita
  #17  
Antiguo 22-08-2018
Avatar de Faust
Faust Faust is offline
Miembro
 
Registrado: abr 2006
Ubicación: México D.F.
Posts: 930
Poder: 18
Faust Va por buen camino
Hola, entré buscando respuesta a esto y la encontré de una manera diferente.



Cita:
Empezado por tmsanchez Ver Mensaje
Que tal.

Probablemente esto te sirva:

Código Delphi [-]procedure TfrmPrincipal.generaPdf(archivo: String); var recibo: IXMLComprobante; timbreFiscal: IXMLTimbreFiscalDigital; XMLDocument1: TXMLDocument; begin // cargar el comprogante a partir del nombre del archivo recibo := LoadComprobante(archivo); // obtener el nodo del timbre fiscal XMLDocument1.Xml.Text := recibo.Complemento.ChildNodes.FindNode('tfd:TimbreFiscalDigital', '').Xml; XMLDocument1.Active := True; timbreFiscal := GetTimbreFiscalDigital(XMLDocument1); showMessage(timbreFiscal.UUID); end;



Hola, corrijo... para que funcione en la linea que dice:


Cita:
XMLDocument1.Xml.Text := recibo.Complemento.ChildNodes.FindNode('tfd:TimbreFiscalDigital', '').Xml;

Debe decir



Código Delphi [-]
  XMLDocument1.Xml.Text := recibo.Complemento[0].ChildNodes[0].Xml;


Siempre y cuando esté timbrado el CFDI...
Al menos a mi me sirve desde hace tiempo
__________________
Herr Heins Faust
Responder Con Cita
  #18  
Antiguo 22-08-2018
jourdan jourdan is offline
Miembro
 
Registrado: may 2003
Ubicación: Mexico
Posts: 151
Poder: 21
jourdan Va por buen camino
Muchas gracias, lo voy a probar.
Saludos
__________________
Alejandro Jourdan
Responder Con Cita
  #19  
Antiguo 28-08-2018
Avatar de Faust
Faust Faust is offline
Miembro
 
Registrado: abr 2006
Ubicación: México D.F.
Posts: 930
Poder: 18
Faust Va por buen camino
Hola de nuevo

Quizás a muchos no les funcionó mi última solución y pues hasta yo le encontré que falla cuando hay más complementos como pagos.

Así que traigo otra solución ojalá definitiva...

Dónde dice:


Código:
XMLDocument1.Xml.Text := recibo.Complemento.ChildNodes.FindNode('tfd:TimbreFiscalDigital', '').Xml;

Debe ser


Quizás a muchos no les funcionó mi última solución y pues hasta yo le encontré que falla cuando hay más complementos como pagos.

Así que traigo otra solución ojalá definitiva...

Dónde dice:


XMLDocument1.Xml.Text := recibo.Complemento[0].ChildNodes.FindNode('tfd:TimbreFiscalDigital', '').Xml;


No lo he terminado de probar, pero la idea la saqué de aquí:


https://stackoverflow.com/questions/...nodes-findnode


Viene una explicación sobre el namespace (no se me había ocurrido así tal como dice) de que no lo encuentra con findnode por ser diferente al namespace del documento que ("cfdi" en la factura y en el complemento de timbrado es "cfd", mientras que en los pagos donde tengo problemas es "pagos10")



Saludos de nuevo...
__________________
Herr Heins Faust
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
C++Builder 6 CFDI Mexico ¿Como agregar nodo dentro de otro nodo como hijo? JXJ C++ Builder 0 10-03-2016 04:51:01
TFacturaElectronica con soporte para CFDI lcarrasco Bibliotecas de código fuente 14 22-03-2015 05:45:27
Web Service timbrado CFDI Alexis De la Cr Delphi para la web 2 08-11-2012 21:07:13
Consulta - TP Arboles- "Para cada nodo de un arbol Indique nombre del nodo padre" velapuerca88 Varios 5 08-06-2012 18:35:33


La franja horaria es GMT +2. Ahora son las 19:59:38.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi