none
Problema con actualizar un item en un workflow RRS feed

  • Pregunta

  • Hola, estoy desarrollando en MOSS 2007 con VS2008 un flujo de trabajo secuencial, donde se crean varias tareas de manera consecutiva cuando se aprueban estas.

    Inicio-->Tarea1(Aprobación)--->Tarea2(Aprobación)

    La cuestión es que cuando se actualizan las tareas sea aprobando o rechazando cambio una columna de una biblioteca de documentos, me he dado cuenta que solamente me actualiza el elemento en cuestión. Si uso el metodo item.update() pero si incluyo este metodo la siguiente vez que se crea una tarea no me deja editarla ni completarla, como si se congelase, así que he optado de momento en usar el update al terminar el flujo.

    Mi pregunta es: Cómo se hace para en medio de un flujo secuencial, actualizar el elemento lanzador del flujo, sin que las tareas que se creen despues no se puedan modificar?
    • Cambiado Diego Gaona miércoles, 20 de mayo de 2009 14:29 pregunta formulada en foro equivocado ([Loc]From:Comentarios y Sugerencias)
    martes, 19 de mayo de 2009 8:53

Respuestas

Todas las respuestas

  • Un saludo, muevo este tema al foro de desarrollo con MOSS desde comentarios y sugerencias, donde te podrán ayudar a resolver tu inquietud.


    Cordialmente,

    Diego Gaona
    Diego Gaona.
    miércoles, 20 de mayo de 2009 14:28
  • Hola y bienvenido al nuevo foro de desarrollo con MOSS.

    Respecto a tu pregunta, un par de preguntas para situarme en el contexto:

    - todas las actividades que trabajan con las tareas tienen el correlationToken idéntico y dinámico (no hardcoded)?
    - el workflow está configurado para cancelarse o reiniciarse después de que se modifique un elemento (en las propiedades)?

    Lo que te puedo sugerir a priori es usar el item.SystemUpdate() en vez de item.Update(). El SystemUpdate no genera ningún evento en SharePoint por lo que sospecho que puede ser una solución a probar.

    saludos,
    -- Edin http://edinkapic.blogspot.com
    miércoles, 20 de mayo de 2009 20:10
    Moderador
  • Hola Edin, respecto a tu pregunta.

    Tengo un correlation token para cada uno de los procesos de las tareas distinto y uno para los eventos del workflow como el cambio del elemento.

    En cuanto a si es dinámico....no se muy bien a que te refieres con eso, me lo puedes explicar?

    El system update ya lo he probado, el problema es que me da el mismo problema que cambia el item y es como si las tareas se me bloquearán o se desvincularan.

    Y en el workflow sólo lo tengo puesto manualmente por lo que no debería arrancarse sólo al hacer el cambio.

    ¿Alguna idea?

    jueves, 21 de mayo de 2009 8:02
  • En principio el CorrelationToken debería ser: 1 para el workflow y 1 para cada una de las diferentes tareas. Dentro de cada actividad de la misma tarea "física" debería ser el mismo.

    En cuanto a lo dinámico, quería decir que es recomendable que si creas una tarea por el código, asignes al token el valor de Guid.NewGuid() y que lo asignes por código a cada actividad.

    Miraré a ver si rescato algún código de workflow de múltiples tareas dinámicas que tengo y lo pongo aquí durante el día de hoy.

    -- Edin http://edinkapic.blogspot.com
    jueves, 21 de mayo de 2009 8:25
    Moderador
  • Diego un new Guid, lo asigno a el taskId y similares al token lo pongo en modo diseño y asigno a cada una de las actividades de cada tarea el token de esa tarea, si pudieses pasarme un código de multiples tareas con cambios de alguna columna del item me sería de gran utilidad xD.

    jueves, 21 de mayo de 2009 10:27
  • Estoy mirando el código y lamentablemente no cambio nada dentro de la tarea en sí, sino al empezar y al acabar el workflow:

            private void onWorkflowActivated1_Invoked(object sender, ExternalDataEventArgs e)
            {
                Guid listId = workflowProperties.ListId;
                int itemId = workflowProperties.ItemId;
                SPList list = workflowProperties.Web.Lists[listId];
                SPListItem litem = list.GetItemById(itemId);
                list.ParentWeb.AllowUnsafeUpdates = true;
                litem["NombreDelWorkflow"] = 2; // --- Pendiente
                litem.Update();
             }

    -- Edin http://edinkapic.blogspot.com
    jueves, 21 de mayo de 2009 11:20
    Moderador
  • Ese código me ayudo para poder cambiar otro elemento de otra lista sin que deje de funcionar por el allowUnsafeUpdates, pero sigo con mi problema.

    La cosa es que cuando despues de actualizar el elemento, se crea la siguiente tarea con token distinto a la primera, la tarea en sí se modifica pero no salta el onTaskChanged, es como sino fuese modificada....
    jueves, 21 de mayo de 2009 15:42
  • Para crear la nueva tarea usas el CreateTask o CreateTaskWithContentType?

    El OwnerActivityName de la tarea está puesto a la actividad raíz del workflow?

    Más cosas a probar:

    1. Los correlationToken fluyen bien; el mismo token (variable) pasa por "Create Task" --> "On Task Created" --> "On Task Changed" --> "On Task Completed".
    2. Comprobar los métodos que las actividades invocan al ejecutarse. Por ejemplo, "Create Task" invoca CreateTask_MethodInvoking y "On Task Changed" invoca OnTaskChanged_MethodInvoking etc.

    Hay un tutorial muy bueno (en inglés, eso sí) de Robert Shelton que explica como hacer un workflow de aprobación multinivel (con dos tareas). Puedes echarle un vistazo a ver si te ilumina en algo: http://rshelton.com/archive/2007/11/27/how-to-video-building-a-multilevel-approval-workflow-with-sharepoint.aspx

    Y, por último, hay dos hilos interesantes en el foro de SharePoint Workflow (en inglés) con síntomas parecidos a los tuyos: http://social.msdn.microsoft.com/Forums/en-US/sharepointworkflow/thread/39dac3b4-1179-4796-b9ee-e04438f2eb6b/http://social.msdn.microsoft.com/Forums/es-ES/sharepointworkflow/thread/77fa0116-6e45-4ff8-a252-4e8cbb7e5d6c

    -- Edin http://edinkapic.blogspot.com
    jueves, 21 de mayo de 2009 18:57
    Moderador