lunes, 13 de julio de 2009

Objetivo de este blog

La idea es compartir nuestras experiencias diarias en el uso de la herramienta genexus y juntos poder sacarle mucho jugo a todo esto y compartir buenos momentos!

miércoles, 1 de julio de 2009

Compartir documentos entre instancias de proceso en Genexus X

Trabajando en nuestro proyecto surgio la necesidad de compartir un documento entre diferentes instancias de proceso. Hoy en día el motor de flow solo cuenta con los comandos para crear y actualizar instancias de documentos pero todavía no se cuenta con uno que permita compartir una instancia de un documento entre dos o mas procesos. A continuación vamos a describir nuestra solución al problema:

Diagramas de proceso:

Incluir, en los diagramas de los procesos involucrados en el manejo de documentos, una actividad genérica que se usará para asociar los documentos al proceso. En nuestro ejemplo esta actividad se llama "Compartir Documentos". La misma deberá tener todos los permisos habilitados para trabajar con los documentos que se desean compartir. Esta actividad será invocada por los procedimientos encargados de compartir los documentos entre las diferentes instancias de proceso. A continuación se detallan los dos procedimientos nombrados.

Procedimientos:

'Compartir Documento': tiene como objetivo, pasar un documento de una instancia de proceso(origen) a otra(destino).




//Recibe los id de las instancias de proceso involucradas (origen y destino) y el nombre del documento que se desea compartir entre las instancias.
parm(in:&piIdOrigen,in:&piIdDestino,in:&dNombre);


//conexión al servidor de flow
&server.Connect('WFADMINISTRATOR', 'WFADMINISTRATOR')
&user = &server.GetOrganizationalModel().GetUserById('WFADMINISTRATOR')

//origen
&piOrigen = &server.GetProcessInstanceById(&piIdOrigen)
&aOrigen = &piOrigen.ProcessDefinition.GetActivityByName('Compartir Documentos')
&wiOrigen = &piOrigen.GetWorkitemByActivity(&aOrigen)

//Aqui estamos asignado el work item a un usuario de flow y estamos pasando el work item al estado 'in process' para poder crear la instancia del documento en el proceso destino.
&wiOrigen.Assign(&user)
&wiOrigen.ChangeState(WorkflowWorkitemState.OPEN_ACTIVE_INPROCESS)

//destino
&piDestino = &server.GetProcessInstanceById(&piIdDestino)
&aDestino = &piDestino.ProcessDefinition.GetActivityByName('Compartir Documentos')
&wiDestino = &piDestino.GetWorkitemByActivity(&aDestino)
&wiDestino.Assign(&user)
&wiDestino.ChangeState(WorkflowWorkitemState.OPEN_ACTIVE_INPROCESS)


//Creo un nuevo documento en el proceso destino a partir de un documento en el proceso origen
for &doc in &piOrigen.DocumentInstances
if &doc.DocumentDefinition.Name = trim(&dNombre)
&archivo = &doc.Read(&user,&wiOrigen,'c:\temp')
&doc.DocumentDefinition.Name,&doc.Error.Message)
&definicion = &doc.DocumentDefinition
&definicion.CreateInstanceFromFile(&wiDestino,&doc.Name,&archivo)
endif
endfor



'Actualizar Documento': tiene como objetivo, actualizar un documento en una instancia de proceso(destino) a partir de un documento en la instancia(origen).



parm(in:&piidori,in:&piiddes, in:&nombre);

&server.Connect('WFADMINISTRATOR', 'WFADMINISTRATOR')
&user = &server.GetOrganizationalModel().GetUserById('WFADMINISTRATOR')

//origen
&piori = &server.GetProcessInstanceById(&piidori) //instancia origen
&aori = &piori.ProcessDefinition.GetActivityByName('Compartir Documentos')
&wiori = &piori.GetWorkitemByActivity(&aori)
&wiOri.Assign(&user)
&wiOri.ChangeState(WorkflowWorkitemState.OPEN_ACTIVE_INPROCESS)

//destino
&pides = &server.GetProcessInstanceById(&piiddes) //instancia destino
&ades = &pides.ProcessDefinition.GetActivityByName('Compartir Documentos')
&wides = &pides.GetWorkitemByActivity(&ades)
&wiDes.Assign(&user)
&wiDes.ChangeState(WorkflowWorkitemState.OPEN_ACTIVE_INPROCESS)

//Actualizo un documento en el proceso destino desde un documento en el proceso origen.
for &doc in &pides.DocumentInstances
if &doc.DocumentDefinition.Name = trim(&nombre)
&doc.CheckOut(&user,&wides,'c:\temp')
exit
endif
endfor

for &doc2 in &piori.DocumentInstances
if &doc2.DocumentDefinition.Name = trim(&nombre)
&archivo = &doc2.Read(&user,&wiori,'c:\temp2')
exit
endif
endfor

&doc.CheckIn(&user,&wides,&archivo)

Uso:
  • compartir un documento entre dos instancias de proceso
Crear en el proceso (destino/origen, dependiendo de como sea el flujo del documento) una actividad (por ejemplo un procedimiento) que llame al procedimiento
'Compartir Documento' para pasar un documento de la instancia origen a la instancia destino.

  • actualizar un documento desde una instancia de proceso a otra
Crear en el proceso origen (en el que se modificó el documento), una actividad que llame al procedimiento 'Actualizar Documento' para actualizar el documento compartido en el proceso destino.