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.


 




Extensiones de VS 2005 para WSSv3: Creando Web Parts!

Con las extensiones de Visual Studio para Windows Sharepoint Services 3.0 es realmente sencillo crear y desplegar Web Parts en sitios WSSv3. Partiendo de un sitio SharePoint básico, los pasos a realizar para crear un web part son los siguientes:


Creación de la Web Part.


§  Crear un nuevo proyecto de Visual Studio 2005 de tipo Sharepoint Web Part.



Tras pulsar OK, vemos como VS 2005 nos genera automáticamente un archivo WebPart1.cs con la sintaxis necesaria para crear una Wb Part en WSSv3 ( clase, referencias necesarias y archivo de claves para posteriormente firmar el assembly).



§  El siguiente paso es añadir el contenido de la clase web part. En este caso el código a añadir devuelve los documentos añadidos durante el día actual en las listas de nuestro sitio de WSSv3. Necesitaremos añadir los siguientes espacios de nombres:


 


o   Para poder utilizar la fecha de sistema de WSSv3 tendremos que añadir a nuestro fichero de clase: Microsoft.Sharepoint.Utilities.


o   System.Data, para acceder a los distintos objetos de datos de .NET.


o   System.Web.UI.WebControls, para acceder a los distintos controles web de .NET.






using System;


using System.Runtime.InteropServices;


using System.Web.UI;


using System.Web.UI.WebControls.WebParts;


using System.Xml.Serialization;


using Microsoft.SharePoint;


using Microsoft.SharePoint.WebControls;


using Microsoft.SharePoint.WebPartPages;


using Microsoft.SharePoint.Utilities;


using System.Data;


using System.Web.UI.WebControls;


 


namespace DemoWebPart


{


    [Guid(«4491608a-a805-4fa1-a7f8-c6c33388501d»)]


    public class DemoWebPart : System.Web.UI.WebControls.WebParts.WebPart


    {


        protected override void Render(HtmlTextWriter writer)


        {


            //Acceso al site de WSSv3


            SPSite Site = SPControl.GetContextSite(this.Context);


            SPWeb Web=Site.OpenWeb();


            //Query para obtener los documentos añadidos hoy a WSSv3


            SPSiteDataQuery Query = new SPSiteDataQuery();


            //Fecha para comparar


            string dtFecha = SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Today);


            //Construimos la query


            Query.Query = «<OrderBy><FieldRef Name=’ID’ /></OrderBy>» +


                        «<Where><Geq><FieldRef Name=’Created’ />» +


                        «<Value Type=’DateTime’>» + dtFecha +


                        «</Value></Geq></Where>»;


            Query.ViewFields = «<FieldRef Name=’Title’ />»;


            Query.Webs = «<Webs Scope=’Recursive’ />»;


            //Mostrar la información


            DataTable tblTabla = Web.GetSiteData(Query);


            DataGrid dgrdGrid = new DataGrid();


            dgrdGrid.DataSource = tblTabla;


            //Si hay filas en la tabla, llenamos el grid.


            if (tblTabla.Rows.Count>0)


            {


                dgrdGrid.DataSource = tblTabla;


                dgrdGrid.DataBind();


                //Renderizamos el control en WSSv3


                dgrdGrid.RenderControl(writer);


            }


            else


            {


                writer.Write(«<b> Ningún ítem ha sido añadido en el día de hoy a las listas.</b>»);


            }


                    }


    }


}


Despliegue de la Web Part


Para desplegar la solución basta con hacer el deploy de la solución. Para ello en el explorador de soluciones (Solution Explorer) seleccionar la solución, pulsar el botón derecho del ratón, seleccionar Deploy Solution. Al hacer el deploy de la solución estamos realizando las siguientes operaciones:


§  Registro del assembly en la GAC del servidor de WSSv3.



 


§  Añadir el assembly como control seguro en el archivo web.config de nuestro sitio de WSSv3 (el path es C:InetpubwwwrootwssVirtualDirectories80).



§  Registrar el assemply dentro de la Solution Management de la administración central de WSSv3: Operations -> Solution Management.



§  Añadir la web part como una feature de WSSv3. Para ver la feature, nos vamos Sites Actions –> Site Settings y luego bajo la columna  Site Collection Administration pinchamos en la opción Site Collection Features. En la página que se abre veremos la feature correspondiente a la web part que hemos desarrollado.



