BTS 2006: Como manejar estructuras repetitivas en el esquema origen y en el esquema destino de un mapa de BizTalk

En
un post  anterior 
explicamos cómo crear estructuras repetitivas en el esquema destino de
un mapa de BizTalk
Server 2006
(BTS 2006). Ahora bien, ¿Cómo tratamos aquellos casos en los
esquema origen también tenemos algún componente repetitivo? Una primera implicación
es que debemos de ser capaces de poder extraer los datos repetitivos, para a
continuación procesaros en el mapa de BTS 2006 con un Functoid
especial (de tipo table lopping como hacíamos en el ejemplo explicado en post
previo
).  El proceso de extracción de
datos repetitivos de un esquema origen pude parecer a  priori bastante complicado. Sin embargo, en
este post vamos a ver qué utilizando las herramientas que nos proporciona BTS
2006, resulta bastante sencillo.  Lo
primero que haremos será crear el esquema origen (con componentes repetitivas)
utilizando la herramienta Flat
File Schema Wizard
de BTS 2006, para a continuación definir el
correspondiente mapa de BizTalk, que es capaz de leer estructuras repetitivas
en origen y generar estructuras repetitivas en destino.

Creación
del esquema origen con el Flat File Schema Wizard

Como
ya habíamos comentado en el post anterior el editor de mapas de BizTalk
necesita dos esquemas XSD, uno como origen y otro como destino. Podemos
trabajar con esquemas ya creados pero en este caso vamos a crear el esquema
origen a partir de un documento txt que contiene varias líneas de producto con
la misma estructura, como se muestra en la siguiente figura.

Figura 1: archivo txt del que se
obtendrá el esquema origen para el mapa de Biztalk

 

Para  poder obtener un esquema XDS de un fichero
plano es necesario utilizar el Flat File Schema Wizard  que nos proporciona BizTalk. Para utilizar
esta herramienta, añadimos un nuevo elemento al proyecto de BizTalk de tipo Schema
Files -> Flat File Schema Wizard
.

 
Figura 2: Menú de Biztalk para añadir
un esquema al proyecto.

Lo
primero que tenemos que hacer es seleccionar el fichero a partir de cual
queremos obtener el esquema XSD, definir un nombre para el elemento raíz del
esquema y un namespace para el mismo.

 
Figura 3: Menú de Biztalk para definir
las propiedades del esquema.

 

Una
vez realizado esto pinchamos en Next,
y en la nueva pantalla se nos indicará que seleccionemos aquella porción del
fichero plano que queremos que sea englobada en el a generar. Además, tenemos
que comprobar que las líneas repetitivas tienen la misma longitud y terminan
con la misma secuencia, en nuestro caso será un salto de línea, como se puede
ver en la siguiente figura.

 
Figura 4: Menú de Biztalk para
comprobar el texto que se va analizar a realizar el esquema XSD. Las líneas
repetidas tienen que tener la misma longitud y empezar y terminar con algún
carácter o secuencia determinada.

Nota:
En caso de que las líneas repetitivas no tuvieran la misma estructura
deberíamos modificarlas en el fichero plano hasta conseguir que sean idénticas
(y se comporten de esta manera como auténticas repeticiones).

En
la siguiente ventana simplemente nos indica cómo queremos identificar las
componentes, existe la posibilidad de realizarlo de dos maneras distintas:

  • Por posiciones relativas.
  • Utilizando un delimitador.

En nuestro caso utilizaremos la opción By delimiter Symbol. Damos a next, en la siguiente ventana podemos especificar a través de que
símbolo queremos identificar los elementos. 
En nuestro caso escogemos la opción {CR}{LF}, como muestra la siguiente
figura.  La opción que hemos escogido nos
indica que utilizaremos el salto de línea para separar los elementos del
fichero plano.

 
Figura 5: Menú de Biztalk para
seleccionar el símbolo que nos va a separar a los elementos del fichero plano.

Cuando
hayamos escogido esto damos a next
para ir al siguiente paso que, para el tipo de estructuras que estamos
analizando, es el más importante. En la nueva ventana, tenemos los elementos
del fichero plano que hemos seleccionado. Lo primero que podemos hacer es
darles a cada uno algún nombre identificativo, ya que por defecto nos genera
unos nombres automáticos poco explicativos. Cuando hayamos puesto nombre a los
elementos, nuestro siguiente paso es escoger el tipo de elemento que será en
nuestro esquema. Existen cuatro tipos:

  • Field Element
  • Field Atribute
  • Record
  • Repeating Record

