BTS 2006: Como crear componentes repetitivas en una mapa de BTS

Hola a todos, me llamo Anuar Khan Alí, estoy desde julio el CIIN con una beca de Microsoft  y he estado haciendo cosas en temas de interoperabilidad entre entornos tecnológicos diferentes, principalmente entre .NET y Java. Últimamente he estado trabajando con Juan Carlos en un piloto demostrativo de BizTalk Server 2006 (BTS 2006) que próximamente presentaremos en Cantabria.


Así que aprovechando este piloto demostrativo que estamos haciendo en el CIIN, voy a comentar algunas cosas interesantes que hemos utilizado al definir  mapas de BTS.


El editor de mapas de BizTalk necesita dos esquemas XSD para operar: un esquema origen y un esquema destino. En la mayoría de los casos,  las transformaciones de datos que se definen en un mapa de BizTalk son directas, basta con enlazar los datos entre el origen y el destino, pero en otras ocasiones hay que manipular esos datos, ya sea porque hay que realizar una conversión de tipo de tao, porque solo nos interesa quedarnos con un trozo de una cadena, etc. Ahora bien, nos podemos encontrar con escenarios más complejos en los que en el origen o en el destino el esquema XSD este estructurado en forma de loops, es decir, presente estructuras cíclicas o iterativas. Para poder vincular estos campos y obtener el formato de salida deseado, se necesita de una cierta inteligencia ya que el propio esquema no lo reconoce directamente, es decir, no podemos  darle a un mismo elemento o atributo varios valores directamente ya que este a la hora de generar el documento XML sobrescribe los valores y solamente se queda con el ultimo valor que hayamos introducido (está aplicando lectura/escritura secuencial de datos en la salida). Por lo tanto para poder hacer esto es necesario utilizar unas funciones especificas del editor de mapas de BizTalk.


En nuestro caso particular el mapa con el que tenemos que trabajar es el siguiente:


                                                                                                                                                      


Figura 1: Imagen del mapa inicial utilizado en el ejemplo


 


Como se puede observar en zona de la derecha de la figura anterior, se encuentra el esquema de destino, en este esquema hay elementos que representan estructuras repetitivas, estos elementos son los que en la parte final de su nombre llevan adherido “LoopN”. En este punto,  se plantea el problema de cómo conseguir generar estructuras iterativas con BizTalk, es decir, a partir de distintos datos en origen, generar secuencias repetitivas en el destino. Para poder realizar este tipo de operaciones,  BizTalk dispone de una serie de functionsId avanzados. En particular, para el problema planteado vamos a usar Table Looping  y Table Extractor.


 


 


Figura 2: Imagen sobre las functoids utilizadas


 


Con el Table Looping seremos capaces de almacenar nuestros datos en una tabla, posteriormente gracias al Table Extractor iremos extrayendo los datos de esa tabla e introduciéndolos en los elementos del esquema de tal forma que no sobre escriba ningún elemento. Por cada columna que tenga la tabla que hemos creado en el Table Looping necesitamos un Table Extractor, de esta forma si nuestra tabla tiene 3 columnas y 5 filas, necesitaremos 3  Table Extractor y el bucle se repetirá tantas  veces como filas tengo nuestra tabla, es decir, 5 veces.


Un paso importante en este proceso es la configuración del elemento Table Looping, así que le vamos explicar en profundidad ahora. Como vemos en la Fig.2 el Table Looping es una Advanced Functoids. Esta función tiene un número ilimitado de parámetros pero como mínimo debe de tener tres. El primer parámetro tiene que ser un nodo en el documento de entrada que defina el scope de la tabla, en nuestro caso hemos escogido el nodo raíz del esquema de origen, que se denomina Factura. Nuestro segundo parámetro es el numero de columnas que vamos a utilizar en la tabla. Los siguientes parámetros ya son los elementos de la taba, en principio se pueden introducir en el orden que queramos, pero es aconsejable ya que se introduzca con un cierto orden para luego poder visualizarlos mejor a la hora de configurar la tabla.


 


 