§  Añadir la web part en la galería de web parts de nuestro sitio de WSSv3. Para acceder a la galería los pasos son: Site Actions -> Site Settings   y en la columna Galleries pinchar sobre webparts. En la siguiente página veremos las webparts instaladas y activadas en nuestros sitio WSSv3.




§  Además, en el path de nuestra solución (en la carpeta debug) se generan dos archivos interesantes para poder instalar la web part que hemos creado en cualquier otro sitio de WSSv3:


o   El archivo DemoWebPart.wsp que contiene la descripción de la web part que hemos creado.


o   El archivo setup.bat con los comandos necesarios para desplegar la Web Part y que realiza la misma secuencia de operaciones descritas en la operación de deploy desde VS 2005. Este fichero es el que tendremos que abrir para modificar la url del sitio de WSSv3 dónde queremos desplegar la web part.


Probando la web part.


Para probar la web aprt, nos basta con editar nuestro sitio SharePoint para añadir el WebPart a una página.  Para ello hay que abrir en la página principal de nuestro sitio WSSv3: http://localhost.  Una vez abierta la página ir a Site Actions y seleccionar Edit Page, para entrar en el modo de edición. Una vez en el modo de edición, seleccionar la zona donde se quiere añadir el Web Part, por ejemplo la izquierda (Left) y seleccionar el comando  Add a Web Part. Dentro de la ventana de Add Web Parts to Left seleccionar la Web Part que se quiere añadir (DemoWebPart) y  pulsar el botón Add, con lo que se añade el nuevo Web Part a la página.






Como habéis comprobado, crear y desplegar una Web Part en un sitio WSSv3 es realmente sencillo gracias a las extensiones de VS 2005 para WSSv3. Estas extensiones también nos dan plantillas para definir listas personalizadas, team sites, features, definiciones de sitios o cualquier otro elemento que queramos desplegar (eventos, content types, etc.). Espero que la información haya resultado interesante.

Recursos sobre BizTalk Server 2006!

Estos días he estado preparando un pequeño seminario sobre BTS 2006, lógicamente antes de abordar el tema tuve que realizar una labor de "documentación" y ver lo que la red me ofrecía respecto a este "monstruo" y cómo cabía esperar, hay muchos recursos, por lo que hay que hacer un cierto trabajo de filtrado…bueno, pues aqui os pongo la recopilación de recursos que he hecho sobre el tema y que espero que nos  sirvan en el CIIN para la inmersión profunda que sobre BizTalk tendremos que hacer próximamente.

BizTalk en la práctica:

·         Virtual Labs: novedades de BTS 2006 (importación de aplicaciones, Business Activity Monitoring, …), procesamiento de ficheros planos y ficheros batch, …

http://www.microsoft.com/biztalk/techinfo/virtual-labs.mspx

http://msdn.microsoft.com/virtuallabs/biztalk/

·         Tutoriales: Serie de tutoriales prácticos en:

http://www.microsoft.com/downloads/details.aspx?FamilyID=6a5f6ef4-aeb8-4d8d-a521-37333a875ce4&DisplayLang=en

En estos tutoriales se cubren los siguientes temas:

o   Tutorial 1: EAI.

o   Tutorial 2: Proceso de petición de pedido.

o   Tutorial 3: Proceso de facturación y pago.

o   Tutorial 4: Gestión de relaciones con partners.

o   Tutorial 5: BAM.

·         Ejemplos: con los que se intenta cubrir muchas de las peticiones que la comunidad para extender las funcionaliades de BTS 2006: binding directo a orquestaciones, transacciones atómicas  con servicios COM +, etc.

http://msdn.microsoft.com/biztalk/downloads/samples/

Capacidades de BizTalk:

·         White Papers: cubren aspectos relativos a aspectos de migración hacia BTS 2006, mejoras en adaptadores, herramientas,…

http://www.microsoft.com/downloads/details.aspx?FamilyID=6a5f6ef4-aeb8-4d8d-a521-37333a875ce4&DisplayLang=en

 

Videos de BizTalk:

·         Serie de Webcast sobre BTS 2006 que cubren una gran variedad de aspectos, desde cómo crear soluciones SOA con BTS 2006 hasta la creación de una sencilla aplicación BTS 2006, pasando por la creación de adaptadores LOB:

http://www.microsoft.com/events/AdvSearch.mspx?EventsAndWebcastsControlName=As1%3AAdvSrc&As1%3AAdvSrc%3AAudienceID=0&As1%3AAdvSrc%3AProductID=0a98c8b2-ef77-4c42-b382-34ec5e1bf50f&As1%3AAdvSrc%3AEventType=OnDemandWebcast&As1%3AAdvSrc%3ACountryRegionID=en%7CUS%7CUnited+States&StateProvinceID=0&As1%3AAdvSrc%3ATimeframeID=-1&As1%3AAdvSrc%3ASearchFilter=%C2%A0+Go+%C2%A0

·         Videos en el  channel 9: http://channel9.msdn.com/tags/Biztalk

 

Noticias de Biztalk:

·         Serie de faqs sobre BizTalk:

 

http://geekswithblogs.net/sthomas/archive/2005/12/29/64404.aspx

http://gecheverry.blogspot.com/2005/12/biztalk-server-interview-answers.html

·         Últimas noticias en lo que concierne a BizTalk: http://www.usingbiztalk.com/

Otros recursos interesantes:

·         En The Code Project también hay un montón de links interesantes sobre BTS 2006. Como ejemplos:

http://www.codeproject.com/biztalk/BiztalkToGrandma.asp, resumen de la arquitectura.

http://www.codeproject.com/biztalk/CustomFunctoid.asp y http://www.codeproject.com/useritems/currencyconverterfunctoid.asp sobre desarrollo de functionsId customizados.

http://www.codeproject.com/biztalk/bts_async_call.asp, llamadas asíncronas a servicios web mediante BTS 2006.

·         Eventos (HOLS) sobre BizTalk en España: http://www.microsoft.com/spain/seminarios/hol.aspx , tendrán lugar durante este mes y serán impartidos por Informatica64.

Muchos de los links que os he puesto, así como enlaces a blogs y comentarios sobre BTS están resumidos en esta interesante web: http://www.topxml.com/

 

Espero que esta recopilación os sirva de ayuda.

Acceso anónimo a WSSv3!

En este post voy a comentar como podemos hacer accesible en Internet a usuarios anónimos un sitio WSSv3. Un ejemplo típico de aplicación es que hagamos visible el blog de nuestra intranet a usuarios anónimos sin necesidad de autenticación, pues bien WSSv3 permite configurar este tipo de acceso de modo sencillo desde la Sharepoint 3.0 Central Administration y desde las opciones de acceso a nivel de sitio WSSv3.

Lo primero que tenemos que hacer es asegurarnos que nuestro sitio permite acceso anónimo. Para ello nos vamos a la Sharepoint 3.0 Central Administration , y desde ella a: Application Management -> Authentication Providers, una vez allí hemos de configurar los providers que tengamos para que los sitios dónde se usan permitan acceso anónimo. Por defecto WSSv3 define un provider para autenticación de tipo Windows, aunque podríamos utilizar la opción Forms (que nos permitiría poder usar nuestros propios providers) o Web Single Signon.

Además de habilitar el acceso anónimo, tenemos que tener cuidado con las IIS Authentication Settings, para autenticación de tipo Windows y poder permitir acceso anónimo hemos de marcar la opción NTLM.

 

Al hacer esto nos aparecerá un mensaje informativo de IE advirtiéndonos de que vamos a crear permisos únicos para nuestros sitio. Como es lo que queremos hacer, pulsamos aceptar. Al hacer esto nos aparecerá una nueva opción, Settings, para gestionar los permisos del sitio que antes no teníamos. De entre las posibilidades que nos da la opción Settings aparece la que nos interesa en nuestro caso:

  • Sin más, en la página que nos aparece especificamos a qué nivel queremos habilitar el acceso anónimo. En este caso nos interesa que se pueda ver todo el contenido de nuestro sitio blog. Lo marcamos.

 

  • Una vez que hemos habilitado el acceso anónimo, el siguiente paso es indicar que puede hacer un usuario anónimo en nuestro sitio. Por ejemplo, para permitir que pueda escribir comentarios tendríamos que ir a Blog -> Comments -> Permissions for this list -> Actions -> Edit Permission -> Anonymous Access.

En la página de configuración del acceso anónimo a la lista Comments  bastaría con que marcáramos la opción Add Items y ya tendríamos configurado el acceso anónimo básico al blog.

