El Service Pack 2 impide que un flujo de trabajo de cambio se inicie solo

Hola a todos. Soy Stephen, redactor técnico de SharePoint Designer. Me gustaría contarles sobre una revisión que se incluyó en el Service Pack 2 para Office SharePoint Server 2007 y Windows SharePoint Services 3.0. Esta revisión afecta a los flujos de trabajo diseñados en SharePoint Designer 2007. A continuación, mostraré cómo crear intencionadamente un bucle de flujo de trabajo mediante dos flujos de trabajo en lugar de uno.

Antes del Service Pack 2, era muy fácil diseñar sin darse cuenta un flujo de trabajo que se desencadenaba solo y creaba un bucle infinito. Por ejemplo, consideren esta situación:

1) Un flujo de trabajo se inicia cuando se cambia un elemento.

2) El flujo de trabajo actualiza (o cambia) el elemento actual (por ejemplo, mediante la acción Establecer campo en elemento actual).

3) Dado que el flujo de trabajo cambia el elemento, se desencadena solo.

Por lo tanto, si se tenía un flujo de trabajo de cambio que enviaba un correo electrónico y, a continuación, actualizaba el elemento actual, se podían recibir rápidamente varios cientos de mensajes de correo electrónico en la Bandeja de entrada.

Tras instalar el Service Pack 2 en el servidor, ya no es posible que un flujo de trabajo que se inicia al modificarse un elemento se desencadene solo mediante la modificación o actualización del elemento actual. Esta situación de bucle infinito no es posible:

clip_image002

Sin embargo, muchos usuarios han diseñado flujos de trabajo que realmente sacan provecho del bucle infinito. Por ejemplo, se puede diseñar un flujo de trabajo de cambio que se repita infinitamente en un elemento de tarea y que envíe un aviso diario hasta que esa tarea se marque como completada. El flujo de trabajo se desencadena solo mediante la actualización de una columna de contador que se agrega a la lista para este fin. Además, el flujo de trabajo tiene una regla que detiene el flujo de trabajo o crea un "cortocircuito" en él si se cumple alguna condición (en este caso, el flujo de trabajo se detiene sin cambiar el elemento actual si el Estado de la tarea = Completado). Después del Service Pack 2, se interrumpirá este flujo de trabajo ya que no se puede desencadenar solo.

Service Pack 2 no impide los bucles infinitos, que pueden resultar útiles, pero para volver a crear lo que funcionaba antes, es necesario diseñar dos (o más) flujos de trabajo de cambio que se desencadenen entre sí. Dos flujos de trabajo de cambio que se desencadenen entre sí mediante la actualización o modificación del elemento actual constituyen un escenario de "co-recursión":

clip_image004

Además, es muy común implementar un flujo de trabajo basado en estado mediante varios flujos de trabajo más cortos que se desencadenan entre sí. Por ejemplo, se puede tener una lista con un campo de estado y varios flujos de trabajo de cambio asociados a ella. Todos esos flujos de trabajo incluyen un paso al final que actualiza el campo de estado. Por tanto, un flujo de trabajo desencadena varios otros mediante la actualización del estado y, a continuación, esos flujos de trabajo buscan el valor en el campo de estado para determinar si deben seguir ejecutándose o detenerse. Este flujo de trabajo basado en estado también es un escenario de "co-recursión" porque un flujo de trabajo inicia muchos otros flujos de trabajo de cambio mediante la modificación o actualización del elemento actual. Service Pack 2 no bloquea este tipo de flujo de trabajo basado en estado que depende de la co-recursión.

Resumen

· Antes del Service Pack 2, un solo flujo de trabajo de cambio podía entrar en un bucle infinito al actualizar el elemento actual, lo que hacía que se desencadenara solo.

· Después del Service Pack 2, un flujo de trabajo de cambio puede desencadenar otros flujos de trabajo de cambio mediante la actualización del elemento actual, pero un flujo de trabajo de cambio no se puede desencadenar solo. Por lo tanto, no se bloquearán los escenarios de co-recursión, incluido cualquier escenario que implemente un flujo de trabajo basado en estado mediante muchos flujos de trabajo de cambio más pequeños.

