PDA

Ver la Versión Completa : Duda creando "child" en documento XML


newtron
05-12-2015, 10:49:06
Hola a tod@s.

Como imagino que sabréis, a partir del día 1 de Febrero del año que entra todos los ficheros que se envíen a entidades bancarias con la norma SEPA 19 deberán de ir en formato XML, y en ello estamos.

Estoy creando el fichero XML usando la instrucción "AddChild" para ir creando los distintos nodos con sus valores y sin mayor problema. El tema está en que hay un apartado en el fichero donde se indica el importe del recibo en el que cambia la estructura del resultado y estoy algo perdido.

Si por ejemplo pones este código:


TextXML := XMLFileHeader.AddChild('MsgId','');
TextXML.Text := '1234567890';


el resultado sería el siguiente:

<MsgId>1234567890</MsgId>


hasta aquí sin mayores problemas se van creando los distintos nodos, la línea se compone de la etiqueta <MsgId> seguido del valor 1234567890 y acabando en /MsgId.

El problema es que me encuentro un apartado, donde se indica el tipo de moneda y el importe del recibo, en el que cambia esa regla porque el resultado sería el siguiente:

<InstdAmt Ccy="EUR">60.50</InstdAmt>

¿Alquien sabe cómo crear este nodo con estos valores? porque la etiqueta con la que empieza no es la misma con la que acaba y se mete por medio el texto "EUR" que tampoco sé cómo incluirlo?.

Gracias y un saludo

dec
05-12-2015, 11:02:04
Hola,


¿Alquien sabe cómo crear este nodo con estos valores? porque la etiqueta con la que empieza no es la misma con la que acaba y se mete por medio el texto "EUR" que tampoco sé cómo incluirlo?


Yo diría que la etiqueta es la misma, pero, en este caso se incluye un atributo. Por ahí debes buscar: cómo añadir un atributo a un elemento XML. No sé qué biblioteca XML estés usando, así que no me atrevo a seguir, pero, es posible que encuentres algún método como "AddAttribute" o similar.

newtron
05-12-2015, 11:06:30
Gracias Dec.

Estoy usando TXMLDocument, miraré eso de los atributos a ver qué veo.

Saludos

dec
05-12-2015, 11:15:12
Hola,

