BTS 2006: Integración con SQL Server (II)

En el post previo de BizTalk Server 2006 (BTS 2006) os comentaba las capacidades de integración de BTS 2006 gracias al conjunto de adaptadores de que dispone. Como vimos, insertar datos en una base de datos SQL Server es bastante sencillo si se construye adecuadamente el esquema XML de inserción de datos y se configuran los puertos de recepción y envío necesarios. En este post vamos a ver como aplicando la misma filosofía se pueden extraer los datos de una o varias tablas de SQL Server 2005 y volcarlos como archivos XML en una lista de WSS.


Pasos previos a la extracción de datos


Como paso previo a la extracción de datos, definiremos un procedimiento almacenado (SP) de SQL Server que realice la operación de obtención de los datos relativos a las facturas cargadas (ver post previo). Como veremos posteriormente, este procedimiento almacenado será ejecutado desde una  receive location asociada a un puerto de recepción.






if exists (select * from sysobjects where name=’ExtraerFacturas’ and type=’P’)


            drop proc ExtraerFacturas


go


CREATE procedure ExtraerFacturas


as


            begin


                        select F.IDFactura, F.FechaFactura, DF.TotalFactura


                                   from Facturas F


                                   left join Detalle_Factura DF on


                                   DF.IDFactura=F.IDFactura


                                   for XML AUTO,XMLData,Elements


            end


 


(Notas: Este ejemplo de SP es muy sencillo. Se podría haber definido un SP para escenarios más  complejos en los que se necesiten extraer los datos necesarios para construir un informe).


Configurando los puertos necesarios de BTS 2006


Una vez definido el SP de extracción de datos tenemos que implementar en BTS 2006 el mecanismo de ejecución de dicho SP y el volcado del resultado en una lista de WSSv3.  Para ello, y a través de la BizTalk Administration Console, tenemos que definir los siguientes elementos:


·         Un puerto de recepción con la correspondiente ubicación de recepción que se encargará de realizar la ejecución efectiva del SP. Veamos como configurar dicha ubicación de recepción. El tipo de transporte tiene que ser SQL, y en la configuración tenemos que especificar:


o   La cadena de conexión, que especificaremos a traves de la ventana de configuración correspondiente.


o   El elemento raíz del documento XML que se va a generar como consecuencia de la generación del SP.


o   El target namespace para el documento XML.


o   El comando SQL que vamos a ejecutar (nuestro SP).



Como vemos, además podríamos especificar el intervalo entre consultas.


·         Un puerto de envío, que hemos e configurar para que se suscriba al puerto de recepción anterior y vuelque los datos extraídos a una librería de documentos de WSS (Del mismo modo que enviamos los datos en WSS, los podríamos enviar a una cuenta de correo, otra BD SQL Server, un carpeta, una ubicación FTP, etc utilizando para ello los distintos adaptadores que nos ofrece BTS 2006). La parte de suscripción ya la vimos en un post previo de BTS 2006, por lo que nos centraremos en las configuraciones necesarias para subir los datos a WSS. En este caso, cuando creemos el puerto de envío, especificamos que el tipo de transporte sea WSS y lo configuramos de manera adecuada:


o   Destination Folder, que especifica el nombre de la librería de documentos de WSS dónde vamos a subir los resultados de nuestras consultas periódicas.


o   Filename, en el que especificamos %MessageId%.xml para que nos cree por  cada consulta un mensaje XML único.


o   SharePoint Site Url, en el que especificamos la url del sitio de WSS dónde vamos a subir las facturas.



Probando la extracción



Sin más, para probar que la extracción de datos funciona correctamente  habilitamos la ubicación de recepción SQL creada, iniciamos el puerto de envío y comprobamos que en la librería de documentos creada en WSS van apareciendo los documentos XML correspondientes a las ejecuciones del SP definido (en este caso dejamos el polling interval de 30 segundos que nos venía por defecto en la ubicación de recepción).



Después de refrescar el sitio de WSS:



Y este sería el contenido de uno de los archivos XML subidos:



Bueno, pues  aquí finaliza la serie de dos post de integración de BTS 2006 con SQL Server. Estad seguro de que publicaremos nuevas cosas conforme sigamos probando cosas de BTS 2006 en el CIIN. Espero que el post os haya resultado interesante.


 

BTS 2006: Integración con SQL Server (I)

Como os comentaba en un post previo de BizTalk Server 2006 (BTS 2006), recientemente en el CIIN hemos preparado (mi compañero de batallas Anuar y yo) un pequeño piloto con el objetivo de mostrar algunas de las prestaciones  de esta plataforma para resolver problemáticas de negocio específica, las posibilidades de integración que ofrece, sus capacidades BMP (Business Process Management), y las facilidades que aporta a la hora de administrar y gestionar los diferentes procesos de negocio desplegados. En particular, en este post y el siguiente voy a comentar como BTS 2006 facilita el intercambio de datos entre aplicaciones de una organización (escenario EAI) o entre socios de negocio (escenario B2B) a través de un conjunto de adaptadores que proporcionan la conectividad necesaria para permitir estos intercambios de datos. En el ejemplo desarrollado, os mostraré como de un modo muy sencillo se pueden insertar datos en una BD SQL Server 2005, y luego extraerlos para su envío a una lista de WSS (esta parte la desarrollaré en la segunda parte del post). Empecemos.


¿Qué es un adaptador en BTS 2006?


Antes de meternos en materia, creo que no está de más entender que es un adaptador. De acuerdo a la documentación online de BTS 2006 (descargable aquí), un adaptador es un componente software que permite enviar y recibir datos encapsulados en mensajes XML a través de distintos mecanismos de transporte: SMTP, POP3, MSMQ, SQL, WSS, etc. y otros que habilitan integración nativa con aquellas aplicaciones que los utilicen de una modo estándar.  Además de los adaptadores que vienen por defecto con BTS 2006, existen otros que  han ido desarrollando desde la propia Microsoft como es el caso del adaptador Microsoft CRM, o por partners como el adaptador de Attunity para el entorno Natural-Adabas. Por supuesto, dado el carácter extensible de BTS 2006,  se pueden definir adaptadores personalizados y a medida para resolver problemáticas concretas.


Insertando datos en SQL Server 2005


Para insertar datos en una BD, lo primero que tenemos que es definir crear el documento XML de intercambio (en un ejemplo real, una aplicación o entidad de negocio nos entregaría este documento, y a través de BTS 2006 insertaríamos los datos en la BD SQL) que cumpla con la especificación de BTS 2006 para poder insertar datos en una BD SQL Server:



Como vemos en el esquema anterior, hay dos puntos clave:


·         Dentro del elemento raíz <ReqRoot>, el atributo xmlns:updg=”urn:schemas -microsoft -com:xml -updategram”  que indica que vamos a realizar una operación de inserción de datos.


·         Los nodos hijos que identifican la tabla que vamos a actualizar y cuyos atributos coinciden con los campos de la tabla: <Facturas IDFactura=”BL0213″ FechaFactura=”2000-10-24″ />


Una forma de construir de manera automática el esquema que sigue el documento XML anterior es a través de la utilidad Add Generated Items que tenemos disponible para los proyectos de BTS 2005 en Visual Studio 2005. Esta utilidad nos permite generar esquemas XSD para ser utilizados en adaptadores de BTS 2006.



Esta opción nos permitirá definir estos esquemas para los adaptadores registrados (en nuestro caso, para el adaptador SQL). Como vemos en la siguiente figura, el wizard nos va guiando en las configuraciones necesarias para poder generar el correspondiente esquema XSD (especificar el servidor de BD SQL Server, la base de datos, etc.).



Los siguientes pasos en la configuración pasan por especificar el espacio de nombres para nuestro esquema y si lo vamos a utilizar en un puerto físico de recepción o de envío de BTS 2006. En este caso lo que queremos hacer es recoger un archivo XML y volcar su contenido en la BD, luego especificamos que el puerto sea de envío.


 


A continuación especificaremos que vamos a insertar los datos a través de una sentencia SQL (opción updategram), y finalmente la tabla de datos y las columnas a actualizar.  Llegado a este punto, hemos concluido el proceso de generación del XSD, que nos aparecerá en nuestra solución de BTS 2006. Sin más, a través de la opción Generate Instance, podemos crear un XML que cumpla el esquema XSD autogenerado.



Antes de seguir, seguro que os habréis dado cuenta de una limitación del wizard: sólo permite insertar datos en una tabla, mientras que el esquema XML de más arriba parece que permite insertar datos en múltiples tablas. A pesar de esta limitación, la idea de enseñaros este wizard es ver como generar el XSD que necesitaríamos y a partir de él ver la estructura del XML que lo cumple, para de esta manera deducir fácilmente como podemos modificar esa estructura para poder actualizar más de una tabla de la BD.


Una vez que ya tenemos el XML, tenemos que implementar en BTS 2006 el mecanismo de recogida del fichero XML de una carpeta local y el volcado de datos en la carpeta SQL Server.  Para ello, y a través de la BizTalk Administration Console, necesitamos definir:


·         Un puerto de recepción con la correspondiente ubicación de recepción que recogerá el archivo XML de la carpeta que especifiquemos (también podríamos definir que se recogieran los datos de una ubicación FTP, de un buzón POP3, etc.).


 



  • Un puerto de envío, que hemos e configurar para que se suscriba al puerto de recepción anterior e inserte los datos en la BD SQL Server. La parte de suscripción ya la vimos en un post previo, por lo que nos centraremos en las configuraciones necesarias para insertar los datos en la BD SQL Server. En este caso, cuando creemos el puerto de envío, especificamos que el tipo de transporte sea SQL y lo configuramos de manera adecuada.

Como veis, la configuración del transporte SQL es realmente sencilla. Sólo tenemos que especificar la cadena de conexión y el nombre del esquema que se va a utilizar en el intercambio de datos.


 


Probando la inserción


 


Sin más, para probar que la inserción de datos funciona correctamente colocamos un archivo XML en la carpeta especificada en la ubicación de recepción del puerto de recepción creado y a través del SQL Server Management Studio comprobamos que la inserción de datos se ha realizado tal y como esperábamos.


 


 


Bueno, pues hasta aquí la primera entrega de la integración de BTS 2006 con SQL Server. En el próximo post veréis como es todavía más sencillo extraer datos de SQL Server. Espero que el post os haya resultado interesante.

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.

BTS 2006: Como suscribirse a mensajes suspendidos

Aprovechando que en el CIIN hemos estado trabajando en un pequeño piloto demostrativo de las capacidades de Biztalk Server 2006 (BTS 2006), voy a comentar algunas de las cosas interesantes que hemos probado en el mismo y que dan una pequeña idea de las enormes capacidades de este producto a nivel de facilitar la gestión de las soluciones de negocio desplegadas. En particular, me centraré en cómo es posible capturar mensajes suspendidos desde un puerto de envío de BTS 2006.


Los mensajes suspendidos en BizTalk son aquellos que se generan cuando por alguna razón se ha producido un fallo en un adaptador, un puerto de recepción, un mapa de BizTalk o una orquestación. Estos mensajes suspendidos se almacenan en la base de datos de mensajería de BizTalk, MessageBox, y los podemos visualizar a través de la BizTalk Administration Console. Para ello pinchamos en BizTalk Group [NombreServidor:BizTakkMngDB] (que nos permite acceder a toda la información relativa a la gestión a las soluciones de negocio desplegadas en el servidor: aplicaciones de BizTalk, mensajes suspendidos, procesos en ejecución, etc.) y luego en la sección Suspended Items podremos ver los mensajes que se encuentran en la MessageBox en estado suspendido.



Como vemos, los elementos suspendidos se agrupan en dos categorías: elementos suspendidos debido a que se ha producido un fallo en un puerto de recepción / envío, en una orquestación o en un mapa de BizTalk, y elementos suspendidos debido a que se ha producido fallos en el adaptador MSMQT. Nosotros nos vamos a centrar en los mensajes suspendidos que se generan cuando falla una instancia de servicio no MSMQT. Como vemos, cuando se produce un fallo en una instancia puede suceder que se quede en estado Resumable o en estado No-resumable, es decir, la instancia que ha producido el error se recupera o no. En cualquiera de los dos estados, se generarán mensajes suspendidos  en la MessageBox. Estos mensajes suspendidos los podemos visualizar desde la pantalla anterior. Así, si pinchamos en la opción Resumable, accederemos al listado de instancias que han fallado y han generado mensajes suspendidos.



Si vemos el detalle de una de las instancias suspendidas, podremos acceder a los detalles del servicio suspendido, información sobre el error (en nuestro caso, aparecerá algo del estilo Suspending message: 227ea975-da93-48e3-9fe0-a45a880a85c1), y detalles del mensaje suspendido que se ha generado.




Suscribiendo a mensajes suspendidos


Como hemos visto, al producirse un fallo en una cierta instancia se generan mensajes suspendidos que se quedan en la MessageBox, pero para ser conscientes de ello tenemos que ir a la consola de administración de BizTalk y refrescar cada cierto tiempo la información de gestión para visualizar si se ha producido un error, así como el mensaje suspendido generado. Para automatizar esta labor, BTS 2006 permite que nos suscribamos a los mensajes suspendidos de la MessageBox en un puerto físico de envío o en una orquestación para hacer el tratamiento de error correspondiente. El hecho de poder suscribirnos a los mensajes suspendidos, nos permitirá volcar esos ficheros  bien en una carpeta local o remota (FTP), en WSS, como attachment en un correo electrónico, etc. Para generar estos mensajes suspendidos, forzaremos un fallo en una de las partes del piloto de BizTalk que hemos desarrollado en el CIIN. Este piloto, entre otras funcionalidades, permite generar ficheros EDI a partir de un fichero de datos no EDI (un fichero XML en este caso).  La generación del fichero EDI es realizada por el adaptador EDI de BTS 2006, por lo que provocaremos el fallo en el formato de los datos origen (en este caso, la cadena de datos origen tiene una longitud superior a la esperada por el adaptador EDI).



Para suscribirnos al mensaje suspendido, tenemos que crear  un puerto de envío y configurarlo adecuadamente para que capture estos mensajes. En este caso, vamos a crear un puerto de envío que envíe el mensaje suspendido por e-mail. Para ello, en la administración central de BizTalk nos vamos a la sección Send Ports de la aplicación en la que queremos capturar los mensajes suspendidos. Hacemos click con el botón derecho y seleccionamos la opción New -> Static One-way Send Port. De este modo se nos abrirá el wizard para la creación y configuración de puertos físicos de envío en BTS 2006.



En la pantalla de configuración especificamos el nombre del puerto de envío, el tipo de transporte que será SMTP, y la pipeline de envío a utilizar (utilizamos en este caso la pipeline que da por defecto BizTalk: PassThruTransmit, que recoge sin tratar un mensaje de una cierta ubicación, la MessageBox en este ejemplo, y lo envía al destino, la buzón de correo electrónico con la que configuraremos el puerto de envío).



El siguiente paso es configurar el transporte SMTP de manera adecuada. Para ello pulsamos el botón Configure de la pantalla anterior y configuramos las propiedades siguientes:


·         Pestaña General: dirección de e-mail del remitente.


·         Pestaña Attachments: especificamos la opción Attach all parts para que en el e-mail se envíe el mensaje suspendido.


·         Pestaña Handler Override: aquí especificaremos el servidor de correo saliente y el remitente.



Hasta aquí hemos configurado como se va a realizar el envío del mensaje suspendido, pero en ningún sitio hemos indicado como se realiza la suscripción a un mensaje suspendido debido a que se haya producido un error en alguna parte de nuestra aplicación. La suscripción se indica desde la opción Filters dentro de las propiedades del puerto de envío. Esta opción nos permite definir en el puerto de envío filtros para determinar que mensajes son encaminados desde la MessageBox a nuestro puerto. En este caso nos interesa encaminar los mensajes que se han generado como consecuencia de que no se ha podido generar un archivo EDI, por lo que aplicamos el filtro: ErrorReport.SendPortName==NombrePuertoEnvioEDI.



De esta forma, estamos especificando que queremos aquellos mensajes suspendidos producidos como consecuencia de que el puerto de envío encargado de entregar los mensajes EDI no ha podido realizar tal entrega debido a que se ha producido un error en la generación del archivo EDI por parte del adaptador de EDI de BTS 2006. Sin más, habilitamos el puerto y lo iniciamos para que se quede a la espera de los mensajes suspendidos de acuerdo al filtro aplicado.


Probando la suscripción


Para probar que todo funciona según lo esperado,  basta con alimentar la solución de generación de archivos EDI con un archivo XML que presenta errores en los formatos de los datos. Como consecuencia de estos errores, el adaptador de EDI no podrá generar el archivo correspondiente y el puerto de envío no podrá entregarlo, por lo que se generará un mensaje suspendido en la MessageBox que nos debería llegar a nuestro buzón de correo.



Bueno, pues hasta aquí el tema de suscripción a mensajes suspendidos en la MessageBox. Espero que el post os haya resultado interesante.