Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   leer nodo tfd de un cfdi xml (https://www.clubdelphi.com/foros/showthread.php?t=91570)

jourdan 07-03-2017 02:54:46

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

tmsanchez 08-03-2017 19:17:25

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;

jourdan 08-03-2017 19:41:58

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

tmsanchez 08-03-2017 20:52:57

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.

jourdan 08-03-2017 22:06:40

Muchisimas gracias, me pongo a hacer pruebas inmediatamente!
Saludos

tmsanchez 08-03-2017 23:32:07

Cita:

Empezado por jourdan (Mensaje 514134)
Muchisimas gracias, me pongo a hacer pruebas inmediatamente!
Saludos

Excelente, espero que el código te sea de ayuda.

jourdan 09-03-2017 02:57:59

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

tmsanchez 10-03-2017 01:07:33

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;

jourdan 10-03-2017 01:30:21

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

luislynx 12-10-2017 01:03:06

Ya encontraste la solucion ya que yo tambien tengo el mismo problema

jourdan 12-10-2017 01:45:07

Con delphi nunca pude, lo solucione muy fácil con visualstudio
Saludos

luislynx 12-10-2017 17:50:58

yo lo logre pero lo hice de la manera arcaica separando cadenas si le interesa con gusto se los comparto

jourdan 17-10-2017 23:39:31

Cita:

Empezado por luislynx (Mensaje 521711)
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

luislynx 18-10-2017 00:00:49

Pasame tu email para enviartelo

Casimiro Notevi 18-10-2017 00:04:02

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.

jourdan 12-01-2018 19:09:36

Aquí encontré la solución: https://github.com/bambucode/tfacturaelectronica
Los programadores de bambucode son unos fregones.
Saludos

Faust 22-08-2018 01:23:20

Hola, entré buscando respuesta a esto y la encontré de una manera diferente.



Cita:

Empezado por tmsanchez (Mensaje 514128)
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

jourdan 22-08-2018 18:15:34

Muchas gracias, lo voy a probar.
Saludos

Faust 28-08-2018 22:04:12

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...


La franja horaria es GMT +2. Ahora son las 18:06:24.

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