· Como recordatorio, nunca ha sido posible crear un bucle infinito de forma que un flujo de trabajo de cambio cree un elemento en la lista actual. Cada flujo de trabajo tiene una propiedad que contiene los "flujos de trabajo que no se pueden iniciar". Esta propiedad se usa para evitar bucles en flujos de trabajo que se inician cuando se crea un elemento.

· Como último recordatorio, todos los escenarios anteriores implican únicamente flujos de trabajo asociados a una sola lista o biblioteca. Nunca se han bloqueado los bucles infinitos en escenarios de varias listas para flujos de trabajo de cambio o de creación.

Creación de bucles antes del Service Pack 2

En esta sección se presenta un ejemplo de cómo un solo flujo de trabajo de cambio podía sacar provecho de un bucle infinito antes del Service Pack 2. Después del Service Pack 2, este flujo de trabajo no se desencadenará solo, por lo que en la siguiente sección se presenta un ejemplo de cómo crear un bucle mediante dos flujos de trabajo independientes.

Supongamos que tienen una lista de tareas denominada Tareas de equipo y desean diseñar un flujo de trabajo que va a enviar un aviso diario hasta que la tarea se marque como completada.

Primero, agreguen una columna denominada Contador (Counter) a la lista con un valor predeterminado de 0.

clip_image006

Es necesario ocultar las columnas Contador (Counter) de los formularios de lista (Nuevo elemento, Editar elemento) para que solamente el flujo de trabajo pueda obtener acceso a estas o actualizarlas. Primero, en la página de configuración de la lista, hagan clic en Configuración avanzada y, a continuación, permitan la administración de tipos de contenido.

clip_image008

En la página de configuración de la lista, hagan clic en cada tipo de contenido y, en la siguiente página, hagan clic en la columna Contador (Counter). Oculten la columna Contador (Counter). Hagan esto para cada tipo de contenido en la lista.

clip_image010

Tras crear y ocultar la columna Contador (Counter) para que no aparezca en los formularios, ya se puede diseñar el flujo de trabajo.

El flujo de trabajo de aviso diario debe iniciarse cada vez que se crea o modifica un elemento.

clip_image012

En el primer paso se comprueban dos cosas: (1) si la tarea ya se marcó como completada, se detiene el flujo de trabajo. Esta regla crea un "cortocircuito" en el bucle cada vez que la tarea se marca como completada. (2) Si la tarea no está completada, el flujo de trabajo comprueba si la fecha de vencimiento se encuentra en el futuro (posterior a la fecha actual). Si es así, el flujo de trabajo se interrumpe hasta la fecha de vencimiento, porque no es conveniente enviar avisos hasta que la fecha de vencimiento haya llegado.

clip_image014

En el segundo paso se comprueba de nuevo si la tarea está completada (en caso de que el flujo de trabajo se haya interrumpido hasta una fecha de vencimiento en el paso anterior y la tarea se haya completado entretanto). Si aún no se ha completado la tarea, el flujo de trabajo se interrumpe por un día.

clip_image016

En el tercer paso se comprueba de nuevo si la tarea se completó mientras el flujo de trabajo estaba en pausa; si es así, se detiene el flujo de trabajo.

Si no se ha completado la tarea, el flujo de trabajo (1) envía el aviso por correo electrónico; (2) establece la variable CurrentCount mediante una búsqueda en el campo Contador o Elemento actual; (3) suma 1 a CurrentCount y almacena este valor en una variable NewCount; y (4) establece la columna Contador (Counter) en el valor almacenado en la variable NewCount.

Básicamente, este paso incrementa la columna Contador (Counter) en 1 cada vez que se ejecuta el flujo de trabajo, por lo que se puede examinar la columna Contador (Counter) para ver cuántos avisos se han enviado. Y lo más importante es que la acción "Establecer campo en elemento actual" al final de este paso es lo que "cambia" el elemento actual, de forma que el flujo de trabajo se desencadena solo y crea el bucle.

clip_image018

Creación de bucles después del Service Pack 2