Sin más, probamos que la url de nuestro blog es accesible desde el navegador de manera anónima, pero no así otras opciones como el acceso a la Home de nuestra intranet o la opción de Signin.

 

En resumen, aquí tenemos otra idea más de las facilidades y flexibilidad que nos da WSSv3 (TR).

Virtual PC 2007 beta y conexión wifi

Hola,

Acaba de aparecer en Connect la versión beta de Virtual PC 2007, compatible con el soporte de virtualización de hardware de los nuevos procesadores y de Window Vista, tanto anfitrión como invitado. Podéis solicitar la participación en la siguiente URL (la descarga es inmediata):

https://connect.microsoft.com/programdetails.aspx?ProgramDetailsID=874

Como novedad frente a Virtual PC 2004 y Virtual Server, y al menos con mi tarjeta Wireless (intel 3945ABG), parece que funciona el uso compartido de la tarjeta wifi en la máquina virtual. Para ello, es necesario activar el módulo de "Virtual Machine Network Services" en las propiedades de la tarjeta de red, ya que por defecto sólo está activo en la tarjeta ethernet.

La conectividad de las máquinas virtuales funciona asociando una MAC diferente a la tarjeta de red virtual, y separando luego el tráfico que va para la máquina física o para la virtual en función de esta MAC. Los estándares de WIFI prohíben este cambio de MAC, pero el caso es que virtual pc 2007 lo hace y funciona.

El rendimiento parece bueno, y las máquinas de virtual server arrancan sin problemas.

Flexibilidad de WSSv3: Acceso a Datos!

WSSv3 no sólo nos da flexibilidad en la definición de workflows, también en otros aspectos como accesos a datos, personalización, despliegue de features,…Así por ejemplo, si queremos mostrar datos de una BD en nuestro sitio WSSv3, tenemos dos posibilidades:


·         Mostrarlos de modo estático utilizando controles de ASP.NET 2.0.


·         Mostrarlos de manera más dinámica (en cualquier parte de nuestro sitio de WSSv3) a través del uso de web parts.


La idea es la misma que para la creación de workflows, es decir, para mostrar datos de manera estática (en una página de nuestro sitio WSSv3) es suficiente con utilizar Sharepoint Designer 2007 (SD 2007, Technical Refresh), mientras que para mostrarlos más dinámica (en cualquier página de nuestro sitio) tendremos que crear una webpart de acceso a datos con VS 2005. Los datos los mostraremos para los dos casos en la página principal.



Acceso a datos desde SD 2007


Abrimos nuestro sitio WSSv3 desde SD 2007 y accedemos a la página principal en vista de diseño. En el cuadro de herramientas que nos ofrece SD 2007 podemos encontrar una sección específica de controles ASP.NET 2.0, y dentro de esta una subsección con controles de acceso a datos de una BD, así como para su visualización. En particular, vamos a utilizar los controles SqlDataSource y GridView.



Tras añadir estos controles a nuestra página (arrastrándolos desde el menú de controles), tenemos que  configurarlos de manera adecuada. Esta configuración la podemos hace a través de la ventana de propiedades que nos ofrece SD 2007 o bien mediante la ayuda visual disponible en la vista de diseño de los controles. Así, por ejemplo el control SqlDataSoruce lo podemos configurar fácilmente a través del wizard que nos ofrece SD 2007, en el que especificaremos el proveedor de acceso a datos (SQL Server), la base de datos, el modo en que accederemos a la base de datos  (autenticación Windows o SQL), la tabla de la que queremos extraer los datos y finalmente la consulta a realizar.





El siguiente paso será configurar el control GridView para que tenga el aspecto deseado y que muestre los datos del control de datos (el SqlDataSource anterior) que  indiquemos, de nuevo lo hacemos mediante la ayuda gráfica que nos proporciona SD2007.









 


Finalmente, si nos vamos a la página principal (después de guardar los cambios) de nuestro sitio de WSSv3, veremos cómo los datos aparecen en la página principal tal y como queríamos de un modo estático.



Creación y despliegue de la webpart de acceso a datos con VS 2005