Figura 3: Imagen de la ventana de configuración de parámetros


 


Cabe destacar que estos parámetros pueden venir directamente del esquema de origen, de otras Functoid o directamente definiendo una constante en la propia ventana de configuración de los parámetros de entrada.


Nuestro siguiente paso será configurar la tabla, para ello seleccionamos el Table Looping y damos con el botón derecho y seleccionamos Configure Table Looping Grid, nos aparecerá una ventana parecida a la siguiente imagen:


 


 


Figura 4: Imagen de la ventana de configuración de la tabla


 


Demos de configurarlo de tal forma que en cada columna estén los elementos que se quieran repetir, es decir, cada columna está asociada a un elemento en el esquema de destino, y cada fila nos indica el número de veces en que se va a repetir ese columna en el destino (en este caso, cada columna aparece dos veces en el destino).


Si necesitamos una estructura compleja en el que ciertas iteraciones estén vacías se puede hacer creando un parámetro de entrada que sea un string vacio, y seleccionarlo en cada posición que queremos que este vacía. Sin embargo debemos de tener en cuenta que el elemento destino del esquema nos permita introducir este tipo de datos.


Finalmente tenemos que configurar los parámetros de salida así como los Table Extractor, para ello introducimos tantos Table Extractor como columnas tenga nuestra tabla, ahora enlazamos estos con nuestra Table Looping, y en cada uno de ellos configuramos la columna que queremos extraer. Para ello damos botón derecho encima del Table Extractor y seleccionamos Configure Functoid inputs, ahí nos aparecerá ya un parámetro que se corresponde con el link que hemos creado con la Table Looping, simplemente creamos un parámetro que sea el numero de la columna que queremos extraer y damos a OK.


 


 


Figura 5: Imagen de la ventana de configuración del extractor


 


Repetimos el proceso para los restantes Table Extractor, recordemos que debemos de tener tantos como columnas teníamos en la tabla.


Para terminar de configurar los Table Extractor solo nos queda unirles con los elementos del esquema del destino que corresponda, por lo tanto vamos uniendo cada Table Extractor mediante un link con el elemento del esquema destino.


 


 


Figura 6: Imagen de un zona del mapa en la que se ve los enlaces de los Table Extractor con los elementos del esquema destino


 


Para terminar solo nos falta de configurar el parámetro de salida del Table Looping.  Para ello tenemos enlazar nuestra tabla con el elemento padre que admite iteración, ya que este link es el que va a permitir que se produzca el bucle y por tanto el conseguir el resultado querido. En la siguiente figura, se destaca con una línea azul, el enlace entre el Table Looping y el elemento del que cuelgan los elementos que queremos que se repitan.


 


 


Figura 7: Imagen del mapa final, la línea azul corresponde al enlace de la tabla con el nodo padre que   queremos repetir.


 


De esta forma podemos conseguir repetir elementos de un esquema de una manera sencilla, al principio parece un poco complejo, pero en cuanto se coge el mecanismo es muy sencillo y mecánico. Espero que os haya resultado de utilidad mi primer post en Geeks.

5 comentarios en “BTS 2006: Como crear componentes repetitivas en una mapa de BTS”

  1. Hola
    Me ha párecido muy interesante el post este pero mi problema es diferente y no se muy bien como hacerlo, me podrias echar una mano?:

    en origen tengo dos mensajes, uno con campos repetitivos y otro sin repetitivos y quiero pasar todos esos campos a un mensaje destino de campso repetitivos.
    Es asunto es que con los transform no soy capaz pues el elemento no repetitivo, en destino se repite tantas veces como elementos repetitivos tiene el otro mensaje oriigen (me explico o me repito?? jejeje )
    Solucionar esto me resultaria muy util pues, en mi proyecto, tengo muchos casos como estos o de pasar dos repetitivos a uno solo. muchas gracias.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *