Ricerca di processi e attività

È possibile richiamare i dati dalle istanze di processo e attività utilizzando un oggetto JavaScript TWSearch per definire quali colonne richiamare, quali filtri applicare, come ordinare e organizzare i risultati. I risultati possono essere analizzati anche in un elenco di variabili.
Spesso, è necessario richiamare e visualizzare le informazioni relative alle istanze di processo o di attività. Ad esempio:
Display all of the tasks for the Service Order Process that are active now or have been completed in the last 24 hours.
Per questo scopo, è possibile utilizzare l'oggetto JavaScript TWSearch e gli oggetti correlati.

Struttura di una query TWSearch

Una query TWSearch include i seguenti passi.
  1. Definire le colonne di dati che si desidera richiamare. Consultare Colonne.
  2. Definire i filtri che si desidera applicare a una colonna. Vedere Filtri di ricerca.
  3. Definire il criterio di ordinamento per i record restituiti. Vedere Ordine dei risultati della ricerca.
  4. Definire come sono organizzati i risultati. Vedere Organizzazione dei risultati della ricerca.
  5. Eseguire la ricerca e analizzare i risultati in un elenco di variabili complesse. Vedere Esecuzione della ricerca.
Tutte le colonne, le condizioni e i criteri di ordinamento vengono mantenuti da un oggetto TWSearch .
var search = new TWSearch();

Colonne

Ogni colonna che si desidera restituire è definita come oggetto TWSearchColumn . Il seguente esempio di codice definisce una colonna che restituisce l'identificativo di una istanza del processo.
var colInstanceId = new TWSearchColumn();
colInstanceId.type = TWSearchColumn.Types.ProcessInstance;
colInstanceId.name = TWSearchColumn.ProcessInstanceColumns.ID;
Ogni colonna ha un tipo e un nome. I tipi più comuni sono ProcessInstance, Taske BusinessData.
TWSearchColumn.Types.ProcessInstance
TWSearchColumn.Types.Task
TWSearchColumn.Types.BusinessData

I nomi per i tipi di colonna ProcessInstance e Task sono predefiniti e non modificabili. I nomi delle colonne per il tipo BusinessData sono definiti nelle definizioni dei processi quando una variabile è contrassegnata come Disponibile nella ricerca. Per ulteriori informazioni sulla ricerca di dati di business, consultare Come rendere i dati di business disponibili nelle ricerche e nelle viste.

Nel seguente esempio, una colonna per i dati aziendali è denominata serviceOrderNumber.
var colServiceOrderNumber = new TWSearchColumn;
colServiceOrderNumber.type = TWSearchColumn.Types.BusinessData;
colServiceOrderNumber.name = "serviceOrderNumber";
È possibile ricercare array di colonne, come segue.
search.columns =
     new Array(
       colInstanceStatus,
     colInstanceId,
     colInstanceName,
     colTaskId,
     colTaskStatus,
     colClosedDateTime,
     colDueDateTime,
     );

Filtri di ricerca

È possibile applicare filtri a qualsiasi colonna definendo condizioni. Ogni condizione viene definita come oggetto TWSearchCondition . Ad esempio, il seguente esempio di codice definisce una colonna che richiama il nome di un'istanza del processo e quindi restringe i risultati per elaborare i nomi dell'istanza che iniziano con Adempimento ordine di servizio.
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:";
Quando si crea una condizione di data utilizzando un oggetto TWDate , è necessario prima convertire la data in una stringa quando si crea la condizione. Il seguente esempio di codice definisce una colonna per restituire la data di scadenza dell'attività e quindi una condizione di data di scadenza before e 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");
L'esempio precedente mostra anche che è possibile definire più condizioni in una singola colonna. Per determinare i risultati, la ricerca applica tutte le condizioni come un array di condizioni inclusive (operatore AND implicito).
var conditions = new Array(condInstanceName, condInstanceStatus, condTaskStatus);
search.conditions = conditions;

Per applicare condizioni esclusive (OR esclusivo), è necessario eseguire più ricerche e combinarle da soli.

Se le condizioni di ricerca sono dinamiche, è possibile sfruttare il metodo JavaScript array push , come mostrato nell'esempio di codice successivo.
Suggerimento: prima di impostare l'attributo conditions della ricerca, richiamare il metodo push su tutte le condizioni sull'array. Il codice sottostante effettua una copia dell'array.
var conditions = new Array(condInstanceName, condInstanceStatus, condTaskStatus);
 if(tw.local.fieldRepIdentifier != "All") {
 conditions.push(condFieldRepIdentifier);
 }
 search.conditions = conditions;

Ordine dei risultati della ricerca

È possibile definire i criteri di ordinamento per qualsiasi colonna. Ogni ordinamento è definito come oggetto TWSearchOrdering . Ad esempio, il seguente esempio di codice elenca gli identificatori dell'istanza di processo richiamati in ordine crescente.
var orderInstanceId = new TWSearchOrdering();
orderInstanceId .column = colInstanceId;
orderInstanceId .order = TWSearchOrdering.Orders.Ascending;
La ricerca contiene un array di tutti i criteri di ordinamento da applicare ai risultati.
search.orderBy = new Array(orderInstanceId );

Organizzazione dei risultati della ricerca

È inoltre necessario specificare se i risultati devono essere organizzati per istanza del processo o per attività. Per fare ciò, utilizzare l'oggetto TWSearch.organizedBy . Il comportamento è lo stesso di quello delle ricerche salvate in Process Portal. Se si sceglie di organizzare per istanza del processo, si ottiene un solo risultato per istanza del processo. Il seguente esempio di codice organizza i risultati della ricerca per attività.
search.organizedBy = TWSearch.OrganizeByTypes.Task;

Esecuzione della ricerca

Dopo aver specificato le colonne, le condizioni, l'ordine e l'organizzazione per la ricerca, è possibile eseguirla per richiamare un array di righe JavaScript .
var results = search.execute();
Il metodo execute restituisce TWSearchResults oggetti.

L'oggetto TWSearch supporta anche i metodi executeForProcessInstances e executeForTasks , che utilizzano gli stessi parametri e restituiscono array JavaScript nativi ma con tipi di restituzione differenti. Il metodo executeForTasks restituisce un TWTask[] array di attività mentre executeForProcessInstances restituisce un TWProcessInstance[] array di istanze di processi.

Se si desidera utilizzare questi risultati al di fuori del proprio blocco di script, è necessario analizzarli e inizializzare le variabili equivalenti.

Il seguente codice analizza l'array JavaScript nativo per creare un array di variabili personalizzate.
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();
   }   
 }

Se si sta scrivendo il codice per elaborare i risultati di TWSearch e controllare i valori null, è necessario specificare il valore null sul lato sinistro dell'operatore piuttosto che sul lato destro, come mostrato nel frammento di codice di esempio precedente. In caso contrario, è possibile che il seguente errore venga emesso nel file 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.