Para crear una web part de acceso a datos, basta con crear un proyecto de tipo Class Library en VS2005 y seguir los siguientes pasos:

          Añadir las referencias System.Web.dll y Microsoft.Sharepoint.dll para poder crear una webpart de ASP.NET y utilizar el modelo de objetos de WSS respectivamente.


          Creamos el Data Source de acceso a nuestra fuente de datos desde el menú contextual de de VS2005: Data -> New Data Source -> Database. Tras elegir estas opciones, vemos que el wizard de configuración es idéntico al que utilizamos en SD 2007, por lo que los pasos para la creación del Data Source son los ya indicados.


          Añadimos el siguiente código al archivo de clase de nuestro proyecto de tipo Class Library:







using System;


using System.Collections.Generic;


using System.Text;


using System.Data;


using System.Web.UI.WebControls;


using System.Web.UI.WebControls.WebParts;


using Microsoft.SharePoint;


using Microsoft.SharePoint.WebControls;


using Microsoft.SharePoint.Utilities;


















namespace WebPartAccesoDatos


{


    public class AccesoDatos: WebPart


    {


        protected override void RenderContents(System.Web.UI.HtmlTextWriter writer)


        {


            ClientesDataSet dsClientes = new ClientesDataSet();


            ClientesDataSetTableAdapters.Md_ClientesTableAdapter Adaptador = new


            WebPartAccesoDatos.ClientesDataSetTableAdapters.Md_ClientesTableAdapter();



            Adaptador.Fill(dsClientes.Md_Clientes); 


            DataGrid grdClientes = new DataGrid();


            grdClientes.DataSource = dsClientes.Md_Clientes;



            if (dsClientes.Md_Clientes.Rows.Count > 0)


            {


                grdClientes.DataSource = dsClientes.Md_Clientes; 


                grdClientes.DataBind(); 


                grdClientes.RenderControl(writer); 


            }


            else


            {


                writer.Write(«<b>Ningun item ha sido añadido en el día de hoy a las listas.</b>»); 


            }               


        } 


    }


}



Basicamente lo más importante del código anterior es que nuestra clase hereda de la clase System.UI.WebControls.WebParts.WebPart y que necesitamos sobreescribir el método RenderControls para que nuestra webpart se comporte como queremos.



            Firmamos el ensamblado, ya que para poder desplegar la webpart en WSS es condición necesaria.


Una vez que hemos creado el ensamblado con la webpart de acceso a datos, el siguiente paso es desplegarla en nuestro sitio WSS. Los pasos necesarios son los siguientes:


          Registrar el ensamblado resultante en la CAG.


          Editar el archivo web.config del sitio WSS para añadir el ensamblado creado como un control seguro y añadir en la sección de <SafeControls> las siguientes líneas (que identifican nuestro ensamblado como un control seguro desplegable en WSSv3):








<SafeControl Assembly=»WebPartAccesoDatos, Version=1.0.0.0, Culture=neutral, PublicKeyToken=03918f13efcac312″ Namespace=»WebPartAccesoDatos» TypeName=»*» Safe=»True» AllowRemoteDesigner=»True» />    


















          Exponer para su uso la webpart que acabamos de desplegar. Lo haremos desde Sitio de WSS -> Web  Part Gallery -> Add New Web Parts.






El último paso sería utilizar la webpart en nuestro sitio de WSSv3 sin más que añadirla a la página principal desde  la opción de personalización Site Actions -> Edit Page que nos da WSSv3.




Y esto es todo, de nuevo vemos que WSSv3 nos da mucha flexibilidad en cuanto a herramientas y capacidades para realizar accesos a datos, construir workflows o realizar personalizaciones.


 


 

Flexibilidad de WSSv3: Creación de workflows!

Una de las novedades (como ya habréis leído, oído, probado,…) de WSSv3 es la posibilidad de crear workflows que nos permitan gestionar contenidos, integrarnos con otras aplicaciones, etc. Para definir estos workflows, tenemos dos herramientas tan distintas como son Sharepoint Designer 2007 (SD 2007, Technical Refresh) y Visual Studio 2005 (con las extensiones de Windows Workflow Foundation y las correspondientes plantillas de definición de workflows para WSS, disponibles con el starter kit de la beta 2). En este post  os mostraré como podemos crear el mismo workflow con ambas herramientas, y como la forma de definición, modelado y despliegue del mismo son diferentes, pero conducen al mismo resultado. El workflow que crearemos consistirá en enviar un e-mail al responsable de gestionar los eventos del calendario de nuestra organización cada vez que se cree un ítem en él. Empecemos.

