Búsqueda de procesos y tareas

Puede recuperar datos de instancias de proceso y tarea utilizando un objeto JavaScript TWSearch para definir qué columnas recuperar, qué filtros aplicar, cómo ordenar y organizar los resultados. También puede analizar los resultados en una lista de variables.
Con frecuencia, necesitará obtener y mostrar información relacionada con el proceso o las instancias de tarea. Por ejemplo:
Display all of the tasks for the Service Order Process that are active now or have been completed in the last 24 hours.
Para ello, puede utilizar el objeto JavaScript de TWSearch y sus objetos relacionados.

Estructura de una consulta de TWSearch

Una consulta TWSearch incluye los pasos siguientes.
  1. Defina las columnas de datos que desee obtener. Consulte Columnas.
  2. Defina los filtros que desee aplicar a una columna. Consulte Filtros de búsqueda.
  3. Defina el orden de clasificación de los registros devueltos. Consulte Orden de resultados de búsqueda.
  4. Defina cómo se organizan los resultados. Consulte Organización de resultados de búsqueda.
  5. Ejecute la búsqueda y analice los resultados en una lista de variables complejas. Consulte Ejecución de búsqueda.
Todas las columnas, condiciones y criterios de clasificación están retenidos por un objeto TWSearch.
var search = new TWSearch();

Columnas

Cada columna que desea devolver se define como un objeto TWSearchColumn. El siguiente ejemplo de código define una columna que devuelve el identificador de una instancia de proceso.
var colInstanceId = new TWSearchColumn();
colInstanceId.type = TWSearchColumn.Types.ProcessInstance;
colInstanceId.name = TWSearchColumn.ProcessInstanceColumns.ID;
Cada columna tiene un tipo y un nombre. Los tipos más comunes son ProcessInstance, Task y BusinessData.
TWSearchColumn.Types.ProcessInstance
TWSearchColumn.Types.Task
TWSearchColumn.Types.BusinessData

Los nombres de los tipos de columna ProcessInstance y Task son predefinidos y no se pueden editar. Los nombres de columna para el tipo BusinessData se definen en las definiciones de proceso cuando una variable se marca como Disponible en la búsqueda. Para obtener más información sobre la búsqueda de datos empresariales, consulte Hacer que los datos empresariales estén disponibles en búsquedas y vistas.

En el ejemplo siguiente, una columna para datos de negocio se denomina serviceOrderNumber.
var colServiceOrderNumber = new TWSearchColumn;
colServiceOrderNumber.type = TWSearchColumn.Types.BusinessData;
colServiceOrderNumber.name = "serviceOrderNumber";
Puede buscar matrices de columnas del siguiente modo.
search.columns =
     new Array(
       colInstanceStatus,
     colInstanceId,
     colInstanceName,
     colTaskId,
     colTaskStatus,
     colClosedDateTime,
     colDueDateTime,
     );

Filtros de búsqueda

Puede aplicar filtros a cualquier columna definiendo condiciones. Defina cada condición como un objeto de TWSearchCondition. Por ejemplo, el siguiente ejemplo de código define una columna que obtiene el nombre de una instancia de proceso y limita posteriormente los resultados a los nombres de instancia de proceso que empiecen por Realización de pedido de servicio.
var colInstanceName = new TWSearchColumn();
colInstanceName.type = TWSearchColumn.Types.ProcessInstance;
colInstanceName.name = TWSearchColumn.ProcessInstanceColumns.Name;
     
var condInstanceName = new TWSearchCondition;
condInstanceName.column = colInstanceName;
condInstanceName.operator = TWSearchCondition.Operations.StartsWith;
condInstanceName.value = "Service Order Fulfillment:";
Cuando cree una condición de fecha utilizando un objeto TWDate, primero debe convertir la fecha a una serie cuando construya la condición. El siguiente ejemplo de código define una columna para devolver la fecha de vencimiento de la tarea y, a continuación, define un before y una condición de fecha de vencimiento de after.
var colDueDateTime = new TWSearchColumn;
colDueDateTime.type = TWSearchColumn.Types.Task;
colDueDateTime.name = TWSearchColumn.TaskColumns.DueDate;
  
var condDueDateTimeBefore = new TWSearchCondition;
condDueDateTimeBefore.column = colDueDateTime;
condDueDateTimeBefore.operator = TWSearchCondition.Operations.LessThan;
condDueDateTimeBefore.value = tw.local.dueDateBefore.format("MM/dd/yyyy HH:mm:ss", "PST");
 
