Groovyスクリプト・ベースの生存ルールおよび契約ルールを構成するベスト・プラクティス
このトピックでは、Groovyスクリプトを構成するベスト・プラクティスについて説明します。
-
マスターの設定ルールにGroovyスクリプトを使用するように実装を構成すると、有効なマスターの設定スクリプトが配置されるまで、マージは処理されません。
-
Oracle Business Rulesフレームワークを使用する「生存ルールの管理」設定タスクを使用して作成された生存ルールは、Groovyスクリプト生存ルールを有効にしない場合でも引き続き機能します。
-
「マスターの設定」ルールまたは「契約」ルールのような特定の生存プロセス・タイプには、GroovyスクリプトまたはOracle Business Rulesを使用できます。 1つのプロセス・タイプに2つのフレームワークを組み合せることはできません。 たとえば、Groovyスクリプトを使用してマスターの設定ルールを定義し、Oracle Business Rulesを使用して別のマスターの設定ルールを定義することはできません。
-
マスターの設定ロジックにOracle Business Rulesを使用し、属性の設定ロジックにGroovyスクリプトを使用するなど、異なる生存プロセス・タイプ間でOracle Business RulesとGroovyスクリプトを組み合せることはできます。
-
属性生存処理で最高のパフォーマンスを実現するには、属性の設定生存ロジックに対して、可能なかぎり属性ソース確度を使用するようにしてください。
-
マージ要求処理では大量のレコードが処理される可能性があるため、Groovyスクリプトはできるだけ高速かつ効率的である必要があります。 絶対に必要な場合を除いて、
newView()
関数およびWebサービス・コールを使用しないでください。必要な場合は、これらのタイプの操作が高速で信頼性が高いことを確認してください。 -
「顧客データ管理オプションの管理」設定ページからソース確度を使用する「属性選択タイプ」オプションのいずれかを選択します。
-
必要な場合は、ソース確度構成とともにGroovyスクリプトを使用して、例外シナリオを処理します。
Groovyスクリプト関数の概要
生存ルールおよび契約ルールを構成するためのGroovyスクリプトのサポートは、マージ要求のコンテキストでデータ・レコードと相互作用できる特定の関数のセットに基づいています。 これらの関数には、次のカテゴリがあります。
-
マージ要求のレコードを検査できる関数
-
マージ要求の結果を定義できる関数
これらの特殊な関数のカテゴリは、標準のGroovyスクリプト構文および操作を使用した生存ルールおよび契約ルールの作成に役立ちます。
Input Functions
これらの関数は、生存ルールおよび契約ルールによって評価されるデータを提供します。 一般に、これらの関数は、適切なマージ・プロセス出力を決定するために必要な情報をインスタンス化するために、スクリプトの先頭で呼び出されます。
getRuleType()
この関数を使用して、スクリプトの機能コンテキストを判断できます。 この関数は、どのタイプのスクリプトで呼び出されるかに応じて、SetAttribute、SetMaster
または契約を返します。 スクリプト・タイプはアプリケーション・コンポーザの「データ品質ルール」タスク内で個別の関数として示されるため、一般にプログラムでルール・タイプを決定する必要はありません。 ただし、ロギングやテストに役立つ場合もあります。
getObjectType()
この関数を使用して、マージ要求が処理するパーティのタイプを決定できます。 この関数は、どのタイプのスクリプトで呼び出されるかに応じて、PERSONまたはORGANIZATIONを返します。 一般に、個人および組織のスクリプトはアプリケーション・コンポーザの「データ品質ルール」タスク内で個別の関数として明確に区別されるため、プログラムでオブジェクト・タイプを決定する必要はありません。 ただし、ロギングやテストに役立つ場合もあります。
getMaster()
この関数を使用して、マージ要求のマスター・レコードとして識別されているデータ・レコードにアクセスできます。 関数はパラメータなしで呼び出され、マスター・レコードの詳細を含む単一の行オブジェクトを返します。 次の例は、この関数の一般的な使用方法を示しています。
def rowMaster = getMaster();
def masterName = rowMaster.getAttribute("OrganizationName");
// etc...
getNonMasters()
この関数を使用して、マージ・プロセスにより非アクティブ化されるためマージ要求の非マスター・レコードとして識別されたデータ・レコードのセットにアクセスできます。 この関数は、パラメータなしで呼び出され、各非マスター・レコードに対して1つのリスト・エントリで構成される行オブジェクトのリストを返します。 getNonMasters
リストはADF recordset object
ではないことに注意してください。 reset()やfirst()などのADF recordset functions
は、リストでは機能しません。 次の例は、この関数の一般的な使用方法を示しています。
getNonMasters()
def rowNonMasters = getNonMasters();
def nonmasterName;
for (nonmaster in rowNonMasters) {
nonmasterName = nonmaster.getAttribute("OrganizationName"); }
// etc...
getRows()
この関数を使用して、マスター行と非マスター行のセットの結合である、マージ要求の顧客レコードの全セットにアクセスできます。 この関数は、パラメータなしで呼び出され、各非マスター・レコードに対して1つのリスト・エントリで構成される行オブジェクトのリストを返します。 getNonMasters
関数と同様に、getRows
リストがADF recordset object
ではないことに注意してください。 reset()やfirst()などのADF recordset functions
は、リストでは機能しません。 次の例は、この関数の一般的な使用方法を示しています。
def rowDuplicates = getRows()
def duplicateName;
for (duplicate in rowDuplicates) {
duplicateName = duplicate.getAttribute("OrganizationName"); }
// etc...
getSourceInfo(Row row, String attributeName)
この関数を使用して、特定のマスター行または非マスター行の属性の現在の値を提供したソース・システムに関する情報にアクセスできます。 この関数は、次のパラメータを使用して呼び出されます。
-
対象となる非マスターまたはマスター行の行オブジェクト
-
ソース確度構成済属性の名前
この関数は、問題の属性のソース情報レコードを返します。 ソース情報レコードの構造は次のとおりです。
属性 |
定義 |
例 |
---|---|---|
|
行オブジェクト・パラメータによって参照される個人または組織レコードのパーティID。 |
300100184760397 |
|
属性パラメータの名前。 |
OrganizationName |
|
行の属性の現在の値。 |
Pinnacle Systems |
|
属性値の登録済ソース・システムのコード。 |
RNOW |
|
指定されたソース・システムの指定の属性の構成済属性ソース確度値。 |
90 |
|
個人または組織レコードが現在の値で更新されたときのタイムスタンプ。 |
1/24/2020 11:48:03 PM |
getSourceInfo
関数は、「ソース・システム信頼度の管理」設定タスクを使用してソース・システムの信頼度で構成された属性にのみ使用できます。
次の例は、この関数の一般的な使用方法を示しています。
def rowDuplicates = getRows();
def rowSource;
def bestSource;
def bestValue;
bestSource = getSourceInfo(rowDuplicates[0],"OrganizationName");
for (row in rowDuplicates) {
rowSource = getSourceInfo(row,"OrganizationName");
if(rowSource.SourceConfidenceLevel > bestSource.SourceConfidenceLevel) {
bestSource = rowSource;
}
}
bestValue = bestSource.AttributeValue;
Output Functions
出力関数は、生存ルール・スクリプトまたは契約ルール・スクリプトのロジックに基づいて、マージ・プロセスの最終的な動作を作成します。 一般に、これらの関数は、入力関数で提供されたデータがスクリプト・ロジックで評価された後に、スクリプトの最後に呼び出されます。
selectMaster(Row row)
この関数は、マージ後にマスター・レコードとして保持するマージ要求のレコードを指定するために、担当者およびアカウントのマスターの設定スクリプトで使用されます。 この関数は、データ行インスタンスをその唯一のパラメータとして取り、関数に渡される行はマスターとして保持されるレコードです。 マージ要求内の他のすべてのレコードは、マージ処理中に非アクティブ化されます。 次の例は、この関数の一般的な使用方法を示しています。
...
def masterRow = rowDuplicates[0];
for (row in rowDuplicates) {
if row.LastUpdateDate > masterRow.LastUpdateDate {
masterRow = row;
}
}
selectMaster(masterRow);
selectAttribute(String attributeName, Row row)
この関数は、マージ内のレコード全体でどの属性値インスタンスをマスター・レコードの作成に使用するかを定義するために、担当者およびアカウントの属性の設定スクリプトで使用されます。 この関数は、そのパラメータとして属性の名前と行インスタンスを使用します。 特定の行で見つかった特定のパラメータの値は、マスター・レコードで保持されます。 この関数は、重複解決上書きフローを使用して特定の属性のソース・レコードを選択することと論理的に同等です。 次の例は、この関数の構文を示しています。
def rowDuplicates = getRows();
def bestSourceRow;
def fieldName = "OrganizationName";
rowBestSource = rowDuplicates[0];
for (row in rowDuplicates) {
if(getSourceInfo(row, fieldName).SourceConfidenceLevel > getSourceInfo(rowBestSource, fieldName).SourceConfidenceLevel) {
rowBestSource = row;}
}
selectAttribute(fieldName, rowBestSource);
overrideAttribute(String attributeName, Object attributeValue)
この関数は、マージ要求内のレコードから通常の方法で導出できないマスター・レコードの属性値を指定するために、担当者およびアカウントの属性の設定ルールで使用されます。 この関数は、属性の名前および属性の値をパラメータとして使用し、マスター・レコードの指定されたフィールドの最終値を指定された値に設定します。 この関数は、重複解決上書きフローを使用して特定の属性に独自の値を入力することと論理的に同等です。
この関数は外部定義の値を設定するため、値のデータ型と書式が正しいことを確認してください。
次の例は、この関数の構文を示しています。
def fieldName = "OrganizationName";
def fieldValue = "Pinnacle Systems";
overrideAttribute(fieldName, fieldValue);
この関数は、指定した条件のセットがマージ要求のレコード内に検出された場合に、マージ要求を拒否するために、担当者およびアカウントの契約ルール・スクリプトで使用されます。 この関数は、拒否条件が満たされた場合にマージ要求時に表示される拒否メッセージを定義する単一のパラメータを使用します。 次の例は、この関数の構文を示しています。
def rowNonMasters = getNonMasters;
for (row in rowNonMasters) {
if (row.value != null) {
rejectRequest("Unable to merge contacts that have this value");}
}
データの評価
適切な関数を呼び出したら、生存ルールまたは契約ルールのスクリプトでデータを評価し、正しいマージ結果を決定する必要があります。 この評価プロセスでは、標準のGroovyスクリプトの演算子および関数が使用されます。 Groovyスクリプトの詳細は、『Oracle Applications Cloud Groovyスクリプト・リファレンス』ガイドを参照してください。
まとめ
通常、Groovyスクリプトで次のパターンに従うことができます。
-
Call Input Functions
-
Evaluate the Data
-
Call Output Functions
この概念をさらに説明するために、レコードの最新の「最終更新日」に基づいてマージ要求のマスター・レコードを特定する簡単なスクリプトを次に示します。
/* Input Functions: call getRows() to initialize a list of the party records in the merge request and then
define a variable to designate the Master record and set it to the first record in the list of Rows */
def rowDuplicates = getRows();
def masterRow = rowDuplicates[0];
/* Evaluate the Data: iterate through the list of records to determine if the current list item
was more recently updated than whatever record has been designated the master. If the current record was more recently updated,
promote it to become the new Master */
for (row in rowDuplicates) {
if (row.LastUpdateDate > masterRow.LastUpdateDate) {
masterRow = row;
}
}
/* Call Output Functions: use the selectMaster() function to dictate which record from the merge set
should become the master */
selectMaster(masterRow);
Groovyスクリプトのベスト・プラクティス
Groovyスクリプトを使用して生存ルールおよび契約ルールを計画および構成する場合、次の点を考慮してください。
-
getRows()、getNonMasters()
およびgetMaster()
関数で返される行は、Oracle ADF recordset object
ではなく、標準のGroovyスクリプト・リスト・オブジェクトです。reset()、first()
またはhasNext()
などのADF関数ではなく、(リストの項目)などのrecordset
をトラバースするために標準のGroovyメソッドを使用する必要があります。 -
getRows()、getNonMasters()
またはgetMaster()
関数のレスポンスは、スクリプト実行ごとにキャッシュされます。 したがって、スクリプトの行オブジェクトのデータ状態にスクリプト実行のスコープ内の変更が表示されません。 -
マスターの設定スクリプトの結果は、属性の設定スクリプトまたは契約ルール・スクリプトで呼び出される
getNonMasters()またはgetMaster()
関数へのレスポンスに反映されます。 -
生存スクリプト内で解決要求ヘッダー・オブジェクトにアクセスすることはできません。 このトピックで説明している
入力関数
は、スクリプト内のデータ・オブジェクトを初期化するためにサポートされている唯一の手段です。 -
selectAttribute()
関数およびoverrideAttribute()
関数は、行オブジェクトのトップレベル属性で使用できます。 埋込みの子レコード集合を含むフィールドは、これらの関数では操作できません。 -
カスタム・エンティティがアプリケーション・コンポーザで作成されたときに指定された属性またはオブジェクトのAPI名を使用して、カスタム属性およびカスタム子オブジェクトと相互作用できます。
-
このトピックで説明するスクリプト・フラグメントは、
入力および出力関数
の構文および使用方法を説明することを目的としています。 完全なスクリプトの例は、「サンプル・スクリプト」の項を参照してください。 -
Groovyスクリプトを記述するためのいくつかのベスト・プラクティスは、My Oracle Support: https://support.oracle.com/epmos/faces/DocumentDisplay?id=2170121.1の『CX Sales and Fusion Serviceを拡張するためのパフォーマンス・ベスト・プラクティス』(ドキュメントID 2170121.1)の「スクリプトの使用のパフォーマンス・ベスト・プラクティス」の項を参照してください
-
Groovyスクリプトの生存ルールおよび契約ルールのテンプレートは、マスター設定ルール、属性生存ルールおよび契約ルールを構成する場合にのみ使用する必要があります。 これらのテンプレートを一般的な処理拡張や自動化で使用することはサポートされていないため、不適切な動作や予測できない動作が発生することがあります。