Creación del workflow con SD 2007

Tras abrir nuestro sitio WSSv3 con SD 2007, vamos al menú contextual de creación de workflows con lo que se  abrirá un wizard para la definición del workflow. Le damos un nombre a la instancia de workflow, seleccionamos la lista de WSSv3 que nos interese (en este caso Calendar) y marcamos la opción de que nuestro workflow se inicie de modo automático.

Lo siguiente que haremos es configurar que tiene qué hacer nuestro workflow, en este caso enviar un e-mail cada vez que se cree una nueva entrada en el caledario. Como no vamos a definir ninguna condición para el envío del e-mail, lo único que tenemos que hacer es definir una acción (actividad en VS) de envío de e-mail.

Configuramos adecuadamente el e-mail a enviar cuando se cree el ítem en el calendario: destinatario del e-mail, subject, y el cuerpo del e-mail (en el ejemplo he añadido algunos campos del ítem utilizando la opción Añadir Campos de Búsqueda que nos ofrece SD 2007). Una vez configurado el workflow, probamos que funciona correctamente (botón Comprobar flujo de trabajo) y lo desplegamos contra nuestro sitio WSS (botón Finalizar), y ya tendemos vinculado el workflow con la lista Calendar de nuestro sitio.

Creación del workflow con VS 2005

Para crear el workflow anterior en VS 2005 dentro de la sección de C# escogemos de tipo Windows Sharepoint Services, y seleccionamos la plantilla adecuada (Sharepoint Sequential Workflow Library en este caso, puesto que estamos modelando un workflow de tipo secuencial).

Una vez creado el proyecto, abrimos el archivo workflow1.cs que nos permitirá modelar nuestro workflow de manera visual, así como acceder a la vista de código para definir su comportamiento. Al abrir este fichero, vemos que por defecto ya tenemos una actividad agregada, OnWorkflowActivated, que es la actividad de inicio del workflow. Lo siguiente que haremos será añadir la actividad de envío de e-mail sin más que seleccionarla en la toolbox y arrastrarla a la ubicación correcta en la superficie de diseño (debajo la actividad de inicio).

La actividad de envío de e-mail la tendremos que configurar para que tenga el mismo CorrelationToken que la actividad de inicio y establecer de esta manera el canal de ejecución del workflow. Además, para esta actividad también configuraremos las propiedades Header y Body (bien en modo visual o en la vista de código) para posteriormente definir el e-mail a enviar. Una vez configurado el workflow en modo diseño, tenemos que definir su comportamiento en la vista de código (a través de los Handlers de cada actividad). Este sería el código de los handlers de las actividades del workflow:

//Manejador actividad de inicio del workflow.

        private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e)

        {

            workflowId = workflowProperties.WorkflowId; //inicializamos el identificador del workflow

        }

      

        //Manejador que envía gestiona el envio del e-mail

        private void sendEmail1_MethodInvoking(object sender, EventArgs e)

        {

            //Variables que contendrán la información a enviar en el e-mail!

            string starttime = "";

            string endtime = "";

            string description = "";

            //Elementos de WSSv3

            SPSite site = new SPSite("http://localhost");

            SPWeb web = site.OpenWeb();

            SPList list = web.Lists["Calendar"];

            SPListItemCollection listcollection = list.Items;

            foreach (SPListItem listitem in listcollection)

            {

                if ((string)listitem["Title"] == (string)workflowProperties.Item["Title"])

                {

                    for (int i = 0; i < listitem.Fields.Count; i++)

                    {

                        SPField campo = listitem.Fields[i] ;

                        if (campo.InternalName == "EventDate"

                                || campo.InternalName == "EndDate"

                                || campo.InternalName == "Description")

                        {

                            if (listitem[campo.InternalName] != null)

                            {

                                //Fecha de inicio del evento

                                if (campo.InternalName == "EventDate")

                                {

                                    starttime = listitem[campo.InternalName].ToString();

                                }

                                //Fecha de fin del evento

                                if (campo.InternalName == "EndDate")

                                {

                                    endtime = listitem[campo.InternalName].ToString();

                                }

                                //Descripción del evento

                                if (campo.InternalName == "Description")

                                {

                                    description = listitem[campo.InternalName].ToString();

                                }

                            }

                        }

                    }

                }

            }

            //Configuramos el e-mail a enviar!

            cabecerasEmail.Add("To", "jcgonzalez@ciin.es");

            cabecerasEmail.Add("Subject", "Nuevo evento en el calendario!");

            cabecerasEmail.Add("From", workflowProperties.OriginatorEmail);

            cuerpoEmail = "Se ha programado un nuevo evento en el calendario:  " + workflowProperties.Item["Title"] +

                               ". Características del evento: <br>" + description + "<br>" +

                               "La duración del evento será de " + starttime + " a " + endtime + ".";

                               

        }