Echa un vistazo a este apartado de la ayuda de Delphi (http://docwiki.embarcadero.com/CodeExamples/XE8/en/TXMLDocument_use_case_%28Delphi%29) a ver si te da alguna idea. :)

newtron
05-12-2015, 11:27:09
Amigo Dec.

Como bien decías los tiros iban por los atributos del nodo.

El tema se resuelve insertando esta línea antes de poner la etiqueta con el valor:


TextXML.Attributes['Ccy'] := 'EUR';


.. y a ver si nos ponemos las pilas que hemos tardado por lo menos media hora en resolver esto, ¿ein? :p:p

Gracias y un saludo

dec
05-12-2015, 11:40:35
Me alegro haber podido ayudar aunque sea tan lento. :D

olbeup
09-12-2015, 11:33:51
Hola newtron,

He creado un objecto que encapsula todo lo necesario para crear los recibos sepa en .XML y funciona bastante bien, si te pierdes dime donde te puedo hechar una mano.

Un saludo.

newtron
09-12-2015, 12:06:36
Hola newtron,

He creado un objecto que encapsula todo lo necesario para crear los recibos sepa en .XML y funciona bastante bien, si te pierdes dime donde te puedo hechar una mano.

Un saludo.

Gracias olbeup, ya he resuelto el tema usando TXMLDocument pero igual tu solución es más elegante. ¿Cómo funciona el objeto ese que has preparado?.

Saludos

olbeup
09-12-2015, 14:03:02
Gracias olbeup, ya he resuelto el tema usando TXMLDocument pero igual tu solución es más elegante. ¿Cómo funciona el objeto ese que has preparado?.

Saludos

Hola newtron,

Mas elegante no creo que sea, te pongo un ejemplo de la etiqueta del <GrpHdr>:

const
ISODateTime: string = 'yyyy-mm-dd"T"hh:nn:ss';
ISODate: string = 'yyyy-mm-dd';
ISOMsgId: string = '"PRE"yyyymmddhhnnss"%sRMS-%s"';
ISOUNIFI20022 = [32, 39..41, 65..90, 63, 97..122, 43..58];
ISOCHANGE20022: char = '.';

type

/// 1.0 ///

{+} {1.0 Cabecera – <GrpHdr>}
TGrpHdr = class;
{++} {1.8 - Parte iniciadora - <InitgPty>}
TInitgPty = class;
{+++} {1.8 - Identificación de la Parte iniciadora - <Id>}
TInitgPty_Id = class;
{++++} {1.8 - Persona jurídica - <OrgId>}
TInitgPty_Id_OrgId = class;
{+++++} {1.8 - Otra}
TInitgPty_Id_OrgId_Othr = class;

{Raíz del mensaje – Message root <CstmrDrctDbtInitn>}
TCstmrDrctDbtInitn = class
private
FGrpHdr: TGrpHdr; {class --> Cabecera – <GrpHdr>}
FPmtInf: TPmtInf; {class --> Información del pago <PmtInf>}

// --- * --- // Variables definidas por el usuario que no forman parte del ISO20022
FIDRemittance: Integer;
FIDBankSEPA: Integer;

// --- * --- Variables que no forman parte del componente ISO20022 SEPA XML
FConnectionString: string;
protected
public
constructor Create(AConnectionString: string);
destructor Destroy; override;
function ExecuteConvertToXML: Boolean;
procedure SaveToFileXML(const FileName: string);
published
property GrpHdr: TGrpHdr read FGrpHdr write FGrpHdr; {class --> Cabecera – <GrpHdr>}
property PmtInf: TPmtInf read FPmtInf write FPmtInf; {class --> Información del pago <PmtInf>}

property ConnectionString: string read FConnectionString write FConnectionString;
property IDBankSEPA: Integer read FIDBankSEPA write FIDBankSEPA;
property IDRemittance: Integer read FIDRemittance write FIDRemittance;
end;

{+} {1.0 Cabecera – <GrpHdr>}
TGrpHdr = class
private
FMsgId: string; {35} {1.1 Identificación del mensaje}
FCreDtTm: TDateTime; {19} {1.2 Fecha y hora de creación 'yyyy-mm-ddThh:nn:ss'}
FNbOfTxs: Integer; {15} {1.6 Número de operaciones}
FCtrlSum: Double; {18}{2} {1.7 Control de suma}
FInitgPty: TInitgPty; {1.8 Parte iniciadora}

{15} {1.6 Número de operaciones}
function GetNbOfTxs: Integer;
{18}{2} {1.7 Control de suma}
function GetCtrlSum: Double;

// --- * --- // Variables para controlar el GrpHdrId
function GetMsgId: string;

protected
FCstmrDrctDbtInitn: TCstmrDrctDbtInitn;
public
constructor Create(Owner: TCstmrDrctDbtInitn);
destructor Destroy; override;
function GetIXMLNode: IXMLNode;
published
property MsgId: string read GetMsgId;
property CreDtTm: TDateTime read FCreDtTm;
property NbOfTxs: Integer read GetNbOfTxs;
property CtrlSum: Double read GetCtrlSum;
property InitgPty: TInitgPty read FInitgPty write FInitgPty;
end;


Esto es una parte del desarrollo.

Un saludo.

newtron
09-12-2015, 17:23:29
Hola newtron,

Mas elegante no creo que sea, te pongo un ejemplo de la etiqueta del <GrpHdr>:


Maemía..... pues la verdad es que no sé qué decirte, yo he ido creando cada child "a pelo" sin mayores problemas y ya lo tengo implantado, así que casi que lo dejo como está. De todas formas tendré en cuenta tu ofrecimiento en adelante.

Gracias y un saludo.