わかりにくいルールを記述すると、アプリケーションの全側面に大きな影響を与えます。ここでは、ビジネス・ルールを設計する際のベスト・プラクティスをいくつか説明します。次のベスト・プラクティスの推奨事項により、パフォーマンスに大きなメリットを得られます。
ビジネス・ルールに関する次の主要な設計ガイドラインに従ってください。
ルールに関する上位10のベスト・プラクティス
ビジネス・ルールを設計する際は、次のベスト・プラクティスの推奨事項に従ってください。わかりにくいルールを記述すると、アプリケーションの全側面に大きな影響を与えるため、これらのガイドラインにより、パフォーマンスの大きなメリットを得られます。
SETコマンドに関して次のガイドラインに従います:
SET CREATEBLOCKONEQ ON
およびSET CREATENONMISSINGBLK ON
を使用しないでください。SET CLEARBLOCK EMPTY
SET CALCTASKDIMS
を使用するルールは避けるかテストしてください。(Oracle Essbaseでは通常、これが自動的に実行されます。)SET COPYMISSINGBLOCK OFF
DataCopyまたは疎メンバー割当のいずれかを使用して、ブロック作成を実行する必要があります。制限されたFix文内で最終手段として@createblockoneq
および@createblock
関数が使用される必要があります。
Fix文での欠落ディメンションの参照を避けてください(たとえば、「データのコピー」ルール)。これにより、すべてのレベルの欠落ディメンションに対して、無駄な処理時間がかかり、競合が増え、不要なブロックが作成される可能性があります。
フォームに関連付けられたビジネス・ルール内の並列計算を削除します。Calc ParallelまたはFix Parallelは、管理/バッチ・ルールでのみ使用される必要があります。
ブロックおよびデータの急増を引き起こすため、不要なゼロを作成しないでください。ビジネス・ロジックを慎重に確認し、ゼロをチェックするために必要なIF条件を追加します。ゼロを#missing
に変換します。
同じブロック上の複数のパスを消去します。かわりに、適切な外部のFixを設定し、必要に応じて内外に移動します。同じ交差でIF文を使用および再使用するのではなく、IF文を結合します。
等式の左側でディメンション間参照を使用するのを避けてください。これはパフォーマンスに影響します。
スクリプト内のブロックの作成数が最も多い順にディメンションを集約します。たとえば、Agg (1番目にブロック数が多いディメンション、2番目にブロック数が多いディメンション、3番目にブロック数が多いディメンション)などです。AggはCalc Dimより高速で、集約に対して優先されるメカニズムです。エンド・ユーザー・ルールでディメンションの最上部まで@ancestors
を使用して集約すると、ブロックの競合が発生する可能性があります。
基礎となる同じロジックを使用して複数のルールを作成するのではなく、実行時プロンプトを使用します。ルールが増えると、メンテナンスも増えます。
ビジネス・ロジックを分解して再使用するために、テンプレートを使用します。ただし、テンプレートでは、Fix、EndFixを使用するルールを完全に機能させることはできません。様々なテンプレートを組み合せたルールに適切な外部のFixがあり、必要に応じて小規模な部分を内外に移動する必要があります。
計算を使用したビジネス・ロジックの追加
ビジネス・ロジックをアプリケーションに組み込むために、Calculation Managerを使用して計算を構築できます。これを使用すると、ビジネスの問題を解決する高度な計算を作成、検証、デプロイおよび管理できます。
通常、ビジネス・ルールおよびルールセットは次の目的で作成します:
収益モデリングの実行
費用モデリングの実行
KPIの計算
割当ての実行
Calculation Managerには次のオブジェクトが用意されています。
ルール: コンポーネントとテンプレートを含みます
コンポーネント: ルールの構築を支援します
ルールセット: 同時または順次に計算できるルールを含みます
テンプレート: 計算を実行するシステム・テンプレート、および管理者が設計できるカスタム・テンプレートを含みます
コンポーネント: ルールの構築を支援します
計算の作成についてさらに学習するには、Oracle Enterprise Performance Management Cloud Calculation Managerでの設計のガイドラインを参照してください。
集約の構築
集約によって、エンティティやその他の疎ディメンションなど、ディメンション内のサマリー・レベル・メンバーにアプリケーションがロールアップされます。
Calculation Managerには、集約の構築に役立つテンプレートが用意されています。テンプレートの使用方法に関するいくつかの提案を次に示します。
視点の設定
視点を設定すると、選択されたメンバーのみに対してルールが実行されます。ディメンションの実行時プロンプトを使用すると、ユーザーは、ルールの起動時にそれらのディメンションのメンバー値を指定できます。これにより、ユーザーは、Calculation Managerでルールを変更しなくても、様々な年、シナリオおよびバージョンについてルールを複数回起動できます。
一般的な設定:
完全な密の集約: 密ディメンションの親の値が動的計算に設定されていない場合、このセクションに入力します。通常、このタブは空のままです。
完全な疎の集約: 集約する必要がある疎ディメンションを選択します。選択したディメンションの順序は関係ありません。
部分的なディメンション集約 - 密: 密ディメンションの親の値が動的計算に設定されていない場合、このセクションに入力します。通常、このタブは空のままです。
データを現地通貨で集約します: いいえ
データベースの欠落値を集約します: はい
疎ディメンションの計算を最適化します: オフ
計算機キャッシュの値を選択します: デフォルト
このウィザードのデバッグ・モードをアクティブ化しますか?: 「デバッグ・ウィザード・オン」または「デバッグ・ウィザード・オフ」。このテンプレート内の一部の設計時プロンプトの選択内容を表示するために生成されたスクリプトを確認する場合は、「デバッグ・ウィザード・オン」を選択します。
ベスト・プラクティス:
エンティティ、シナリオ、バージョンなどのメンバーの実行時プロンプトを利用します。これにより、ユーザーの入力に基づいてルールを動的に実行できます。
通常、勘定科目や期間などの密ディメンションを集約する必要はありません。この場合、親メンバーを動的計算に設定できます。ただし、密ディメンションに関するメンバー式があり、それらが動的計算に設定されていない場合は、Calc Dimルールが必要です。
詳細な計算の構築
Calculation Managerを使用して、ビジネスの問題を解決する計算の作成、検証、デプロイおよび管理を行います。
Calculation Managerで計算できるオブジェクトには3つのタイプがあります:
ルールセット: 同時または順次に計算できるルールを含みます
ルール: コンポーネントとテンプレートを含みます
コンポーネント: 式コンポーネント、スクリプト・コンポーネント、条件コンポーネント、範囲コンポーネントおよび固定ループ・コンポーネントを含みます
ベスト・プラクティス:
ルールを構築する際の最初のステップとして、ビジネス・ロジックと、ルールが適用されるエンティティまたは部署を確実に理解しておきます。たとえば、ルールに含まれる勘定科目を把握しておいてください。
ソース勘定科目と宛先勘定科目を確実に把握しておきます。
計算のドライバを十分に理解してから、適切なオブジェクト・コンポーネントまたはテンプレートを使用してルールを構築します。コンポーネントおよびテンプレートによってメンバーの選択が容易になり、ルールを簡単にデプロイできます。
エンティティ、シナリオ、バージョンなどのメンバーの実行時プロンプトを利用すると、ユーザーの入力に基づいてルールを動的に実行できます。
Calculation Managerの診断
ルールをデプロイする前に、エラーおよび警告を実行します。これにより、次のような役立つ情報が提供されます:
if (<q>Earned Premium</q><>0)
というIF文が含まれる必要があります。これにより、アプリケーション内でゼロはあまり多くなりません。ルール例の問題と解決策
例1: データベースの複数のパス・スルーを作成するルール
次のルールは、年と期間、通貨および勘定科目に対して、データベースの10のパス・スルーを作成します。
例2: データベースのパス・スルーを1つのみ作成するルール
次のルールは、データベースのパス・スルーを1つのみ作成します。これにより、影響を受けるセルの合計を大幅に減らします。
例3: ゼロをコピーおよび作成するルール
このルールでは、等式の右側のいずれかのコンポーネントに0が含まれる場合、導出されるメンバーは0になります。集約後に多数のゼロが存在します。これに対処するには、ルールに、if ("Earned Premium"<>0)
というIF文が含まれる必要があります。これにより、アプリケーション内でゼロはあまり多くなりません。
例4: BSOキューブからのゼロの削除
次の式の結果は、元の値になるか、0の場合は#missingに変更されます。
"DenseMbr" = "DenseMbr" * "DenseMbr"/"DenseMbr";
"SparseMbr" = "SparseMbr" * "SparseMbr"/"SparseMbr";
これに対処するには、式を利用するルールを作成します。計算はメンバーごとに実行される必要があるため、メンバー(年、シナリオ、バージョンなど)が最小の疎ディメンションを使用します。
Fix(idescendants(Entity),@levmbrs(Accounts,0),@levmbrs(Period,0),@idescendants(Custom dimensions), @levmbrs(Years,0),@levmbrs(Versions)) Actual=Actual*Actual/Actual; Fix("Actual") CLEARBLOCK EMPTY: Endfix Endfix
その後、必ず再構築を実行してください。そうしないと、空のブロックが削除されません。