プロセスおよびタスクの検索

Draft comment:
This topic was viewed 6 times since its publication
JavaScript TWSearch オブジェクトを使用して、取得する列、適用するフィルター、結果のソートおよび編成方法を定義することにより、プロセス・インスタンスおよびタスク・インスタンスからデータを取得できます。 結果を解析して変数のリストにすることもできます。
Draft comment:
This topic is shared by BAW, CP4BA, CP4BAaaS. As of: 2023-12-04 09:43
プロセス・インスタンスまたはタスク・インスタンスに関連する情報を取得して表示する必要があることがしばしばあります。 例:
Display all of the tasks for the Service Order Process that are active now or have been completed in the last 24 hours.
この目的のために、TWSearchJavaScript オブジェクトとその関連オブジェクトを使用できます。 基本的には、 Process Portal の保存済み検索と同じ列を取得できます。

TWSearch 照会の構造

TWSearch照会には、以下のステップが含まれます。
  1. 取得するデータの列を定義します。 を参照してください。
  2. 列に適用する任意のフィルターを定義します。 「 検索フィルター」を参照してください。
  3. 返されるレコードのソート順を定義します。 検索結果の順序を参照してください。
  4. 結果の編成方法を定義します。 「 検索結果の組織」を参照してください。
  5. 検索を実行し、結果を解析して複合変数のリストにします。 「 検索の実行」を参照してください。
すべての列、条件、およびソート基準は、TWSearchオブジェクトによって保持されます。
var search = new TWSearch();

返す各列は、TWSearchColumnオブジェクトとして定義されます。 次のコード・サンプルでは、プロセス・インスタンスの ID を返す列が定義されます。
var colInstanceId = new TWSearchColumn();
colInstanceId.type = TWSearchColumn.Types.ProcessInstance;
colInstanceId.name = TWSearchColumn.ProcessInstanceColumns.ID;
それぞれの列には、タイプと名前があります。 最も一般的なタイプは、ProcessInstanceTask、およびBusinessDataです。
TWSearchColumn.Types.ProcessInstance
TWSearchColumn.Types.Task
TWSearchColumn.Types.BusinessData

ProcessInstanceおよびTask列タイプの名前は事前定義されており、編集できません。 BusinessDataタイプの列名は、変数に「検索で使用可能」のマークが付けられたときに BPD 定義で定義されます。 ビジネス・データの検索について詳しくは、「 ビジネス・データを検索およびビューで使用可能にする」を参照してください。

以下の例では、ビジネス・データの列の名前はserviceOrderNumberです。
var colServiceOrderNumber = new TWSearchColumn;
colServiceOrderNumber.type = TWSearchColumn.Types.BusinessData;
colServiceOrderNumber.name = "serviceOrderNumber";
次のような列の配列を検索できます。
search.columns =
     new Array(
       colInstanceStatus,
     colInstanceId,
     colInstanceName,
     colTaskId,
     colTaskStatus,
     colClosedDateTime,
     colDueDateTime,
     );

検索フィルター

条件を定義することで、任意の列にフィルターを適用できます。 各条件をTWSearchConditionオブジェクトとして定義します。 例えば、次のコード・サンプルでは、プロセス・インスタンスの名前を取得する列が定義され、次にその結果が、Service Order Fulfillment で始まるプロセス・インスタンス名に絞り込まれます。
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:";
TWDateオブジェクトを使用して日付条件を作成する場合、条件を作成するときにまず日付をストリングに変換する必要があります。 以下のコード・サンプルでは、タスクの期限を返す列を定義し、次にbeforeafterの期限条件を定義します。
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");
上記の例では、単一列に複数の条件を定義できることも示しています。 結果を決定するために、検索ではすべての条件を包括条件 (暗黙的な AND 演算子) として適用します。
var conditions = new Array(condInstanceName, condInstanceStatus, condTaskStatus);
search.conditions = conditions;

排他条件 (排他 OR) を適用するには、複数の検索を実行し、自分で結合する必要があります。

検索条件が動的である場合は、次のコード・サンプルに示すように、JavaScript 配列のpushメソッドを利用できます。
ヒント: 検索の conditions 属性を設定する前に、配列のすべての条件に対して push メソッドを呼び出します。 基盤のコードが、配列のコピーを作成します。
var conditions = new Array(condInstanceName, condInstanceStatus, condTaskStatus);
 if(tw.local.fieldRepIdentifier != "All") {
 conditions.push(condFieldRepIdentifier);
 }
 search.conditions = conditions;

検索結果の順序

任意の列について、順序基準を定義できます。 各順序付けは、TWSearchOrderingオブジェクトとして定義されます。 例えば、次のコード・サンプルでは、取得したプロセス・インスタンス ID が昇順でリストされます。
var orderInstanceId = new TWSearchOrdering();
orderInstanceId .column = colInstanceId;
orderInstanceId .order = TWSearchOrdering.Orders.Ascending;
検索には、結果に適用するための、すべての順序基準の配列が保持されています。
search.orderBy = new Array(orderInstanceId );

検索結果の編成

結果をプロセス・インスタンス別とタスク・インスタンス別のいずれで編成するかも指定する必要があります。 これを行うには、TWSearch.organizedByオブジェクトを使用します。 この動作は、 Process Portalの保存済み検索の動作と同じです。 プロセス・インスタンス別に編成することを選択した場合、プロセス・インスタンスごとに得られる結果は 1 つのみになります。 次のコード・サンプルでは、タスク別に検索結果が編成されます。
search.organizedBy = TWSearch.OrganizeByTypes.Task;

検索の実行

検索の列、条件、順序、および編成を指定したら、その検索を実行して JavaScript 行の配列を取得できます。
var results = search.execute();
executeメソッドは、TWSearchResultsオブジェクトを返します。

TWSearchオブジェクトは、executeForProcessInstancesメソッドとexecuteForTasksメソッドもサポートします。これらのメソッドは同じパラメーターを取り、ネイティブ JavaScript 配列を返しますが、戻りの型は異なります。 executeForTasksメソッドはタスクのTWTask[]配列を返し、executeForProcessInstancesはプロセス・インスタンスのTWProcessInstance[]配列を返します。

これらの結果をスクリプト・ブロックの外部で使用する場合、結果を解析し、同等の変数を初期化する必要があります。

次のコードでは、ネイティブの JavaScript 配列が解析されて、カスタム変数の配列が作成されます。
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();
   }   
 }

TWSearch の結果を処理して値がヌルであるかを検査するコードを作成する場合は、上記のコード・フラグメント例のように、演算子の右側ではなく左側に「null」を指定することを検討してください。 そうしないと、以下のエラーが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.