Page 1 of 1

XML - SEPA

Posted: Mon Mar 26, 2018 5:37 pm
by SALINETAS24
Hola a todos. :P
Hace unos años para enviar una remesa de recibos al Banco (en España), se hacia en un fichero TXT, y se utilizaba la norma 19, la norma 32 o la norma 58.
Desde hace un par de años y al ser para toda Europa, el fichero hay que generarlo en XML.
¿Se puede generar un fichero XML desde CLIPPER..?
Supongo que alguien tendrá alguna rutina que genere este tipo de fichero, que es comun para todos los paises UE.
Podeis indicarme los pasos a seguir.
Muchas gracias como siempre.
Saludos.

Re: XML - SEPA

Posted: Mon Mar 26, 2018 7:19 pm
by ASESORMIX
Hola.
Ve a esta direccion:
viewtopic.php?f=24&t=4808&p=45650&hilit=XML#p45650
Creo que te puede ayudar.

Re: XML - SEPA

Posted: Tue Mar 27, 2018 6:42 am
by dragancesu
Look https://www.w3schools.com/xml/xml_whatis.asp

Do not worry much, the plain text file in which the data is entered can contain many tags for defining data and structures

Each one is specific and the one to whom you want to send a description of what it looks like, it's still easy

Re: XML - SEPA

Posted: Wed Mar 28, 2018 6:06 pm
by SALINETAS24
Muchas gracias, lo probaré

Re: XML - SEPA

Posted: Fri Apr 20, 2018 10:01 am
by JALMAG
Hola, mira este ejemplo de andaretor:

http://forums.fivetechsupport.com/viewt ... &start=105

fichero := "PRUEBA.xml"
nHandle:= FCreate( fichero )
// RAIZ DEL MENSAJE
cadena := "<?xml version=" + CHR(34) + "1.0" + CHR(34) + " encoding=" + CHR(34) + "utf-8" + CHR(34) + "?>"
FWriteLn( nHandle , cadena )
cadena := "<Document xmlns=" + CHR(34) + "urn:iso:std:iso:20022:tech:xsd:pain.008.001.02" + CHR(34) + " xmlns:xsi=" + CHR(34) + "http://www.w3.org/2001/XMLSchema-instance" + CHR(34) + ">"
FWriteLn( nHandle , cadena )
cadena := "<CstmrDrctDbtInitn>"
FWriteLn( nHandle , cadena )
// CABECERA
cadena := "<GrpHdr>"
FWriteLn( nHandle , cadena )
cadena := "<MsgId>" + "PRE" + Str( Year( date() ), 4 ) + Padl( Month( date() ), 2, "0" ) + Padl( Day( date() ), 2, "0" ) + Padr( cTime, 11, "0" ) + Padr( oDatos[ ( dbGesBanco )->( fieldpos( "Codigo" ) ) ], 13, "0" ) + "</MsgId>"
FWriteLn( nHandle , cadena )
cadena := "<CreDtTm>" + Str( Year( date() ), 4 ) + "-" + Padl( Month( date() ), 2, "0" ) + "-" + Padl( Day( date() ), 2, "0" ) + "T" + time() + "</CreDtTm>"
FWriteLn( nHandle , cadena )
cadena := "<NbOfTxs>" + AllTrim( Str( nCont ) ) + "</NbOfTxs>"
FWriteLn( nHandle , cadena )
cadena := "<CtrlSum>" + AllTrim( Transform( nTotImp, cPictImpSEPA(.F.) ) ) + "</CtrlSum>"
FWriteLn( nHandle , cadena )
cadena := "<InitgPty>"
FWriteLn( nHandle , cadena )
cadena := "<Nm>" + AllTrim( Padr( ArreglaNombre( oDatos[ ( dbGesBanco )->( fieldpos( "NOMBRE" ) ) ] ), 70, " " ) ) + "</Nm>"
FWriteLn( nHandle , cadena )
cadena := "<Id>"
FWriteLn( nHandle , cadena )
cadena := "<OrgId>"
FWriteLn( nHandle , cadena )
cadena := "<Othr>"
FWriteLn( nHandle , cadena )
cadena := "<Id>" + AllTrim( "ES" + cGetDigitIDSEPA( AllTrim( oDatos[ ( dbGesBanco )->( fieldpos( "NIF" ) ) ] ), "ES" ) + oDatos[ ( dbGesBanco )->( fieldpos( "Sufijo" ) ) ] + Padr( oDatos[ ( dbGesBanco )->( fieldpos( "NIF" ) ) ], 28, " " ) ) + "</Id>"
FWriteLn( nHandle , cadena )
cadena := "</Othr>"
FWriteLn( nHandle , cadena )
cadena := "</OrgId>"
FWriteLn( nHandle , cadena )
cadena := "</Id>"
FWriteLn( nHandle , cadena )
cadena := "</InitgPty>"
FWriteLn( nHandle , cadena )
cadena := "</GrpHdr>"
FWriteLn( nHandle , cadena )

