Oracle® Fusion Middleware Oracle Business Process Management Studioでのビジネス・プロセスの開発 12c (12.2.1.1) E79347-01 |
|
前 |
次 |
この章では、式および条件を必要とするBPMN要素の式および条件の記述方法について説明します。Oracle BPMでは、異なるユーザーの要件に適応する2タイプの式エディタが提供されています。この章では、各式ビルダーで使用される式言語および記述する式で使用できる操作について説明します。
この章の内容は次のとおりです。
BPM要素では、動作を定義する条件または式を記述する必要がある場合があります。たとえば、500ドルを超えるすべての支出がマネージャによって承認されていることを確認する条件シーケンス・フローを使用するプロセスのフローを制御することがあります。
Oracle BPMでは、次の2つの式および条件の記述方法が提供されています。
シンプルな式ビルダーの使用
XPATH式ビルダーの使用
シンプルな式ビルダーではドット表記を使用し、その構文はJavaによく似ています。XPATH式ビルダーでは標準XPATH言語を使用します。
シンプルな式言語で式を記述した後にそれをXPathに変換することも、逆の変換をすることもできます。言語間で式を変換する場合、式エディタは式の意味に影響を与えない演算子とカッコを削除します。
Oracle BPMでは式を使用して、次のBPMN要素を構成します。
条件シーケンス・フロー
複合ゲートウェイ
タイマー・イベント
データ・アソシエーション
ループ・マーカー
マルチインスタンス・マーカー
ユーザー・タスク拡張プロパティ
相関
式の結果は、構成する要素のタイプに応じて異なります。表24-1は、各BPM要素で必要とされる式を説明しています。
表24-1 式タイプ
BPMN要素 | 式タイプ |
---|---|
条件シーケンス・フロー |
評価時にブール値となる条件。 |
複合ゲートウェイ |
評価時にブール値となる条件。 |
タイマー・イベント |
時間日付: 評価時に日時値となる式。 サイクル: 評価時に期間値となる式。 |
データ・アソシエーション |
評価時にデータ・アソシエーションでの引数と同じタイプの値となる式。 |
ユーザー・タスク拡張プロパティ |
評価時に文字列値となる式。 |
ループ・マーカー |
評価時にブール値となる条件。 |
マルチインスタンス・マーカー |
ループ・カーディナリティ: 評価時に整数値となる式。 完了条件: 評価時にブール値となる条件。 |
式をサポートするBPM要素の構成ダイアログには、埋込みの式エディタおよび式ビルダーを起動するボタンがあります。後者は長い式を操作する場合に適しています。どちらの式ビルダーでも、使用可能な変数を参照できます。XPATH式ビルダーでは、使用可能な関数も参照できます。
条件シーケンス・フローを実装するには、条件を指定する必要があります。トークンが条件シーケンス・フローに到着すると、BPMNサーバー・エンジンが条件シーケンス・フローの条件を評価し、トークンがどのシーケンス・フローに従うかを決定します。
通常、条件はプロジェクトおよびプロセス・データ・オブジェクトの値に基づいていますが、要件には基づいていません。コンパイラが条件を評価する際に、条件はブール値となる必要があります。ブール値とならない条件を記述した場合、シンプルな式ビルダーではエラーが発生します。
複合ゲートウェイを実装するには、到着したトークンをゲートウェイが解放する時期を指定する条件を提供する必要があります。新規トークンが複合ゲートウェイに到着するたびに、BPMNサービス・エンジンはこの条件を評価します。条件がtrueと評価されると、複合ゲートウェイはtrueと評価されるまでに到着したすべてのトークンを解放します。
通常、条件は、複合ゲートウェイに到着したトークンの数に基づいています。たとえば、2つのトークンがマージ・ゲートウェイに到着した後でゲートウェイがトークンを解放するようにするとします。
例24-1は、2つのトークンがマージ・ゲートウェイに到着した後でゲートウェイに到着したトークンを解放するゲートウェイを構成する条件を示しています。
例24-1 複合ゲートウェイでの条件
activationCount >= 2
タイマー・イベントを実装するために、日付または間隔を指定するか、日付または間隔を計算する式を記述するかを選択できます。
通常、日付または間隔が固定しない場合に式を使用します。
次の例は、日付を表すタイマー・イベントで使用できる式を示しています。
'now' + '30m'
deadline - '1day'
arrivalDate.dateTime + '1h'
次の例は、間隔を表すタイマー・イベントで使用できる式を示しています。
waitToRetry.interval()
period(deadline)
データ・アソシエーションで式を使用して、アクティビティ実装引数に関連付ける前に入出力値を変更できます。
通常、データ・オブジェクトとアクティビティ実装引数間に不一致がある場合に、式を使用します。次の例は、データ・アソシエーションで式を使用できる状況を説明しています。
データ・オブジェクトの値とサービスが必要とする引数間の不一致。
たとえば、アクティビティが起動するサービスがプロセスで使用する製品IDと異なる製品IDを使用するとします。この場合、製品IDのデータ・オブジェクトの内容をサービスが必要とする値に適合させる式を使用できます。
データ・オブジェクトのデータ型とサービスが必要とする引数のデータ型間の不一致。
たとえば、アクティビティが起動するサービスは文字列を使用してオーダーの状態を格納し、サービスは整数値でオーダーの状態を指定する必要があるとします。この場合、その文字列が指定する状態に対応する整数値を計算する式を使用します。
ループ・マーカーおよびマルチインスタンス・マーカーを使用して複数回実行するサブプロセスを構成できます。ループ・マーカーおよびマルチインスタンス・マーカーを構成するには、サブプロセスを繰り返す方法を指定する式および条件を定義する必要があります。
ループ・マーカー
ループ・マーカーによって、条件に基づいてサブプロセスを複数回実行できます。サブプロセスの実行前または実行後に条件を評価するように、ループ・マーカーを構成できます。特定の反復回数後に停止するように、ループ・マーカーを構成することもできます。
ループ・マーカーを構成するには、BPMNサービス・エンジンがサブプロセスの繰返しを続行する必要があるかどうかを決定するループ条件を記述する必要があります。
マルチインスタンス・マーカー
マルチインスタンス・マーカーによって、データのセット上の各要素のサブプロセスを実行できます。BPMNサービス・エンジンがマルチインスタンス・ループ・マーカーを使用してサブプロセスを実行すると、インスタンスのセット、データのセット上の各要素のインスタンスが作成されます。パラレルまたは順番にこれらのインスタンスを処理するように、マルチインスタンス・マーカーを構成できます。
マルチインスタンス・ループ・マーカーの次のフィールドには、式を記述する必要があります。
ループ・カーディナリティ
この式は、サブプロセス内に作成するトークンの数を定義します。
完了条件
この式は、サブプロセスの繰返しを停止する時期を決定します。BPMサービス・エンジンは、トークンがサブプロセスを完了するたびにこの条件を評価します。条件がtrueと評価されると、サブプロセスが完了したとみなされ、インスタンスはプロセス内の次のフロー・オブジェクトに移動します。
ループ・マーカーを構成して、サブプロセスを複数回実行できます。
ループ・マーカーを構成するには:
サブプロセスを右クリックします。
「プロパティ」を選択します。
「ループ特性」タブをクリックします。
「ループ」を選択します。
次のように、ループ条件を指定します。
式言語を選択します。
使用可能なオプションは「シンプル」または「XPath」です。
下のテキスト領域に、ループを駆動する条件を記述します。
オプションで、式ビルダーを使用して条件を記述できます。式ビルダーを起動するには、テキスト領域の横にある「式ビルダー」ボタンをクリックします。
オプションで、次のように、実行するループの最大回数を指定できます。
「ループ最大」を選択します。
数字を指定します。
「次より前」を選択してフロー・オブジェクトの実行前に条件を評価するか、選択解除してフロー・オブジェクトの実行後に条件を評価します。
「OK」をクリックします。
マルチインスタンス・マーカーを構成して、データのセットに基づいてサブプロセスを複数回実行できます。
マルチインスタンス・マーカーを構成するには:
サブプロセスを右クリックします。
「プロパティ」を選択します。
「ループ特性」タブをクリックします。
「MultiInstance」を選択します。
次のように、ループ・カーディナリティを指定します。
式言語を選択します。
使用可能なオプションは「シンプル」または「XPath」です。
下のテキスト領域に、ループ・カーディナリティの指定を記述します。
オプションで、式ビルダーを使用して条件を記述できます。式ビルダーを起動するには、テキスト領域の横にある「式ビルダー」ボタンをクリックします。
オプションで、次のように、完了条件を指定できます。
式言語を選択します。
使用可能なオプションは「シンプル」または「XPath」です。
下のテキスト領域に、ループが完了したかどうかを決定する条件を記述します。
オプションで、式ビルダーを使用して条件を記述できます。式ビルダーを起動するには、テキスト領域の横にある「式ビルダー」ボタンをクリックします。
データ出力を指定するには、「ループ・データ出力」フィールドの横にある「参照」ボタンをクリックします。
データ・オブジェクトまたはサブプロセスに渡す複合データ・オブジェクトの属性を選択できます。通常、選択したデータ・オブジェクトはアイテムのコレクションです。
データ入力を指定するには、「ループ・データ入力」フィールドの横にある「参照」ボタンをクリックします。
データ・オブジェクトまたはサブプロセスの結果を割り当てる複合データ・オブジェクトの属性を選択します。
オプションで、「順次」チェック・ボックスを選択して、次のトークンがサブプロセスの実行を開始する前に各トークンがサブプロセスを完了する必要があることを指定します。
「OK」をクリックします。
シンプルな式ビルダーには、式を入力するテキスト領域および使用できる変数のリストが含まれています。
シンプルな式ビルダーは、次の機能をサポートしています。
構文の強調表示
シンプルな式ビルダーでは、式内の構文を強調表示して、読取りおよび理解を容易にします。異なるデータ型の値には異なる色が使用されます。
自動コード補完
メソッドを呼び出すドットの入力後に数秒待機すると、シンプルな式ビルダーでは、そのデータ・オブジェクトで呼び出すことができる使用可能な関数のリストが表示されます。シンプルな式ビルダーに式を補完させる場合、[Ctrl]+[Space]
を押すことができます。
オンザフライのエラー・チェック
式を記述すると、シンプルな式ビルダーで式がチェックされます。コンパイルされていない式の下に赤い波線が引かれます。エラーの原因を見つけるには、赤い波線の上にカーソルを置き、エラーの説明を示すツールチップが表示されるのを待ちます。
図24-1は、シンプルな式ビルダーのダイアログ・ボックスを示しています。
シンプルな式ビルダーでは、いくつかの演算子タイプを使用して式を作成できます。
算術演算子
単項演算子
等号演算子と関係演算子
条件演算子
これらの演算子を使用して式および条件を作成し、プロセス・フローを駆動できます。一般に、これらの式は、プロセス内のデータ・オブジェクトに基づいて計算を実行します。式と条件はデータ・オブジェクトの値を使用して作成できますが、値は変更できません。
次の式の例では、演算子が使用されています。
totalAmount - discount
deadlineExpired and orderStatus !=complete
activationCount > 3
unitsSold <= 1200
'now' + '2m'
deadline - '1h'
not formComplete
表24-1、表24-2、表24-3、表24-4および表24-5は、シンプルな式ビルダーでサポートされている演算子を説明しています。
表24-2 算術演算子
演算子 | 名前 | 説明 |
---|---|---|
+ |
加算 |
数値データ型を加算します。 文字列どうしを連結します。 間隔値を日時値に加算します。 |
- |
減算 |
数値データ型を減算します。 日時値から間隔値を減算します。 |
* |
乗算 |
数値データ型を乗算します。 |
/ |
除算 |
数値データ型を除算します。 |
rem |
剰余 |
除数が被除数で除算しきれない場合の剰余を計算します。 |
( ) |
優先順位 |
演算式の評価の順序を指定します。 |
表24-3 単項演算子
演算子 | 名前 | 説明 |
---|---|---|
+ |
プラス |
数値オペランドの値には影響しません。ある値が正であることを明示的に示す場合に使用します。 |
- |
マイナス |
算術式の符号をマイナスにします数字の符号を反転します。 |
NOT |
NOT |
論理補数演算子。ブール式の値を否定します。 |
表24-4 等号演算子と関係演算子
演算子 | 名前 | 説明 |
---|---|---|
= |
等しい |
最初のオペランドが2番目のオペランドと等しい場合にTrueを戻します。 |
!= |
等しくない |
最初のオペランドが2番目のオペランドと等しくない場合にtrueを戻します。 |
> |
より大きい |
最初のオペランドが2番目のオペランドより大きい場合にTrueを戻します。 |
>= |
次以上 |
最初のオペランドが2番目のオペランド以上の場合にTrueを戻します。 |
< |
より小さい |
最初のオペランドが2番目のオペランドより小さい場合にtrueを戻します。 |
<= |
次以下 |
最初のオペランドが2番目のオペランド以下の場合にTrueを戻します。 |
表24-5 条件演算子
演算子 | 名前 | 説明 |
---|---|---|
and |
条件付きAND |
両方のオペランドがtrueと評価された場合にtrueを戻します。 |
or |
条件付きOR |
1つのオペランドがTrueと評価された場合にTrueを戻します。 |
シンプルな式ビルダーでは、式および条件を計算および操作するのに使用できる関数をサポートしています。
次の項では、シンプルな式ビルダーでサポートされている関数を説明しています。
次の関数によって、文字列変数およびリテラルを操作し、これらに基づいて計算を実行できます。
この文字列内の文字数を戻します。
シグネチャ:
int length(string stringToMeasure)
引数:
string - 測定する文字列。
例:
name.length()
length(name)
name.length
文字列に指定された文字列が含まれる場合にtrueを戻します。
シグネチャ:
boolean contains(string mainString, string subString)
引数:
subString
- 検索する文字列。
例:
productName.contains("book")
contains(productName, "book")
次の関数によって、数値のデータ型を使用した計算を実行できます。使用可能な数値のデータ型は、倍精度浮動小数点、小数および整数です。
この関数を呼び出すのに使用される数値よりも小さい値のうち最大の整数値を戻します。倍精度浮動小数点および小数のデータ型でこの関数を使用できます。
シグネチャ:
int floor(double number)
int floor(decimal number)
引数:
double / decimal - この関数のベースとして使用する数値。
例:
number.floor()
floor(number)
number.floor
floor(totalAmount/3)
temperature.floor()
この関数を呼び出すのに使用される数値よりも大きい値のうち最小の整数値を戻します。倍精度浮動小数点および小数のデータ型でこの関数を使用できます。
シグネチャ:
int ceil(double number)
int ceil(decimal number)
引数:
double / decimal - この関数のベースとして使用する数値。
例:
number.ceil()
ceil(number)
number.ceil
この数字に最も近い整数値を戻します。同等に近い整数値が2つある場合、大きい方を戻します。倍精度浮動小数点および小数のデータ型でこの関数を使用できます。
シグネチャ:
int round(double number)
int round(decimal number)
引数:
double / decimal - この関数のベースとして使用する数値。
例:
number.round()
round(number)
number.round
次の関数によって、時間変数およびリテラルを操作し、これらに基づいて計算を実行できます。使用可能な時間のデータ型は、日時および期間です。
この日時の変数の年を戻します。
シグネチャ:
int year(dateTime date)
引数:
dateTime - 年の取得元の日付。
例:
today.year()
year(today)
today.year
この日時の変数の月を戻します。
シグネチャ:
int month(dateTime date)
引数:
dateTime - 月の取得元の日付。
例:
today.month()
month(today)
today.month
この日時の変数の日を戻します。
シグネチャ:
int day(dateTime date)
引数:
dateTime - 日の取得元の日付。
例:
today.day()
day(today)
today.day
この日時の変数の時間を戻します。
シグネチャ:
int hours(dateTime date)
引数:
dateTime - 時間の取得元の日付。
例:
today.hours()
hours(today)
today.hours
この日時の変数の分を戻します。
シグネチャ:
int minutes(dateTime date)
引数:
dateTime - 分の取得元の日付。
例:
today.minutes()
minutes(today)
today.minutes
この日時の変数の秒を戻します。
シグネチャ:
int seconds(dateTime date)
引数:
dateTime - 秒の取得元の日付。
例:
today.seconds()
seconds(today)
today.seconds
Oracle BPMでは、SOA XPath式ビルダーを使用して式を記述できます。この式ビルダーは、標準XPATH言語をサポートしています。
XPath式ビルダーでは、式で使用できる変数のリストが表示されます。また、式で使用できる関数のリストも表示されます。関数を選択すると、式に追加する前にその関数の構文および説明をプレビューできます。
XPathに対してサポートされている関数の詳細は、Oracle SOA SuiteでのSOAアプリケーションの開発のXPath拡張関数に関する項を参照してください。
さらに、Oracle BPMはBPM拡張関数のグループをサポートしています。
図24-2は、XPath式ビルダーを示しています。
いくつかのサービス操作は、配列タイプの引数が必須であるか、戻す場合があります。この配列は、単純タイプまたは複合タイプのコレクションであることができます。
配列タイプのパラメータをサービス操作に提供する場合は、次のことを実行できます。
配列を戻す操作の起動
配列リテラルを使用した配列の定義
配列リテラルの定義の詳細は、「配列リテラルの使用」を参照してください。
通常、プロセス操作が配列タイプの引数を戻す場合、データ・アソシエーションを使用して、配列の要素のいずれかまたは要素のいずれかの属性をデータ・オブジェクトに割り当てます。データ・アソシエーションの詳細は、「データ・アソシエーション・エディタの概要」を参照してください。
例24-2に、配列の要素にアクセスする式を示します。この例での配列の名前はpersonsで、アクセスする要素は配列の3番目の要素です。
配列の最初の要素の索引が1であることに注意してください。たとえば、persons配列内の最初の要素にアクセスするには、persons[1]という式を記述する必要があります。
例24-2 配列の要素にアクセスする式
persons[3]
シンプルな式言語では、配列内の要素の属性にアクセスすることもできます。たとえば、personsの配列を戻すサービス操作を起動し、配列内の要素の名前属性にアクセスして、データ・アソシエーションを使用してプロセス・データ・オブジェクトに渡すことができます。
例24-3に、配列の要素の属性にアクセスする式を示します。この例での配列の名前はpersonsで、アクセスする要素は配列の3番目の要素、アクセスする属性はその人物の名前です。
例24-3 配列の要素の属性にアクセスする式
persons[1].name
シンプルな式言語を使用すると、配列の長さを取得してプロセス・ロジックでそれを使用することができます。これは、マルチインスタンス・マーカーのループ・カーディナリティを定義する場合によく使用します。マルチインスタンス・マーカーの詳細は、「サブプロセス内のループ・マーカーおよびマルチインスタンス・マーカーでの条件の記述」を参照してください。
配列の長さを取得するには、length関数を呼び出す必要があります。
例24-3は、配列の長さを取得する式を示しています。この例の配列の名前はpersonsです。例では関数名の後にカッコを使用していますが、この関数にはパラメータが必要ないため、カッコを省略してもかまいません。
例24-4 配列の長さを取得する式
persons.length()
リテラルは、特定の値を表すことができます。リテラルは、値をデータ・オブジェクトに割り当てる場合にも、起動するメソッドにパラメータを渡す場合にも使用できます。値をデータ・オブジェクトに割り当てるには、データ・アソシエーションまたはスクリプト・タスクを使用できます。
シンプルな式言語は、次のタイプのリテラルをサポートします。
文字列リテラル
時間リテラル
期間リテラル
配列リテラル
リテラルを使用して値を文字列型のデータ・オブジェクトに割り当てることができます。文字列リテラルを使用すると、文字列型のパラメータをメソッドに提供することもできます。
文字列リテラルを定義するには、単語または一連の単語を二重引用符で囲んで記述する必要があります。文字列に数値を含めることもできます。
次に、文字列リテラルの例を示します。
"Wednesday"
"marie@oracle.com"
"500 Oracle Parkway"
"+1.650.506.7000"
リテラルを使用して値を時間型のデータ・オブジェクトに割り当てることができます。時間リテラルを使用すると、時間型のパラメータをメソッドに提供することもできます。
時間リテラルは、様々なレベルの精度を使用して日付を定義できます。
次に、時間型の変数の指定に使用できる様々な時間リテラルの例を示します。
'13:30'
'13:30:23'
'13:30:23.001023'
'13:30:23.001023Z
'
'13:30:23.001023-05'
'13:30:23.001023-3:30'
'1979-02-19'
'1979-02-19 13:30'
'1979-02-19 13:30:23'
'1979-02-19 13:30:23.001023'
'1979-02-19 13:30:23.001023Z'
'1979-02-19 13:30:23.001023-05'
'1979-02-19 13:30:23.001023-3:30'
'1979-02-19T13:30'
'1979-02-19T13:30:23'
'1979-02-19T13:30:23.001023'
'1979-02-19T13:30:23.001023Z'
'1979-02-19T13:30:23.001023-05'
'1979-02-19T13:30:23.001023-3:30'
'19790219T'
'19790219T133023.001023-330'
期間間隔リテラル型のデータ・オブジェクトに値を割り当てることができます。間隔リテラルを使用すると、期間型のパラメータをメソッドに提供することもできます。
期間リテラルは、様々なレベルの精度を使用して日付を定義できます。
時間リテラルを定義するには、値の組合わせを使用し、その後に時間の単位を一重引用符で囲んで続ける必要があります。
表24-6に、使用可能な時間単位フィールドを示します。
表24-6 時間単位接尾辞
時間単位接尾辞 | 説明 |
---|---|
Y |
年 |
M |
月 |
dまたはD |
日 |
hまたはH |
時 |
m |
分 |
sまたはS |
秒 |
x |
マイクロ秒 |
表24-7に、時間隔リテラルの例を示します。
表24-7 時間隔リテラルの例
例 | 説明 |
---|---|
|
1年、1か月、3時間、2分、1.500ミリ秒 |
|
1.5時間 |
|
3か月と15日 |
BPM拡張関数では、XPathを使用して様々な要素にアクセスできます。XPathでは、これは、BPMNプロセス内に記述された要素の値にアクセスする唯一の方法です。
プロセスおよびプロジェクト・データ・オブジェクト
引数
アクティビティ・インスタンス属性
また、Oracle SOA Suiteに用意されているXPath拡張関数を使用することもできます。詳細は、Oracle SOA SuiteでのSOAアプリケーションの開発のXPath拡張関数に関する項を参照してください。
特定のアクティビティ・インスタンス属性の値を戻します。サポートされているアクティビティ・インスタンス属性の詳細は、「アクティビティ・インスタンス属性の概要」を参照してください。
シグネチャ:
bpmn:getActivityInstanceAttribute(activityName, attributeName)
引数:
activity name
- アクティビティ・インスタンス属性を含むアクティビティの名前。
attributeName
- 値を検索するアクティビティ・インスタンス属性の名前。
例:
bpmn:getActivityInstanceAttribute(userTask, priority)
bpmn:getActivityInstanceAttribute(userTask, title)
データ・アソシエーション内の特定の入力引数の値を戻します。
シグネチャ:
bpmn:getDataInput(dataInputName)
引数:
dataInputName
- データ入力引数の名前を含む文字列。
特定のデータ・オブジェクトの値を戻します。
シグネチャ:
bpmn:getDataObject(dataObjectName)
引数:
dataObjectName
- 値を取得するデータ・オブジェクトの名前を含む文字列。
例:
bpmn:getDataObject(discount)
bpmn:getDataObject(approveTermsOutcome)
データ・アソシエーション内の特定のデータ出力引数の値を戻します。
シグネチャ:
pmn:getDataOutput(dataOutputName)
引数:
dataOutputName
- データ出力引数の名前を含む文字列。
ゲートウェイでの特定のアクティビティ・インスタンス属性の値を戻します。ゲートウェイでサポートされているアクティビティ・インスタンス属性の詳細は、「アクティビティ・インスタンス属性の概要」を参照してください。
シグネチャ:
bpmn:getGatewayInstanceAttribute(gatewayName, attributeName)
引数:
gatewayName
- 値を取得する属性を含むゲートウェイの名前を含む文字列。
attributeName
- 値を取得する属性の名前を含む文字列。
プロセス・アクティビティ・インスタンス属性に対応する値を戻します。サポートされているアクティビティ・インスタンス属性の詳細は、「アクティビティ・インスタンス属性の概要」を参照してください。
シグネチャ:
bpmn:getProcessInstanceAttribute(attributeName)
引数:
attributeName
- 値を検索するプロセス・インスタンス属性の名前を含む文字列。
例:
bpmn:getProcessInstanceAttribute(owner)