Lo siguiente que tenemos que hacer es compilar nuestro assembly, firmarlo (puesto que para poder desplegarlo en WSS es condición indispensable) y ya estamos listos para desplegarlo  (lo haremos como una feature, que es la opción que nos da por defecto VS 2005) en el sitio de WSSv3, para ello tenemos que realizar los siguientes pasos:

§  Configurar el fichero de feature adecuadamente (tiene que referenciar al fichero de manifiesto del workflow).

§  Configurar el fichero de manifiesto, siendo la sección más importante la siguiente:

<Workflow

       Name="Ejemplo de Workflow secuencial"

       Description="Ejemplo de workflow que crea una tarea de revisión."

       Id="FE543FCF-DCB3-41b5-BA88-4C783C6C0B43"

       CodeBesideClass="VS2005_WSS_Sequential_Workflow.Workflow1"

       CodeBesideAssembly="VS2005_WSS_Sequential_Workflow, Version=3.0.0.0, Culture=neutral, PublicKeyToken=67c7fb61eb566506">

    <Categories/>

§  Configurar adecuadamente el archivo de instalación de la feature para que registre el assembly en la caché del servidor de WSSv3, instale la feature y la active.

Si todo ha ido bien, tendremos disponible nuestro workflow en el sitio de WSSv3. Para comprobarlo, vamos a asociar el workflow a la lista de tipo calendario (a través de List Settings -> Workflows Settings) de WSS.

Una vez creada la instancia del workflow, veremos como en la lista Calendar tenemos dos workfows disponibles.

Probando los workflows

Para probar los workflows, basta con que creemos un nuevo elemento en el calendario y comprobemos que nos llegan dos e-mails avisándonos de que tenemos un nuevo evento en el mismo.

Finalmente, para cerrar el post os pongo una comparativa de las implicaciones de modelar workflows con SD 2007 o VS 2005.

Worflows diseñados con el Diseñador VS 2005

Workflows diseñados con SD 2007

Se pueden escribir workflows para WSS o MOSS.

Se pueden escribir workflows para WSS o MOSS.

Los archivos de código permiten escribir código customizado para modelar procesos de negocio.

El fichero de reglas de workflow encapsula los procesos de negocio.

Se pueden asociar a múltiples sitios y listas.

Sólo se pueden asociar a una única lista en tiempo de diseño.

Los distintos ficheros que componen el workflow se compilan en un assembly.

Los distintos ficheros que componen el workflow se almacenan sin compilar en una librería de documentos específica de WSS.

El workflow (template) ha de estar asociado con cada lista o elemento en que debe estar disponible.

La asociación se da en el momento en que se crea el workflow en una cierta lista.

Se puede usar cualquier tipo de formulario: ASPX o InfoPath.

Solo se pueden utilizar formularios de tipo ASPX.

Worflows diseñados con el Diseñador VS 2005

Workflows diseñados con Sharepoint Designer 2007

Se pueden incluir modificaciones en el workflow

No permite incluir modificaciones en el workflow.

Se puede crear actividades customizadas.

Sólo se pueden usar las actividades disponibles

El assembly y definición del workflow se empaquetan como una feature de WSS, y luego se despliegan en el sitio (manual).

El despliegue es realizado de forma automática.

Se puede usar un formulario de inicialización para recoger información del usuario cuando se arranca el workflow.

Se puede usar un formulario de inicialización para recoger información del usuario cuando se arranca el workflow.

Se pueden usar formularios customizados para interactuar con tareas de WSS.

Se pueden usar formularios customizados para interactuar con tareas de WSS.

Disponible debugging de VS.

No es posible el modo debugging.

Se pueden crear workflows secuenciales y de máquina de estados.

Sólo se pueden crear workflows de tipo secuencial.

Bueno, puesto esto ha sido todo. Espero que el post os resulte de utilidad.