// INFORMACION DEL PAGO
cadena := "<PmtInf>"
FWriteLn( nHandle , cadena )
cadena := "<PmtInfId>" + Str( Year( date() ), 4 ) + Padl( Month( date() ), 2, "0" ) + Padl( Day( date() ), 2, "0" ) + Padr( cTime, 11, "0" ) + Padr( oDatos[ ( dbGesBanco )->( fieldpos( "Codigo" ) ) ], 13, "0" ) + "</PmtInfId>"
FWriteLn( nHandle , cadena )
cadena := "<PmtMtd>DD</PmtMtd>"
FWriteLn( nHandle , cadena )
cadena := "<PmtTpInf>"
FWriteLn( nHandle , cadena )
cadena := "<SvcLvl>"
FWriteLn( nHandle , cadena )
cadena := "<Cd>SEPA</Cd>"
FWriteLn( nHandle , cadena )
cadena := "</SvcLvl>"
FWriteLn( nHandle , cadena )
cadena := "<LclInstrm>"
FWriteLn( nHandle , cadena )
cadena := "<Cd>CORE</Cd>"
FWriteLn( nHandle , cadena )
cadena := "</LclInstrm>"
FWriteLn( nHandle , cadena )
cadena := "<SeqTp>RCUR</SeqTp>"
FWriteLn( nHandle , cadena )
cadena := "</PmtTpInf>"
FWriteLn( nHandle , cadena )
cadena := "<ReqdColltnDt>" + Str( Year( dFecha ), 4 ) + "-" + Padl( Month( dFecha ), 2, "0" ) + "-" + Padl( Day( dFecha ), 2, "0" ) + "</ReqdColltnDt>"
FWriteLn( nHandle , cadena )
cadena := "<Cdtr>"
FWriteLn( nHandle , cadena )
cadena := "<Nm>" + AllTrim( Padr( ArreglaNombre( oDatos[ ( dbGesBanco )->( fieldpos( "NOMBRE" ) ) ] ), 70, " " ) ) + "</Nm>"
FWriteLn( nHandle , cadena )
cadena := "</Cdtr>"
FWriteLn( nHandle , cadena )
cadena := "<CdtrAcct>"
FWriteLn( nHandle , cadena )
cadena := "<Id>"
FWriteLn( nHandle , cadena )
cadena := "<IBAN>" + AllTrim( Padr( oDatos[ ( dbGesBanco )->( fieldpos( "CCCABONO" ) ) ], 34, " " ) ) + "</IBAN>"
FWriteLn( nHandle , cadena )
cadena := "</Id>"
FWriteLn( nHandle , cadena )
cadena := "</CdtrAcct>"
FWriteLn( nHandle , cadena )
cadena := "<CdtrAgt>"
FWriteLn( nHandle , cadena )
cadena := "<FinInstnId>"
FWriteLn( nHandle , cadena )
cadena := "</FinInstnId>"
FWriteLn( nHandle , cadena )
cadena := "</CdtrAgt>"
FWriteLn( nHandle , cadena )
cadena := "<CdtrSchmeId>"
FWriteLn( nHandle , cadena )
cadena := "<Id>"
FWriteLn( nHandle , cadena )
cadena := "<PrvtId>"
FWriteLn( nHandle , cadena )
cadena := "<Othr>"
FWriteLn( nHandle , cadena )
cadena := "<Id>" + AllTrim( "ES" + cGetDigitIDSEPA( AllTrim( oDatos[ ( dbGesBanco )->( fieldpos( "NIF" ) ) ] ), "ES" ) + oDatos[ ( dbGesBanco )->( fieldpos( "Sufijo" ) ) ] + Padr( oDatos[ ( dbGesBanco )->( fieldpos( "NIF" ) ) ], 28, " " ) ) + "</Id>"
FWriteLn( nHandle , cadena )
cadena := "<SchmeNm>"
FWriteLn( nHandle , cadena )
cadena := "<Prtry>SEPA</Prtry>"
FWriteLn( nHandle , cadena )
cadena := "</SchmeNm>"
FWriteLn( nHandle , cadena )
cadena := "</Othr>"
FWriteLn( nHandle , cadena )
cadena := "</PrvtId>"
FWriteLn( nHandle , cadena )
cadena := "</Id>"
FWriteLn( nHandle , cadena )
cadena := "</CdtrSchmeId>"
FWriteLn( nHandle , cadena )

// INFORMACION DEL ADEUDO DIRECTO
( cDbTmp )->( DbGoTop() )
nCont := 0
nTotImp := 0
nContReg := 0
While ( cDbTmp )->( !Eof() )
If ( cDbTmp )->LSELECT .and. ( cDBTmp )->IMPORTE > 0
nCont ++
nTotImp += ( cDbTmp )->IMPORTE

