jueves, 14 de octubre de 2010

Variable Substitucion.

Muchas de las necesidades que se tiene al crear el nombre de un archivo de destino ya sea de tipo XML, texto etc, es agregar algún parámetro adicional de manera dinámica por ejemplo si tu archivo de destino se llama "Target.xml" adicionalmente a los parámetros establecidos en el cual se puede agregar el messagid, timestamp,un contador. tu archivo puede llamarse.

-"target_20101014-095549-775.xml"
-"target_AD1C95F3-CDF0-42EC-26A4-90BF5AE58D05.xml".

-"target_0001.xml".

Sin embargo como se puede agregar otros parámetros o valores , llamese Party,Service,interface etc o quizás un valor del documento. Para esto podemos utilizar la conflagración del Variable Substitucion en el cual se obtiene valores del encabezado del documento o atributos del payload de cada archivo.

Por ejemplo de acuerdo al anterior post Scenario XML to Text en el cual se tiene crea un archivo .txt desde una estructura inicial XML de una empresa llamada Xtratogen, ahora el scenario cambiara para hacerlo didactico , son muchas las empresas que enviaran dicha información llamese empresaA,empresaB,empresa C.
Así mismo ya no se desea tener en el nombre del archivo el time-stamp ,se desea ahora un valor unico como fuese el MessageId también se desea saber el tipo de clientes que se esta enviando.(Para dicho requerimento la empresa origen enviara dentro dicho valor dentro de un nuevo campo llamado typeCliente para esto agregaremos dicho campo a la estructura de origen así como la destino)
Siendo tres tipos de cliente de acuerdo a su frecuencia de compras : Frecuente,Habitual,Ocasional

fig 01 (click si desea visualizar mejor)

Dicho valor sera único en todos los clientes por lo cual se repetirá en todos los nodos.

fig 02 (click si desea visualizar mejor)

Bueno ahora haremos uso del variable substitución para esto debemos de activar el parametro en el tab "Advance" activamos el check de Enable. A continuación podras visualizar un grid con dos columnas indicando el nombre de la variable y la referencia.

