Przeszukiwanie procesów i zadań

Dane z instancji procesów i czynności można pobierać za pomocą obiektu JavaScript TWSearch w celu zdefiniowania, które kolumny mają zostać pobrane, jakie filtry mają zostać zastosowane, jak sortować i organizować wyniki. Wyniki można również przeanalizować, aby uzyskać listę zmiennych.
Często jest konieczne pobieranie i wyświetlanie informacji związanych z instancjami procesów lub zadań. Na przykład:
Display all of the tasks for the Service Order Process that are active now or have been completed in the last 24 hours.
W tym celu można użyć obiektu JavaScript TWSearch i powiązanych z nim obiektów.

Struktura zapytania TWSearch

Zapytanie TWSearch zawiera następujące kroki.
  1. Zdefiniuj kolumnę danych, które mają zostać pobrane. Patrz Kolumny.
  2. Zdefiniuj filtry, które mają zostać zastosowane do kolumny. Patrz sekcja Filtry wyszukiwania.
  3. Zdefiniuj porządek sortowania zwracanych rekordów. Patrz Kolejność wyników wyszukiwania.
  4. Zdefiniuj sposób organizowania wyników. Patrz: organizacja wyników wyszukiwania.
  5. Wykonaj wyszukiwanie i przeanalizuj wyniki w celu uzyskania listy zmiennych złożonych. Patrz: Wykonanie wyszukiwania.
Wszystkie kolumny, warunki i kryteria sortowania są przechowywane przez obiekt TWSearch.
var search = new TWSearch();

Kolumny

Każda kolumna, która ma zostać zwrócona, jest zdefiniowana jako obiekt TWSearchColumn. W poniższym kodzie przykładowym jest definiowana kolumna, która zwraca identyfikator instancji procesu.
var colInstanceId = new TWSearchColumn();
colInstanceId.type = TWSearchColumn.Types.ProcessInstance;
colInstanceId.name = TWSearchColumn.ProcessInstanceColumns.ID;
Każda kolumna ma typ i nazwę. Najczęściej używane typy to: ProcessInstance, Task i BusinessData.
TWSearchColumn.Types.ProcessInstance
TWSearchColumn.Types.Task
TWSearchColumn.Types.BusinessData

Nazwy typów kolumn ProcessInstance i Task są predefiniowane i nie można ich edytować. Nazwy kolumn dla typu BusinessData są definiowane w definicjach definicji BPD, gdy zmienna jest oznaczona jako Dostępna w wyszukiwaniu. Więcej informacji na temat wyszukiwania danych biznesowych zawiera sekcja Udostępnianie danych biznesowych w wyszukiwakach i widokach.

W poniższym przykładzie kolumna dla danych biznesowych ma nazwę serviceOrderNumber.
var colServiceOrderNumber = new TWSearchColumn;
colServiceOrderNumber.type = TWSearchColumn.Types.BusinessData;
colServiceOrderNumber.name = "serviceOrderNumber";
Istnieje możliwość wyszukiwania tablic kolumn – przedstawiono to poniżej.
search.columns =
     new Array(
       colInstanceStatus,
     colInstanceId,
     colInstanceName,
     colTaskId,
     colTaskStatus,
     colClosedDateTime,
     colDueDateTime,
     );

Filtry wyszukiwania

Definiując warunki, można zastosować filtry do dowolnej kolumny. Każdy warunek definiuje się jako obiekt TWSearchCondition. W poniższym przykładowym kodzie jest definiowana kolumna, która pobiera nazwę instancji procesu, a następnie zawęża wyniki do nazw instancji procesów, które rozpoczynają się od łańcucha Service Order Fulfillment (Realizacja zamówienia na usługę).
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:";
Jeśli warunek daty jest tworzony przy użyciu obiektu TWDate, należy najpierw przekształcić datę w łańcuch, gdy zostanie skonstruowany warunek. Następujący kod przykładowy definiuje kolumnę, która zwraca datę zakończenia zadania, a następnie definiuje before i after jako warunek daty zakończenia.
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");
W poprzednim przykładzie przedstawiono również możliwość zdefiniowania wielu warunków dla jednej kolumny. Aby określić wyniki, wyszukiwanie stosuje wszystkie warunki jako tablicę warunków niewykluczających (niejawny operator AND).
var conditions = new Array(condInstanceName, condInstanceStatus, condTaskStatus);
search.conditions = conditions;

Aby zastosować warunki wykluczające (warunek logiczny XOR), należy samodzielnie wykonać wiele operacji wyszukiwania i złożyć ich wyniki.

Jeśli warunki wyszukiwania są dynamiczne, można wykorzystać metodę tablicową JavaScript push przedstawioną w kolejnym przykładzie kodu.
Wskazówka: Przed ustaniem atrybutu conditions w wyszukiwaniu należy wywołać metodę push we wszystkich warunkach na tablicy. Kod bazowy tworzy kopię tablicy.
var conditions = new Array(condInstanceName, condInstanceStatus, condTaskStatus);
 if(tw.local.fieldRepIdentifier != "All") {
 conditions.push(condFieldRepIdentifier);
 }
 search.conditions = conditions;

Porządek wyników wyszukiwania

W przypadku każdej kolumny można zdefiniować kryteria porządkowania. Każda kolejność jest definiowana jako obiekt TWSearchOrdering. Poniższy kod przykładowy wyświetla listę pobranych identyfikatorów instancji procesów w porządku rosnącym.
var orderInstanceId = new TWSearchOrdering();
orderInstanceId .column = colInstanceId;
orderInstanceId .order = TWSearchOrdering.Orders.Ascending;
Wyszukiwanie przechowuje tablicę wszystkich kryteriów porządkowania, które mają zostać zastosowane do wyników.
search.orderBy = new Array(orderInstanceId );

Organizacja wyników wyszukiwania

Konieczne jest również wskazanie, czy wyniki mają być organizowane wg instancji procesu, czy wg zadania. W tym celu należy użyć obiektu TWSearch.organizedBy. Zachowanie jest takie samo jak zachowanie zapisanych wyszukiwań w Process Portal. W przypadku organizowania wg instancji procesu zostanie uzyskany jeden wynik na instancję procesu. Poniższy kod przykładowy organizuje wyniki wyszukiwania wg zadania.
search.organizedBy = TWSearch.OrganizeByTypes.Task;

Wykonanie wyszukiwania

Po podaniu kolumn, warunków, porządku i sposobu organizowania wyszukiwania można je wykonać, aby pobrać tablicę wierszy JavaScript.
var results = search.execute();
Metoda execute zwraca obiekty TWSearchResults.

Obiekt TWSearch obsługuje również metody executeForProcessInstances i executeForTasks, które przyjmują te same parametry i zwracają rodzime tablice języka JavaScript, ale z różnymi typami zwracanych wartości. Metoda executeForTasks zwraca tablicę zadań TWTask[], podczas gdy program executeForProcessInstances zwraca tablicę TWProcessInstance[] instancji procesów.

Aby użyć tych wyników poza blokiem skryptu, należy je przeanalizować i zainicjować odpowiednie zmienne.

Poniższy kod analizuje rodzimą tablicę JavaScript w celu utworzenia tablicy zmiennych niestandardowych.
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();
   }   
 }

Jeśli piszesz kod przetwarzający wyniki TWSearch i sprawdzasz, czy wartości nie są równe null, rozważ umieszczenie wartości null po lewej, a nie po prawej stronie operatora, jak to pokazano w powyższym przykładowym fragmencie kodu. W przeciwnym razie możliwe jest, że do pliku SystemErr.log mogą zostać wyświetlone następujące błędy:

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.