Procesar un fichero EDI con Talend
0. Índice de contenidos.
1. Introducción
En este tutorial se pretende enseñar una forma de trabajar con un fichero EDI mediante el uso de
la herramienta TOS (Talend Open Studio). Antes de nada, aconsejaría visitar los siguientes tutoriales, ya que
este tutorial vendría a ser la continuación de los anteriores y por lo tanto requiere de conceptos y recursos
que se explican en cada uno de ellos.
Nota : En el segundo tutorial se enseña a instalar el componente que usaremos en este tutorial.
Antes de ponernos a trabajar, quería recordar que el componente que utilizaremos para trabajar pertecene al framework de
Smooks http://www.smooks.org (framework para construir aplicaciones que permitan procesar
XML u otros documentos (CSV, EDI , etc.. usando Java).
Vamos con un poco de teoría….. 😉
¿Qué es EDI?
EDI es el acrónimo de Electronic Data Interchange), es decir, intercambio electrónico de datos
aunque yo prefiero que lo veáis como el concepto de «factura electrónica». Este formato está normalizado entre los sistemas
informáticos de quienes participan en transacciones comerciales tratando de conseguir la minimización de cualquier operación
manual por parte de una persona.
Permite la implementación en diferentes formatos :
- Texto plano : TXT
- Texto estructurado : XML
- Texto especifico : EDIFACT
A nosotros nos va a interesar para este tutorial el formato EDIFACT
¿Qué es EDIFACT?
EDIFACT es el acrónimo de Electronic Data Interchange for Administration, Commerce
and Transport, es decir , intercambio electrónico de datos para la Administración , Comercio y Transporte. EDIFACT
es un estándar de la ONU para el intercambio de información comercial que es utilizado en todo el mundo.
Me gustaría aclarar que a partir de este estándar nacen otros subestándares para cada entorno de negocio (automoción,
logística, etc) o bien para cada pais. Aunque si os digo la verdad, cada casi nadie lo cumple totalmente y cada uno
suele darle su particular visión 😉
¿Para qué se utiliza EDI?
El principal objetivo de EDI es el de ser el sustito del papel nivel comercial de forma que todo el mundo sea capaz de
comunicarse utilizando el mismo formato (normalización).
Con eso lo que se consigue es tener un sistema de transacciones comerciales sin papeles.
2. Entorno.
El tutorial está escrito usando el siguiente entorno:
- Hardware: Portátil Asus G50Vseries (Core Duo P8600 2.4GHz, 4GB RAM,320 GB HD).
- Sistema operativo: Windows Vista Ultimate.
- Mozilla Firefox 2.0.0.20
- Talend Open Studio 4.0.1
3. Preparación.
3.1 Creación de un nuevo subestandar de EDIFACT : EDIVERSION
Vamos a generar un subestándar inventado de EDIFACT para el intercambio de localizaciones de ocio al que
denominaremos EDIVERSION.
Cualquier estándar de EDIFACT viene definido por una serie de CAMPOS que contendrán información
específica en COMPONENTES y en SUBCOMPONENTES (son componentes secundarios dentro de un componente principal).
Un SEGMENTO suele agrupar elementos de una temática común (Fechas, usuario , etc)
El primero de los campos representa al SEGMENTO con el que se trabajará, por lo que todos los COMPONENTES y
SUBCOMPONENTES pertenecen a un SEGMENTO.
Los SEGMENTOS, CAMPOS y SUBCAMPOS pueden tener un ámbito de ejecución : obligatorio, opcional o no requerido (puede
darse el caso de que haya que dejarlo en blanco)
Definiremos los siguientes separadores entre los diferentes elementos :
- Separador de segmentos : «‘»
- Separador de campos : «+»
- Separador de componentes : «:»
- Separador de subcomponentes : «~»
Código que permite definir lo anterior en el esquema EDIVERSION en el fichero de mapeo
1 |
<medi:delimiters segment="'" field="+" component=":" sub-component="~" /> |
Los SEGMENTOS suelen venir definidos mediante un esquema que representa su secuencialidad
Segmento USU : Contiene información del usuario
Este segmento es obligatorio
Nº de apariciones : 1
Campos / Subcampos | EDIVERSION | Descripción |
NOMBRE Y APELLIDOS | Obligatorio | Campo compuesto : nombre y apellidos |
-> Nombre | Obligatorio | |
-> Apellidos | Obligatorio | |
Obligatorio | Correo del usuario |
Ejemplo : USU+Víctor:Madrid Triviño+vjmadrid@autentia.com’
Código que permite definir lo anterior en el esquema EDIVERSION en el fichero de mapeo
1 2 3 4 5 6 7 8 |
<!-- SEGMENTO USU : Información del usurio --> <medi:segment minOccurs="1" maxOccurs="1" segcode="USU" xmltag="USU" > <medi:field xmltag="nombreyApellidosUSU" required="true" > <medi:component xmltag="nombreUSU" required="true" /> <medi:component xmltag="apellidosUSU" required="true" /> </medi:field> <medi:field xmltag="emailUSU" required="true" /> </medi:segment> |
Segmento TEM : Temática del fichero de intercambio
Este segmento es obligatorio
Nº de apariciones : 1
Segmento posterior a USU
Campos / Subcampos | EDIVERSION | Descripción |
Motivo | Obligatorio |
Ejemplo : TEM+Terracitas de Verano’
Código que permite definir lo anterior en el esquema EDIVERSION en el fichero de mapeo
1 2 3 4 |
<!-- SEGMENTO TEM : Tematica del fichero --> <medi:segment minOccurs="1" maxOccurs="1" segcode="TEM" xmltag="TEM" > <medi:field xmltag="motivoTEM" /> </medi:segment> |
Segmento DIR : Detalle de la dirección de la localización
Este segmento es opcional
Nº de apariciones : 1..N
Segmento posterior a TEM
Campos / Subcampos | EDIVERSION | Descripción |
Nº de localización | Obligatorio | |
Lugar | Obligatorio | |
Dirección | Obligatorio | |
Teléfono | Opcional | |
Nocturnidad | Suprimido | Habrá que dejarlo en blanco debido al siguiente campo |
Metro | Obligatorio |
Ejemplo : DIR+1+Ananda+Ciudad de Barcelona s/n+++Metro Atocha’
Código que permite definir lo anterior en el esquema EDIVERSION en el fichero de mapeo
1 2 3 4 5 6 7 8 9 |
<!-- SEGMENTO DIR : Detalle de la localización del sitio --> <medi:segment minOccurs="1" maxOccurs="-1" segcode="DIR" xmltag="DIR" truncatable="true"> <medi:field xmltag="numDIR" required="true" /> <medi:field xmltag="lugarDIR" required="true" /> <medi:field xmltag="direccionDIR" required="true" /> <medi:field xmltag="telefonoDIR" /> <medi:field xmltag="nocturnidadDIR" /> <!-- Se mostrará vacio --> <medi:field xmltag="metroDIR" required="true" /> </medi:segment> |
Segmento DET : Detalle anexo de la localización
Este segmento es opcional
Nº de apariciones : 1
Segmento dependiente de DIR
Campos / Subcampos | EDIVERSION | Descripción |
Descripción | Obligatoriedad |
Ejemplo : DET+Amplia pista de baile y buenas vistas’
Código que permite definir lo anterior en el esquema EDIVERSION en el fichero de mapeo
3.2 Generación de un fichero de mapeo del componente tSmooks
Para ello integramos los anteriores elementos «medi:segment» para constituir la estructura definida
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<medi:edimap xmlns:medi="http://www.milyn.org/schema/edi-message-mapping-1.1.xsd"> <medi:description name="EDI" version="1.0" /> <medi:delimiters segment="'" field="+" component=":" sub-component="~" /> <medi:segments xmltag="EDIVERSION" > <!-- SEGMENTO USU : Información del usurio --> <medi:segment minOccurs="1" maxOccurs="1" segcode="USU" xmltag="USU" > <medi:field xmltag="nombreyApellidosUSU" required="true" > <medi:component xmltag="nombreUSU" required="true" /> <medi:component xmltag="apellidosUSU" required="true" /> </medi:field> <medi:field xmltag="emailUSU" required="true" /> </medi:segment> <!-- SEGMENTO TEM : Tematica del fichero --> <medi:segment minOccurs="1" maxOccurs="1" segcode="TEM" xmltag="TEM" > <medi:field xmltag="motivoTEM" /> </medi:segment> <medi:segmentGroup minOccurs="0" maxOccurs="-1" xmltag="INFO_DIR"> <!-- SEGMENTO DIR : Detalle de la localización del sitio --> <medi:segment minOccurs="1" maxOccurs="-1" segcode="DIR" xmltag="DIR" truncatable="true"> <medi:field xmltag="numDIR" required="true" /> <medi:field xmltag="lugarDIR" required="true" /> <medi:field xmltag="direccionDIR" required="true" /> <medi:field xmltag="telefonoDIR" /> <medi:field xmltag="nocturnidadDIR" /> <!-- Se mostrará vacio --> <medi:field xmltag="metroDIR" required="true" /> </medi:segment> <medi:segmentGroup minOccurs="0" maxOccurs="-1" xmltag="hijosDIR"> <!-- SEGMENTO DET : Detalle de la localizacion --> <medi:segment minOccurs="0" maxOccurs="-1" segcode="DET" xmltag="DET"> <medi:field xmltag="descripcionDET" required="true" /> </medi:segment> </medi:segmentGroup> </medi:segmentGroup> </medi:segments> </medi:edimap> |
Recordar añadir como primera línea : <?xml version=»1.0″ encoding=»UTF-8″?>
Guardaremos el anterior fichero como mappingEDIVERSION.xml
3.3 Generación de un fichero de configuracion del componente tSmooks
Generamos un fichero de configuración
1 2 3 4 5 6 7 8 9 10 |
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd" xmlns:edi="http://www.milyn.org/xsd/smooks/edi-1.1.xsd"> <!-- Configure the EDI Reader to process the message stream into a stream of SAX events. --> <edi:reader mappingModel="mapeo" /> </smooks-resource-list> |
Recordar añadir como primera línea : <?xml version=»1.0″?>
Guardaremos el anterior fichero como configEDIVERSION.xml
3.4 Creación de fichero EDIVERSION que represente a nuestro esquema :
1 2 3 4 5 6 7 8 9 |
USU+Víctor:Madrid Triviño+vjmadrid@autentia.com' TEM+Terracitas de Verano' DIR+1+Ananda+Ciudad de Barcelona s/n+++Metro Atocha' DET+Sitio divertido y buenas vistas' DIR+2+Pedro Larumbe (ABC de Serrano)+Serrano 61+915751112++Metro Rubén Darío' DIR+3+Terraza Europa+Paseo de la Castellana 95+915 217 379++Metro Santiago Bernabéu' DIR+4+Café de las Comendadoras+Plaza de las Comendadoras 2+915472222++Metro Noviciado' DET+Sitio tranquilo en pleno centro de Madrid' DIR+5+Círculo de Bellas Artes+Alcalá 42+913605400++Metro Sevilla' |
Nota Importante : Antes de guardar eliminar los saltos de línea para que quede todo el documento
en una única línea
Guardaremos el anterior fichero como Ejemplo.edi
4. Procesamiento.
PASO 1 : Creamos un trabajo nuevo
PASO 2 : Insertamos el componente de Pre Trabajo (tPreJob)
PASO 3 : Asociamos al componente de Pre Trabajo el componente para establecer las variables globales (tSetGlobalVar)
Introducidos dos variables globales :
- «configuracion_tSmooks» : Con valor la ruta del directorio de configuración (En mi caso «C:/Users/ASUS/Desktop/ficheroEDI/configEDIVERSION.xml»)
- «mapeo_tSmooks» : Con valor la ruta del directorio de mapeo (En mi caso «C:/Users/ASUS/Desktop/ficheroEDI/mappingEDIVERSION.xml»)
PASO 4 : Insertamos el componente de tSmooks para realizar el procesamiento
- Configuramos como fichero de entrada nuestro fichero EDI : Ejemplo.edi
- Configuramos como fichero de configuracion la variable asociada : ((String)globalMap.get(«configuracion_tSmooks»))
- Configuramos como fichero de salida el que nosotros queramos establecer
- Configuramos como parámetro «mapeo» como ((String)globalMap.get(«mapeo_tSmooks»))
PASO 5 : Ejecución del Job
Si todo está bien generaremos un fichero XML de resultado
5. Conclusiones.
Con veis ha sido muy fácil convertir un fichero en formato EDI a un fichero XML con el que es más
fácil trabajar para realizar cualquier tipo de acción. Además os he enseñado cómo trabajan con casi todos
los estándares realacionados con EDIFACT.Espero que os ayude 😉