El nombre de la variable es un nombre cualquiera y la referencia es el valor en el cual se hace referencia algun valor del payload siendo estos valores unicos como : sender_party, sender_service, receiver_party, receiver_service, interface_name, interface_namespace,message_id (message ID message_id_hex (msgid sin guiones) etc.
Por ejemplo si deseas el nombre de la interface se debe de poner en la columna Reference el valor message:
interface_name

fig 03 (click si desea visualizar mejor)

Agreguemos la variable enterprise y en la referencia pondremos "message:sender_party" dicha variable "enterprise lo usaremos en el file Name Schema .Esto nos indicar el valor de la empresa que envia dicha informacion.

Para obtener el valor del tipo de cliente dentro del payload de salida. tendremos que analizar la siguiente estructura del payload: seguido del nombre de los elementos y la ocurrencia separados por coma por ejemplo element1,n1,element2,n2.
element1,element2 indica el nombre de los elementos
n1,n2 indica la ocurrencia de valor de dicho elemento.
fig 04 (click si desea visualizar mejor)

Para indicar el codigo de mensaje unico (message id ) agregamos la variable msgid y la referencia es message_id_hex . De acuerdo a la estructura de destino indicada agregamos otra variable llamada tipocliente y la referencia sera payload:Cliente1,Cliente,1,TypeClient,1

fig 05 (click si desea visualizar mejor)

Finalmente en el primer tab File Name Schema para acceder a cada variable se debe indicar con el simbolo de porcentaje. %var01%.

Para nuestro ejemplo sera asi. Global_Log_%enterprise%_%tcliente%_%msgid%.txt

fig 06 (click si desea visualizar mejor)

Luego enviamos un archivo de prueba . En la figura de abajo podras ver el messageid generado dentro del payload.


fig 07 (click si desea visualizar mejor)


Finalmente el archivo se ha creado con los parametros indicado anteriormente como el party, el tipo de cliente y el message ID.

fig 08 (click si desea visualizar mejor)

Si bien el nombre del archivo es extenso, se trato de usar la mayor cantidad de variables posibles.

Hay otra manera de usar dinamicamente nombres de archivos que es el Dynamic Configuration y esto lo mostraré en otro tema
.

Scenario Flat File.

Hola que tal , nuevamente luego de un gran tiempo retomaremos poco a poco con el blog y es que realmente hay ciertos momentos en los proyectos que no te alcanza el tiempo para las diversas labores que uno desea hacer como uno desea.

Bueno esta vez volveremos con temas puntuales como son tipos de Scenario Flat File - IDOC - JDBC HTTP etc.

Scenario XML - Flat File
Este es uno de los scenarios en muchos casos el más básico y solicitado a la vez del cual se desea transformar de un archivo XML a un formato texto o viceversa. Para esto vamos a tomar como ejemplo la estructura de ejemplo que se hizo anteriormente Mapping 1ra Parte puedes verlo aca.


De acuerdo a las estructuras anteriores se realizaba el mapeo de una estructura llamada contactos a una de clientes con parecida estructura sin embargo se tiene que considerar algunas reglas de negocio.


El requerimiento es el siguiente una empresa llamada Xtratogen maneja información de contactos (clientes) dicha información lo maneja a través de archivos XML , la otra empresa(Global Logistic) desea recibir dicha información en formato de tipo texto.

De acuerdo a la siguiente estructura la información del cliente separada por "|" y la dirección separada "*"
Por ejemplo: Cod001|Luis|Ortiz|M|...*Av Luna*Lima*Peru.


Asi mismo desea el nombre del archivo tenga la siguiente nomenclatura.
Global_Log_[Fecha Proceso en el formato yyyyMMdd-HHmmss-SSS]

Vamos a realizar paso a paso el scenario.

Creamos los objectos en Integration Repository.


Interface Objects
- Creamos el DataType

Como podrás ver tenemos 2 estructuras una llama contacto y otra llamada cliente. como dije anteriormente estas estructuras se obtuvo de un tema anterior. Message Mapping


Contact Fig 01- (double click para visualizar mejor)

Client Fig 02- (double click para visualizar mejor)


Crear el Message Type.
- Creamos el Message Type Contact y Cliente usando los data type creados anteriormente.

Crear los interface Type.
- Creamos la interfaz de salida de tipo outbound oa_XML_Contact teniendo en base el Message type creado anteriormente.


Fig 03- (double click para visualizar mejor)

- Luego creamos la interfaz de entrada de tipo inbound ia_Text_Cliente.


Fig 04- (double click para visualizar mejor)

Mapping Objects.

Creamos el message mapping llamado
XML_Contact_to_Text_Cliente , como te mencione anteriormente la lógica de mapeo esta en el tema anterior Mapping 1ra Parte



Fig 05- (double click para visualizar mejor)

Creamos el interface mapping oa_XML_Contact_to_ia_Text_Cliente indicando las interfaz de entrada , salida y el mapping creado anteriormente.

Fig 06- (double click para visualizar mejor)

Una vez creado los objetos en Repository ahora crearemos los objetos en Configuration para indicar los parametros necesarios para convertir el archivo de XML a texto

Configuration


Para esto vamos a crear un scenario Test.


Creare los Party y luego los business services o business system , la diferencia simplemente es un business system es aquel sistema en el cual tu tienes control y business service es aquello que no tengas control. Como se describio el caso tu tienes tu sistema en el cual trabaja con XML sin embargo quisiera integrar dicho sistema con una empresa externa y dicha empresa ha solicitado que se envie en formato texto separado por "|" y *.


Como podras visualizar esta es listado de objetos que se deben de crear en la parte Integration Directory

Fig 07- (double click para visualizar mejor)

Luego de haber creado los parties y servicios creamos los comunication channels que serán los encargados de enviar y recibir la información en el formato indicado comencemos con el canal de envio (sender) en este caso CC_XML_SEND

Fig 08- (double click para visualizar mejor)

1.- El tipo de adaptador sera de tipo File.
2.- Protocolo del mensage tipo File tambien.
3.- configurarmos el directorio donde se van a enviar los archivos XML en el file name para un mejor filtro he puesto aquellos archivos de extensión XML

Creamos el sender agrement escogemos el party,service,interface.. Al crear escogeremos el canal que va transportar el archivo xml a PI.


fig 09- (double click para visualizar mejor)

En el receiver determination se indica cual es la interface que va recibir dicha interface previa.


fig 10- (double click para visualizar mejor)

Luego creamo el interface determination se indicara el mapping a ser utilizado en este caso de acuerdo al interface mapping.


fig 11- (double click para visualizar mejor)


Finalmente se crea el receiver agrement en el cual se indicar los parametros para recibir dicho mensaje y en el caso convertir al formato flat file. Para esto seleccionar el protocolo de tipo File Content Conversion. Al seleccionar se observara que se ha agregado


un tab mas para indicar la configuracion necesaria para dicho formato.
A continuacion tratare de explicar a breve modo como funciona dicho configuracion de este tipo de formato.



fig 12- (double click para visualizar mejor)




Para lograr el nombre del archivo de la siguiente forma Global_Log_[Fecha Proceso en el formato yyyyMMdd-HHmmss-SSS] agregamos el nombre "Global_Log_" en el FileNameScheme y escogemos en processing parameters "FileConstruccionMode" AddTimeStamp

fig 13- (double click para visualizar mejor)

fig 14- (double click para visualizar mejor)

En el Parametro Recordset Structure se ponen las estructuras indicadas en la interfaz de salida


Parametro NameA.addHeaderLine
0 – No se incluye ningun encabeza.
1 – Se incluye encabezado con el nombre de las columnas indicas en el XML document.
2 – Igual el 1 solo que se incluye en blanco.


Parametro NameA.beginSeparator.


Aqui puedes poner un valor (cadena) como primera columna del archivo de texto. Es un valor que antecede a la cadena final de toda la informacion.


Parametro NameA.fieldSeparator
Aqui se especifica la cadena que va separar cada elemento en este caso se ha puesto el valor "|"


Parametro NameA.endSeparator
Se especifica el valor que va indicar la finalizacion del registro en este caso se esta poniendo el salto de linea 'nl'

Bueno aqui les dejo el archivo como resultado , primero claro esta dejamos el archivo XML de ejemplo.




fig 15- (double click para visualizar mejor)

Este es el archivo resultante Global_Log_20101014-112047-592.txt


fig 16- (double click para visualizar mejor)


Si deseas mas informacion respecto a dicha configuracion de parametros puedes visitar este link
http://help.sap.com/saphelp_nw04/helpdata/en/bc/bb79d6061007419a081e58cbeaaf28/frameset.htm