Las
dos primeras se utilizan para componentes que no tienen ninguna estructura
interna, es decir, que no tenemos que “trocearlo más”. La elección entre una u
otra ya depende de las necesidades de cada caso. Los otros dos tipos se
utilizan para estructuras que tienen subelementos, resaltando que el ultimo
tipo aparte de tener subelementos, se puede repetir el nodo un cierto número de
veces. Para el tipo de datos y análisis en el mapa de BizTalk que queremos
hacer, debemos de escoger este ultimo tipo.

Una
duda que se nos puede plantear, es que tenemos un cierto número de líneas con
la misma estructura, por lo tanto debemos de analizar cada línea o por el
contrario con analizar una de las líneas será suficiente. La respuesta está en
la segunda opción, pero tenemos que decir a BizTalk de alguna manera que solo
analice una de las líneas para poder de esta manera procesar ficheros con un
número cierto número de líneas (desconocido a priori) con idéntica estructura.
Para hacer esto el wizard que estamos utilizando nos da la opción de que
después de seleccionar un Repeating Record podemos ignorar las líneas
siguientes del archivo, sin más que seleccionar la opción Ignore que se encuentra en la lista desplegable del tipo de
elemento. Para este ejemplo hemos configurado los elementos como se observa en
la siguiente figura.

 
Figura 6: Menú de Biztalk para
seleccionar el tipo de componente extraídos del fichero plano.

 
También
podemos seleccionar el tipo de dato, en nuestro caso como se puede observar en
la figura anterior que todos los elementos se han configurado como string. Una vez que ya hemos
especificado que en el fichero origen hay estructuras repetitivas,  tenemos que configurar como BTS 2006 va a
tratar cada línea de este tipo. Damos 2 veces a next, en la ventana que nos aparece comprobamos que este
seleccionada solo la primera línea repetitiva y volvemos a dar a next.

 
Figura 7: Menú de Biztalk para
seleccionar el elemento que se va a analizar.

 

 

 
Figura 8: Menú de Biztalk para ver la
línea de texto que se va a analizar.

Como
en el caso anterior tenemos que seleccionar como queremos “trocear” la línea
repetitiva, en este caso ya que el texto viene totalmente unido, si ningún
carácter de separación escogeremos la opción de By relative positions, y volvamos a dar a next. Además, tendremos que indicar cuál es el carácter de comienzo
de cada línea repetitivita para que el troceado sea correcto. En nuestro caso
hemos escogido como identificador un espacio en blanco (el identificador
utilizado depende de cómo nos entreguen el fichero plano origen) antes de la
línea. Además “troceamos” el texto como se muestra en la siguiente figura (por
posiciones relativas)  y damos a next.

 
Figura 9: Menú de Biztalk para
seleccionar el tipo de identificador y para trocear el texto del fichero plano.

Nos vuelve a salir una ventana muy parecida a la de la
figura 5, pero en  este caso con menos
elementos (pues ahora estamos tratando únicamente los elementos que forman
parte de una línea repetitiva). Volvemos a repetir el mismo proceso que antes,
es decir, les ponemos nombre y elegimos el tipo de componente.

 
Figura 10: Menú de Biztalk para
seleccionar el tipo de componente extraídos del fichero plano.

Finalmente
damos a next y después a finish, así ya tendremos configurado el
esquema de origen. Para poder realizar el mapa nos hace falta un esquema de
destino, en nuestro caso le hemos construido utilizando el editor de BizTalk.
Simplemente mostramos cual es su estructura en la siguiente figura.

 
Figura 11: Esquema destino XSD que se
utilizara en el mapa de Biztalk.

Añadimos
un mapa al proyecto del mismo modo que hicimos en el post
anterior
, seleccionamos los esquemas de origen (el que hemos obtenido con
el wizard) y de destino (el que hemos construido manualmente).

 

 
Figura 12: Imagen del mapa antes de
unir los campos.

Como
vemos en la figura anterior el esquema destino es muy parecido el esquema
origen. Las únicas diferencias es que en el esquema destino se han eliminado
los elementos vendedor, direccion  y desc_producto.
Pero esto no es importante ya que la finalidad de este post es explicar cómo
trabajar con estructuras iterativas tanto en el origen y en la salida. Por lo
tanto hay ciertos campos que les uniremos directamente (ver mapa final). Sin
embargo realizaremos un estudio más particular para trasladar los valores del
loop de origen al loop de destino.

