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.

Publicado por

Juan Carlos González

Juan Carlos es Ingeniero de Telecomunicaciones por la Universidad de Valladolid y Diplomado en Ciencias Empresariales por la Universidad Oberta de Catalunya (UOC). Cuenta con más de 12 años de experiencia en tecnologías y plataformas de Microsoft diversas (SQL Server, Visual Studio, .NET Framework, etc.), aunque su trabajo diario gira en torno a SharePoint & Office 365. Juan Carlos es MVP de Office Servers & Services desde 2015 (anteriormente fue reconocido por Microsoft como MVP de Office 365 y MVP de SharePoint Server desde 2008 hasta 2015), coordinador del grupo de usuarios .NET de Cantabria (Nuberos.Net, www.nuberos.es), co-fundador y coordinador del Grupo de Usuarios de SharePoint de España (SUGES, www.suges.es), así como co-director de la revista gratuita en castellano sobre SharePoint CompartiMOSS (www.compartimoss.com). Hasta la fecha, ha publicado 8 libros sobre SharePoint & Office 365 y varios artículos en castellano y en inglés sobre ambas plataformas.

14 comentarios en “Flexibilidad de WSSv3: Creación de workflows!”

  1. Hola!
    Trasteando un poco más con como acceder a las propiedades de un elemento de una lista de WSS, y con la ayuda de mi compañero Ángel Acha, he encontrado una forma menos enrevesada para acceder a las propiedades del item a partir de la propia estructura del objeto SPWorkflowActivationProperties. Este sería el código:

    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
    SPListItem listItem = workflowProperties.Item;
    starttime = listItem[“EventDate”].ToString();
    endtime = listItem[“EndDate”].ToString();
    description = listItem[“Description”].ToString();

    //Configuramos el e-mail para envío.
    cabecerasEmail.Add(“To”, “jcgonzalez@ciin.es”);
    cabecerasEmail.Add(“Subject”, “Workflow VS 2005 – 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:
    ” + description + “
    ” +
    “La duración del evento será de ” + starttime + ” a ” + endtime + “.”;
    }

  2. Hola muy bueno tu post ahora una dudita:
    en mi caso tengo instalado el WSS en un servidor y el Visual Studio en mi PC, una vez creado el proyecto cuando voy a ver el flujo da error, me di cuenta que faltaban dos referencias: Microsoft.SharePoint.dll y microsoft.sharepoint.WorkflowActions.dll, ninguna de ellas esta en pc y si en el servidor.
    Tengo que instalar el wss en mi pc para poder desarrolla flujos en Visual Studio?????

  3. Hola lilicitica, no hace falta que instales wss en tu PC…esto me lo han preguntado en un post que escribí sobre creación de web parts…te dejo el link con los comentarios que puse:
    http://geeks.ms/blogs/ciin/archive/2006/12/01/extensiones-de-vs-2005-para-wssv3-creando-web-parts.aspx

    Vamos, que te tienes que llevar las dll a tu PC para que te compile sin problemas y luego pasar a hacer las pruebas en pre-producción y producción.

    Un saludo

    JC

  4. Si así lo hice pero sucede que entonces la actividad OnWorkflowActivated que sale ya añadida al proyecto me dice que no puede encontrar sus propiedades, la quito pongo otra OnWorkflowActivated y sigue en las mismas…

  5. Hola de nuevo!
    El GUID lo generas desde VS 2005 en la opción del menú Tools > Create GUID. El tema del GUID es muy importante, puesto que tienes que asegurarte que sea único y no exista, lo que consigues generándolo desde VS 2005. Tendrás que generar un GUID para el feature.xml y otro para el workflow.xml.
    Ten cuidado también con el Key Token del Assmebly, este lo puedes obtener con el Reflector de Lutz Roeder: http://www.aisto.com/roeder/dotnet/

    Espero que te haya aclarado algo más como completar los archivos XML que necesitas para desplegar un workflow en WSS.

    Un saludo

    JC

  6. Gracias, pude hacerlo correctamente. Encontré que el Public Key Token del Assembly lo obtuve invocando “sn -T MiAssembly.dll” en el Visual Studio Command Prompt. Pero continúo con dudas en como llenar el workflow.xml. Por ejemplo: el valor de TaskListContentTypeId. ¿También lo asigno creando un nuevo GUID? ¿No tengo que declarar en otro lugar nada sobre este contenttype?

  7. Hola de nuevo!
    Ese parámetro es complentamente opcional (depende de lo que quieras hacer con tu workflow) en el archivo workflow.xml. Te paso un link en el que lo comentan: http://weblog.vb-tech.com/nick/archive/2006/09/04/1760.aspx. Como se dice aquí, especifica el Id del Content Type vinculado a la lista de tareas con la que va a trabajar tu workflow. Puedes encontrar más información en el MSDN:
    http://msdn2.microsoft.com/en-us/library/ms438856.aspx
    Un saludo

    JC

  8. Una cosa solamente, una de dos o se lo has copiado a gustavo velez el post o lo has hecho tu, bueno igualmente me gustaria saber como has hecho para 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.

  9. Hola!
    La verdad es que el comentario que has hecho es poco afortunado…deberías fijarte un poco en lo que lees: autor, fecha, etc…este post es de septiembre de 2006 de los primeros que publicamos y el que aparece en el blog de Gustavo es el nuestro y la razón es que nos pidió permiso para publicar posts nuestros relativos a WSS 3.0 en su blog, a lo que accedimos amablemente. Además decirte que conozco a Gustavo Velez en persona y es un tipo encantador aparte de uno de los mejores conocedores de WSS 3.0 & MOSS. Y si todavía no lo tienes claro, fijate en el post en el nombre del autor y dónde se ha publicado:
    http://www.gavd.net/servers/sharepointv3/spsv3_item.aspx?top=cod&itm=438

    Después de aclarar el tema de la autoría del post, paso a contestar lo que preguntas, pues hay varios ejemplos en la red de como hacerlo. Lo único que tienes que tener en cuenta es:
    – El GUID del feature.xml y workflow.xml tienen que ser únicos y los debes de crear con el Create GUID de Visual Studio 2005.
    – Para sacar el Key Token, versión, etc del assembly has de usar una herramienta como el Reflector de Lutz Roeder.
    – Finalmente, para configurar el archivo Install.bat tienes que tener cuidado de realizar los siguientes pasos:
    1. Crear la carpeta de tu feature en el directorio ..12TEMPLATEFEATURES
    2. Copiar los archivos xml a la carpeta de tu feature.
    3. Copiar el ensamblado a la GAC con gacutil
    4. Si la feature la vas a crear por primera vez, no necesitas ni desactivarla ni desinstalarla. En caso contrario tienes que hacerlo.
    5. Instalar la feature y activarla
    6. HAcer un reset del IIS o sólo del site collection donde vas a hacer el despliegue de la feature.

    Si necesitas ejemplos concretos de estos archivos, te los puedo pasar.

    Un saludo JC

Deja un comentario

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