Después del Service Pack 2, todavía es posible conseguir este efecto de bucle, pero es necesario diseñar dos flujos de trabajo que se desencadenen entre sí (co-recursión) en lugar de un solo flujo de trabajo que se desencadene solo.

Aquí se usa un (1) flujo de trabajo de contador que aumente el recuento y un (2) flujo de trabajo de trabajador que envíe el aviso por correo electrónico.

Primer flujo de trabajo: el flujo de trabajo de contador

Como antes, se tiene que crear una columna Contador (Counter) en la lista con un valor predeterminado de 0, permitir la administración de tipos de contenido y hacer que el campo esté oculto para cada tipo de contenido de la lista.

clip_image006[1]

Este diseño de dos flujos de trabajo requiere una segunda columna, SendMail, que actuará como marca para el flujo de trabajo de trabajador. El valor predeterminado debe ser No; de lo contrario, los cambios realizados en un elemento de tarea provocarían que se envíe aviso por correo electrónico.

clip_image020

El flujo de trabajo de contador se iniciará cuando se cree o modifique un elemento.

clip_image022

En el primer paso se comprueba el estado de la tarea: si la tarea está completada, el flujo de trabajo de contador se detiene.

clip_image024

Si la fecha de vencimiento de la tarea está en el futuro (posterior a la fecha actual), el segundo paso se interrumpe hasta la fecha de vencimiento, ya que no es conveniente enviar avisos hasta después del vencimiento de la tarea.

clip_image026

En el tercer paso se comprueba otra vez si la tarea se ha completado, en caso de que la tarea se haya completado mientras el flujo de trabajo estaba en pausa en el paso anterior. Si aún no se ha completado la tarea, el flujo de trabajo se interrumpe por un día.

clip_image028

En el último paso se comprueba de nuevo el estado para ver si la tarea se completó durante la pausa anterior de un día. En caso contrario, el flujo de trabajo actualiza el elemento actual; para ello, (1) aumenta el valor de la columna Contador (Counter) en uno y (2) establece la marca SendMail en Sí (el valor predeterminado es No).

clip_image030

Segundo flujo de trabajo: el flujo de trabajo de trabajador (Worker)

El flujo de trabajo de contador anterior finaliza con la actualización (modificación) del elemento actual. Estas actualizaciones desencadenan el flujo de trabajo de trabajador, que está configurado para iniciarse cuando se cambia un elemento.

clip_image032

El flujo de trabajo de trabajador simplemente comprueba si la marca SendMail está establecida en Sí; si es así, el flujo de trabajo envía el mensaje de aviso y vuelve a establecer la marca en No.

El establecimiento de la marca SendMail en No es el cambio que desencadena el flujo de trabajo de contador anterior. Los flujos de trabajo de contador y trabajador se desencadenarán entre sí y enviarán avisos diarios hasta que la tarea se marque como completada.

clip_image034

Como alternativa, en lugar de un bucle infinito, se puede hacer que el flujo de trabajo de trabajador remita la notificación de tarea cuando la columna de contador alcance un determinado valor, por ejemplo, cinco avisos. En el siguiente paso se ejecutan distintas ramas según el número de avisos. Cuando el número llega a 5, el flujo de trabajo envía un mensaje a un administrador, cuya dirección de correo electrónico se puede "codificar de forma rígida" en la acción Enviar correo electrónico, o bien recuperar de una lista mediante una búsqueda de flujo de trabajo.

clip_image036

También se puede hacer que el flujo de trabajo de trabajador reasigne la tarea a otra persona o grupo después de haber enviado un determinado número de avisos. En este paso, el flujo de trabajo reasigna la tarea a un grupo de SharePoint que consta de los integrantes del grupo responsables de realizar un seguimiento de ese tipo de tareas remitidas.

clip_image038

Si desean terminar el bucle cuando el recuento llega a un número determinado, asegúrense también de que agregan una rama para el primer paso del flujo de trabajo de contador, no del flujo de trabajo de trabajador. Esta rama detiene el bucle cuando la columna de contador llega a 6.

clip_image040

Espero que esta información les resulte útil.

—Stephen

Esta entrada de blog es una traducción. Pueden consultar el artículo original en Service Pack 2 prevents an on-change workflow from starting itself