プロセスおよびタスクの検索
JavaScript
TWSearch
オブジェクトを使用して、取得する列、適用するフィルター、結果のソートおよび編成方法を定義することにより、プロセス・インスタンスおよびタスク・インスタンスからデータを取得できます。 結果を解析して変数のリストにすることもできます。Draft comment:
This topic is shared by BAW, CP4BA, CP4BAaaS. As of: 2023-12-04 09:43
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.
この目的のために、
TWSearch
JavaScript オブジェクトとその関連オブジェクトを使用できます。 基本的には、 Process Portal の保存済み検索と同じ列を取得できます。 - Process Portal の保存済み検索について詳しくは、「 検索と保存済み検索」を参照してください。
TWSearch
オブジェクトの参照情報は、プロセスおよびサービス・フローでの JavaScript API ページにあります。
TWSearch 照会の構造
TWSearch
照会には、以下のステップが含まれます。
すべての列、条件、およびソート基準は、
TWSearch
オブジェクトによって保持されます。var search = new TWSearch();
列
返す各列は、
TWSearchColumn
オブジェクトとして定義されます。 次のコード・サンプルでは、プロセス・インスタンスの ID を返す列が定義されます。var colInstanceId = new TWSearchColumn();
colInstanceId.type = TWSearchColumn.Types.ProcessInstance;
colInstanceId.name = TWSearchColumn.ProcessInstanceColumns.ID;
それぞれの列には、タイプと名前があります。 最も一般的なタイプは、
ProcessInstance
、Task
、および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
オブジェクトを使用して日付条件を作成する場合、条件を作成するときにまず日付をストリングに変換する必要があります。 以下のコード・サンプルでは、タスクの期限を返す列を定義し、次にbefore
と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");
上記の例では、単一列に複数の条件を定義できることも示しています。 結果を決定するために、検索ではすべての条件を包括条件 (暗黙的な 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.
This topic was viewed 6 times since its publication