En
un primer momento se nos puede plantear la duda de que siguiendo la filosofía
que utilizando los FunctoIds table looping y table extractor necesitaríamos conocer el número de
elementos repetitivas con las que vamos a trabajar, sin embargo vamos a ver
como esto no es así. Simplemente tenemos que insertar en el mapa un table
looping
y dos table extractor ya que solo queremos
extraer dos campos y por lo tanto tendremos dos columnas en la tabla de
configuración del table looping.  Como
hemos mencionado antes, en principio haría falta saber el número de
repeticiones para configurar de manera adecuada las entradas de la función table
looping
, pero en la práctica esto no es así, sino que solamente con
unir los campos que cuelgan del repeating record con el table looping, este es
capaz de saber que pertenecen a un repeating record y completar
dinámicamente y en tiempo de ejecución la tabla de configuración a partir del
número de repeticiones que integran la estructura repetitiva en origen.

Como
explique en el post
anterior
para configurar un table
looping
primero hay que enlazarle con un elemento padre, en nuestro
caso  utilizaremos el nodo raíz del
esquema origen PEDIDO. Unimos los
elementos id_linea y id_producto  que cuelgan del nodo pro_loop. Posteriormente
seleccionamos el table looping  damos botón derecho – Configure Functoid inputs, e insertamos una constante con valor 2,
que corresponde con el número de columnas.

 

 
Figura 13: Pantalla de configuración
de los parámetros de entrada del table looping.

Antes
de pasar a configurar los  debemos de
configurar la tabla del table looping, para ello la seleccionamos, damos botón
derecho y seleccionamos Configure Table Looping Grid, nos
aparecerá una ventana parecida a la siguiente imagen:

 

 
Figura 14: Pantalla de configuración
de la del table looping.

Como
observamos solo tenemos una fila, esto es debido a que el table looping reconoce dinámicamente cuantas veces se tiene que
repetir ya que los parámetros de entrada cuelgan de un repeating record, por lo tanto esto nos facilita el trabajo mucho.

Para
extraer los datos del table looping  conectamos en cascada dos funciones de tipo table
extractor
. Como comentamos, el primero de ellos obtendrá los valores de
la primera columna del table looping, mientras que el
segundo obtendrá los valores de la segunda columna. Para configurar cada table
extractor
, hacemos clic sobre uno de ellos con botón derecho del ratón
y seleccionamos Configure Functoid inputs. Insertamos una constante con el
valor de la columna que queremos extraer, como se observa en la siguiente
figura.

 
Figura 15: Pantalla de configuración
de parámetros de entrada del table extractor.

Para
el otro table extractor le
configuramos igual pero la constante tendrá valor 2. Unimos cada table extractor con el componente del
esquema destino que corresponda. Finalmente unimos el table looping con el nodo raíz del esquema destino, que en nuestro
caso es root, de esta forma ya
tendremos configurado el mapa para poder trabajar con elementos repetitivos
tanto en el esquema origen como en el destino.

 
Figura 16: imagen del mapa final.

 

Seguramente
encontraréis que es mecanismo de tratamiento de estructuras repetitivas en
origen y destino es realmente útil para muchos procesos de negocio que utilizan
las empresas hoy en día.  Un ejemplo
claro de aplicación que hemos probado en el CIIN
es el ciclo de facturación, en el que en un fichero plano origen se especifican
los datos de facturación de un pedido con una serie de líneas de pedido (y que
son las estructuras repetitivas) que tiene que ser enviado en formato EDI a un
cierto destino (el estándar EDI es uno de los ejemplos más claro de documento
que presenta múltiples estructuras repetitivas).

Sin
más, crearíamos la correspondiente orquestación de BTS 2006 que se encargue de
hacer efectiva la transformación definida en el mapa creado, definiríamos los
correspondientes
puertos físicos de recepción y envío
.

 
Figura 17: imagen de la orquestación
de la solución.

Al
probar la solución se generaría el fichero XML esperado.

 

 
Figura 18: fichero XML generado por
Biztalk server 2006.

 
Hasta
aquí ha llegado mi segundo post en geeks, espero que os sea de utilidad. Un
saludo a todos (Os dejo el msi de la aplicación de BTS por si alguno lo queréis
probar).

 

Anuar
Khan Ali Franco


 

2 comentarios en “BTS 2006: Como manejar estructuras repetitivas en el esquema origen y en el esquema destino de un mapa de BizTalk”

Deja un comentario

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