var condDueDateTimeAfter = new TWSearchCondition;
condDueDateTimeAfter.column = colDueDateTime;
condDueDateTimeAfter.operator = TWSearchCondition.Operations.GreaterThan;
condDueDateTimeAfter.value = tw.local.dueDateAfter.format("MM/dd/yyyy HH:mm:ss", "PST");
El ejemplo anterior muestra también que puede definir varias condiciones en una sola columna. Para determinar los resultados, la búsqueda aplica todas las condiciones como una matriz de condiciones inclusivas (operador AND implícito).
var conditions = new Array(condInstanceName, condInstanceStatus, condTaskStatus);
search.conditions = conditions;

Para aplicar condiciones exclusivas (exclusive OR), debe ejecutar varias búsquedas y combinarlas usted mismo.

Si las condiciones de búsqueda son dinámicas, puede aprovechar el método de la matriz JavaScript push, tal como se muestra en el siguiente ejemplo de código.
Sugerencia: Antes de establecer el atributo conditions de la búsqueda, llame al método push en todas las condiciones de la matriz. El código subyacente realiza una copia de la matriz.
var conditions = new Array(condInstanceName, condInstanceStatus, condTaskStatus);
 if(tw.local.fieldRepIdentifier != "All") {
 conditions.push(condFieldRepIdentifier);
 }
 search.conditions = conditions;

Orden de los resultados de búsqueda

Puede definir los criterios de ordenación de cada columna. Cada orden se define como un objeto TWSearchOrdering. El siguiente ejemplo de código muestra los identificadores de instancia de proceso obtenidos en orden ascendente.
var orderInstanceId = new TWSearchOrdering();
orderInstanceId .column = colInstanceId;
orderInstanceId .order = TWSearchOrdering.Orders.Ascending;
Su búsqueda incluye una matriz de todos los criterios de ordenación para aplicar a los resultados.
search.orderBy = new Array(orderInstanceId );

Organización de los resultados de búsqueda

También debe especificar si los resultados se deben organizar por instancia de proceso o por tarea. Para ello, utilice el objeto TWSearch.organizedBy. El comportamiento es el mismo que el de las búsquedas guardadas en Process Portal. Si decide organizar por instancia de proceso, obtendrá solo un resultado por instancia de proceso. En este ejemplo de código los resultados de las búsquedas se organizan por tarea.
search.organizedBy = TWSearch.OrganizeByTypes.Task;

Ejecución de búsquedas

Después de haber especificado las columnas, condiciones, orden y organización de la búsqueda, puede ejecutarla para obtener una matriz de filas de JavaScript.
var results = search.execute();
El método execute devuelve objetos TWSearchResults.

El objeto TWSearch también da soporte a los métodos executeForProcessInstances y executeForTasks, que toman los mismos parámetros y devuelven matrices JavaScript nativas pero con distintos tipos de retorno. El método executeForTasks devuelve una matriz TWTask[] de tareas mientras executeForProcessInstances devuelve una matriz TWProcessInstance[] de instancias de proceso.

Si desea usar esos resultados fuera de su bloque de scripts, deberá analizarlos e inicializar variables equivalentes.

El siguiente código analiza la matriz de JavaScript nativa para crear una matriz de variables personalizadas.
tw.local.serviceOrderTasks = new tw.object.listOf.ServiceOrderTask();
 for(var i = 0; i < results.rows.length; i++) {
   var row = results.rows[i];
   tw.local.serviceOrderTasks[i] = new tw.object.ServiceOrderTask();
 
   tw.local.serviceOrderTasks[i].processInstanceId = row.values[0].toString();
   tw.local.serviceOrderTasks[i].processInstanceName = row.values[1].toString();
   tw.local.serviceOrderTasks[i].taskId = row.values[2].toString();
   tw.local.serviceOrderTasks[i].taskStatus = row.values[3].toString();
   if(null != row.values[4])
   {
     tw.local.serviceOrderTasks[i].closedDate = row.values[4].toString();
   }
   if(null != row.values[5])
   {
     tw.local.serviceOrderTasks[i].dueDate = row.values[5].toString();
   }   
 }

Si escribe código para procesar resultados de TWSearch y comprueba resultados nulos, debería considerar especificar el resultado nulo en la parte izquierda del operador en lugar de hacerlo en la parte derecha, tal y como se muestra en el fragmento de código siguiente. De lo contrario, es posible que se produzca el siguiente error en el archivo SystemErr.log:

SystemErr     R RHINO USAGE WARNING: Missed Context.javaToJS()  
conversion:                                                     
Rhino runtime detected object Tue May 05 08:00:00 EDT 2020 of   
class java.util.Date where it expected String, Number, Boolean  
or Scriptable instance. Please check your code for missing      
Context.javaToJS() call.