cadena := "<DrctDbtTxInf>"
FWriteLn( nHandle , cadena )
cadena := "<PmtId>"
FWriteLn( nHandle , cadena )
cadena := "<EndToEndId>" + Padr( "REMESA HERMANDAD REF. "+oDatos[ ( dbGesBanco )->( fieldpos( "Codigo" ) ) ]+( cDbTmp )->CODIGO, 35, " " ) + "</EndToEndId>"
FWriteLn( nHandle , cadena )
cadena := "</PmtId>"
FWriteLn( nHandle , cadena )
cadena := "<InstdAmt Ccy=" + CHR(34) + "EUR" + CHR(34) + ">" + AllTrim( Transform( ( cDbTmp )->IMPORTE, cPictImpSEPA(.F.) ) ) + "</InstdAmt>"
FWriteLn( nHandle , cadena )
cadena := "<DrctDbtTx>"
FWriteLn( nHandle , cadena )
cadena := "<MndtRltdInf>"
FWriteLn( nHandle , cadena )
cadena := "<MndtId>" + Padr( ( cDbTmp )->REFBANCO, 35, " " ) + "</MndtId>"
FWriteLn( nHandle , cadena )
cadena := "<DtOfSgntr>" + Str( Year( ( cDbTmp )->MANDATO ), 4 ) + "-" + Padl( Month( ( cDbTmp )->MANDATO ), 2, "0" ) + "-" + Padl( Day( ( cDbTmp )->MANDATO ), 2, "0" ) + "</DtOfSgntr>"
FWriteLn( nHandle , cadena )
cadena := "</MndtRltdInf>"
FWriteLn( nHandle , cadena )
cadena := "</DrctDbtTx>"
FWriteLn( nHandle , cadena )
cadena := "<DbtrAgt>"
FWriteLn( nHandle , cadena )
cadena := "<FinInstnId>"
FWriteLn( nHandle , cadena )
cadena := "</FinInstnId>"
FWriteLn( nHandle , cadena )
cadena := "</DbtrAgt>"
FWriteLn( nHandle , cadena )
cadena := "<Dbtr>"
FWriteLn( nHandle , cadena )
cadena := "<Nm>" + AllTrim( Padr( ArreglaNombre( AllTrim( ( cDbTmp )->NOMBRE ) + " " + AllTrim( ( cDbTmp )->APELLIDOS ) ), 70, " " ) ) + "</Nm>"
FWriteLn( nHandle , cadena )
cadena := "</Dbtr>"
FWriteLn( nHandle , cadena )
cadena := "<DbtrAcct>"
FWriteLn( nHandle , cadena )
cadena := "<Id>"
FWriteLn( nHandle , cadena )
cadena := "<IBAN>" + AllTrim( Padr( "ES" + DCIdentificador( ( cDbTmp )->CBANCO + ( cDbTmp )->COFICINA + ( cDbTmp )->CCUENTA + "ES00" ) + ( cDbTmp )->CBANCO + ( cDbTmp )->COFICINA + ( cDbTmp )->CCUENTA, 34, " " ) ) + "</IBAN>"
FWriteLn( nHandle , cadena )
cadena := "</Id>"
FWriteLn( nHandle , cadena )
cadena := "</DbtrAcct>"
FWriteLn( nHandle , cadena )
cadena := "<RmtInf>"
FWriteLn( nHandle , cadena )
cadena := "<Ustrd>" + AllTrim( Padr( ArreglaNombre( AllTrim( ( cDbTmp )->OBSERV ) ), 140, " " ) ) + "</Ustrd>"
FWriteLn( nHandle , cadena )
cadena := "</RmtInf>"
FWriteLn( nHandle , cadena )
cadena := "</DrctDbtTxInf>"
FWriteLn( nHandle , cadena )
end if
( cDbTmp )->( DbSkip() )
end while

cadena := "</PmtInf>"
FWriteLn( nHandle , cadena )

cadena := "</CstmrDrctDbtInitn>"
FWriteLn( nHandle , cadena )

cadena := "</Document>"
FWriteLn( nHandle , cadena )

FClose(nHandle)


A mi me sirvió y mucho, tan solo que hubo que poner hace pocos meses la totalidad de importe y de número de recibos a demás de en la cabecera principal en la subcabecera.

Es decir repetir estas etiquetas, es la modificación 9.1 creo

cadena := "<NbOfTxs>" + AllTrim( Str( nCont ) ) + "</NbOfTxs>"
FWriteLn( nHandle , cadena )
cadena := "<CtrlSum>" + AllTrim( Transform( nTotImp, cPictImpSEPA(.F.) ) ) + "</CtrlSum>"
FWriteLn( nHandle , cadena )

Tambien en https://github.com/QuimFerrer/sepa

Saludos

Re: XML - SEPA

Posted: Fri Apr 20, 2018 5:18 pm
by SALINETAS24
Muchas gracias