设计业务规则的最佳做法

编写不当的规则会对应用程序的各个方面产生重大影响。以下是设计业务规则时的一些最佳做法。遵循最佳做法建议可以带来显著的性能优势。

遵循以下关键的业务规则设计准则。

规则的十大最佳做法

设计业务规则时遵循以下最佳做法建议。这些准则可以带来显著的性能优势,因为编写不当的规则会对应用程序的各个方面产生重大影响。

  1. 遵循以下 SET 命令准则:

    • 在规则的顶部,不要使用 SET CREATEBLOCKONEQ ONSET CREATENONMISSINGBLK ON
    • 不要在最终用户规则中使用如下的管理类型命令,因为这需要重建。
      SET CLEARBLOCK
                        EMPTY 
    • 使用 SET CALCTASKDIMS 避免或测试规则。(Oracle Essbase 通常会自动执行此操作。)
    • “数据复制”规则应包含以下内容,以防止在 Fix 语句中复制空块。
      SET COPYMISSINGBLOCK
                        OFF 
  2. 应使用数据复制或稀疏成员分配完成块创建。函数 @createblockoneq@createblock 应作为有限 Fix 语句内的最后选择。

  3. 避免在 Fix 语句中缺失维引用(例如,在数据复制规则中)。这可能会浪费处理时间,增加争用,并为所有级别的缺失维创建不必要的块。

  4. 删除与表单关联的业务规则中的并行计算。Calc Parallel 或 Fix Parallel 应仅与管理/批处理规则一起使用。

  5. 不要创建不必要的零,因为这会导致块和数据激增。仔细检查业务逻辑,并添加必要的 If 条件来检查零。将零转换为 #missing

  6. 避免在同一块上多次传递;而是,设置适当的外部固定点,并根据需要移入和移出。合并 If 语句,而不是在相同的交叉点上使用和重复使用 If。

  7. 避免在公式左侧使用交叉维引用。这会对性能产生影响。

  8. 按照脚本中从最多块到最少块的创建顺序聚合维,例如 Agg(第一最多块维、第二最多块维、第三最多块维)。Agg 比 Calc Dim 更快,是聚合的首选机制。在最终用户规则中使用 @ancestors 进行聚合一直到维的顶部可能会导致块争用。

  9. 使用运行时提示,而不是使用相同基础逻辑创建多个规则。更多规则意味着更多维护。

  10. 使用模板来分解和重用业务逻辑。但是,模板不应是具有 Fix、EndFix 的功能完备的规则。组合各种模板的规则应该具有适当的外部固定点,并根据需要移入和移出较小的部分。

使用计算添加业务逻辑

要将业务逻辑纳入应用程序,可以使用 Calculation Manager 来构建计算。这样,您就可以创建、验证、部署和管理解决业务问题的复杂计算。

通常情况下,创建业务规则和规则集是为了:

  • 执行收入建模

  • 执行费用建模

  • 计算 KPI

  • 执行分配

Calculation Manager 包括以下对象:

  • 规则:包含组件和模板

  • 组件:帮助您构建规则

  • 规则集:包含可以同步计算或按顺序计算的规则。

  • 模板:包括执行计算的系统模板和可由管理员设计的自定义模板

  • 组件:帮助您构建规则

要了解有关创建计算的更多信息,请参阅《在 Oracle Enterprise Performance Management Cloud 中使用 Calculation Manager 进行设计》中的准则。

构建聚合

聚合会将应用程序以维的形式汇总到摘要级别的成员,例如实体或其他任何稀疏维。

Calculation Manager 包括可帮助您构建聚合的模板。以下是关于如何使用模板的一些建议。

设置视点

设置视点后,只会对选择的成员运行规则。用户可以使用维的运行时提示在启动规则时指定这些维的成员值。这样一来,用户可以按照不同的年份、方案和版本多次启动规则,而无需在 Calculation Manager 中修改规则。

典型设置:

  • 完全密集聚合:如果密集维的父代值没有设置为动态计算,请完成此部分。通常此选项卡会留空。

  • 完全稀疏聚合:选择需要聚合的稀疏维。与选定维的顺序不相关。

  • 部分维聚合,密集:如果密集维的父代值没有设置为动态计算,请完成此部分。通常此选项卡会留空。

  • 将数据向上聚合至本地货币:否

  • 聚合数据库中缺少的值:是

  • 优化稀疏维上的计算:关闭

  • 选择一个计算器缓存值:默认

  • 是否要激活此向导的调试模式?:“向导调试打开”或“向导调试关闭”。如果想看到生成的脚本,请选择“向导调试打开”,显示此模板中的某些设计时间提示选项。

最佳做法:

  • 利用成员(例如实体、方案和版本)的运行时提示。这样,您的规则可以为动态规则,并基于用户输入运行。

  • 通常,帐户和期间等密集维不需要聚合。如果是这种情况,您可以将父代成员设置为动态计算。但是,如果密集维上有成员公式,且它们没有设置为动态计算,则需要计算维规则。

构建详细的计算

您可以使用 Calculation Manager 创建、验证、部署和管理能够解决业务问题的计算。

Calculation Manager 中可以计算以下三种对象类型:

  • 规则集:包含可以同步计算或按顺序计算的规则。

  • 规则:包含组件和模板

  • 组件:包含公式组件、脚本组件、条件组件、范围组件和固定循环组件

最佳做法:

  • 构建规则的第一步是确保您已了解业务逻辑以及规则适用于哪些实体和部门。例如,知道规则中涉及的帐户。

  • 确保您了解源帐户和目标帐户。

  • 充分了解计算的动因后,使用合适的对象组件或模板来构建规则。组件和模板便于进行成员选择,以帮助部署规则。

  • 利用成员(例如实体、方案和版本)的运行时提示,可使您的规则为动态规则,并基于用户输入运行。

Calculation Manager 诊断

在部署规则之前运行错误和警告。这样可以提供有帮助的信息,包括:

  • 通过数据库的次数
  • 任何必要的警告
  • 关于块数和维是否缺失的信息
  • 任何需要优化的规则
  • 如果公式右侧的任何组件包含零,则得出的成员将为 0。然后,在聚合之后,会有许多 0。
  • 要解决此问题,该规则应包含一个 if 语句,指示 if (<q>Earned Premium</q><>0)。这样,零在应用程序中就不会那么显著了。

示例规则问题和解决方案

示例 1:实现多次通过数据库的规则

以下规则按年份和期间、货币和账户实现通过数据库 10 次。

示例规则 – 多次通过数据库

示例 2:仅实现通过数据库一次的规则

以下规则仅实现通过数据库一次。这使受影响的单元格总数大量减少。

修订的规则 - 通过数据库一次

示例 3:复制和创建零的规则

在此规则中,如果公式右侧的任何组件包含 0,则得出的成员将为 0。在聚合之后,将会有许多零。要解决此问题,该规则应包含一个 if 语句,指示 if ("Earned Premium"<>0)。这样,零在应用程序中就不会那么显著了。

复制和创建 0 的规则示例

示例 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

记住之后要进行重建。否则,空块将不会被删除。