扩展维度应用程序中的计算最佳做法

将帐户作为密集维的扩展维度应用程序

如果您使用的是将帐户作为密集维的扩展维度应用程序,可以使用这些脚本编写技术。请注意与这些应用程序有关的以下要点:

  1. 维顺序:移动维是维顺序中的第一个稀疏维,称为位图维。

  2. 公司内维的父成员是动态计算。

  3. 所有自定义维必须将其父成员设置为动态计算。

  4. 这是为了具有最小的高级别块计数,并在电子表格操作过程中实现动态聚合。

  5. 在编写自定义计算时,如果顶级成员/父成员已用于现有计算,那么除了需要重写现有计算,上述第 2 点和第 3 点也很关键。


扩展维帐户和移动

SET HYBRIDBSOINCALCSCRIPT FULL / NONE

当表达式的右侧有顶级成员时,需要 HYBRIDBSOINCALCSCRIPT,例如:

"CA3_010" = "FCCS_Mvmts_Subtotal" -> "Total Custom1" -> "No Custom2";

在这种情况下,您需要为违规行禁用 HYBRIDBSOINCALCSCRIPT,然后在执行违规行后将其再次启用,例如:

SET HYBRIDBSOINCALCSCRIPT NONE
"CA3_010" = "FCCS_Mvmts_Subtotal" -> "Total Custom1" -> "No Custom2"; SET HYBRIDBSOINCALCSCRIPT FULL;

请记住,如果需要,这只能针对可配置的计算(插入点)规则进行。

SET HYBRIDBSOINCALCSCRIPT FULL / NONE

有时,当右侧只有一个顶级成员时,HYBRIDBSOINCALCSCRIPT 会减慢表达式的速度,例如:

"CA3_010" = "FCCS_Mvmts_Subtotal" -> "Total Custom1" -> "No Custom2";

在这种情况下,您需要为违规行禁用 HYBRIDBSOINCALCSCRIPT,然后在执行违规行后将其再次启用,例如:

SET HYBRIDBSOINCALCSCRIPT NONE
"CA3_010" = "FCCS_Mvmts_Subtotal" -> "Total Custom1" -> "No Custom2"; SET HYBRIDBSOINCALCSCRIPT FULL;

请记住,如果需要,这只能针对可配置的计算(插入点)规则进行。

连加技术

"Target_Account_Stored" -> "Mvmt_None" = "FCCS_Mvmts_Subtotal" -> "Source_Account_DynamicCalc" -> "Total Custom1" -> "Total Custom2";

此示例的目的是将右侧动态计算的结果存储到已存储的密集成员中。如果通过 SET HYBRIDBSOINCALCSCRIPT FULL 执行,则不会执行此计算。在这些情况下,由于自定义维的零级成员的合并运算符设为“加”,因此,您可以使用称为连加的技术。由于帐户维稀疏,您可以在动态计算源帐户下的零级成员上使用 FIX。此外,请记得关闭混合模式。

1.       SET HYBRIDBSOINCALCSCRIPT NONE; /* Turn OFF Hybrid mode */
2.      FIX( @RELATIVE( "Total Custom1", 0 ), @RELATIVE( "Total Custom2", 0 ), <other dimension members of FIX> )
3.      "FCCS_Mvmts_Subtotal" ( @CALCMODE( BOTTOMUP );
4.      "Target_Account_Stored" -> "Mvmt_None" = "Target_Account_Stored" -> "Mvmt_None" + "Source_Account_DynamicCalc";
5.      )
6.      ENDFIX

考虑以下情况:一些零级 Custom1 成员的合并运算符设置如下:Custom1_A 和 Custom1_B 成员都将合并运算符设为“减”。


连加示例 3

使用此技术时的重要注意事项:当多次执行业务规则时,目标帐户很可能具有累计值。这会导致得出错误的数字。因此,在 BOTTOMUP 处理中,请考虑将目标值初始化为 #Missing,因为脚本至少会执行一次。


连加示例 4

避免以下构造:

  1. 避免使用 CALC DIM、CALC ALL、AGG 和任何其他没有具体指定的表达式计算子树。最佳做法是限制为仅在无存储成员依赖于动态成员的维上使用 CALC DIM 和 AGG。

  2. 不在计算脚本中使用 CREATENONMISSINGBLOCK 或 CREATEBLOCKONEQ。

  3. 避免在插入点内使用以下函数:

    • @ALLOCATE

    • @CREATEBLOCK

    • @IRREX

    • @MDALLOCATE

    • @MDSHIFT

    • @MOVSUMX

    • @PTD

    • @SANCESTVAL

    • @STDEV

    • @STDEVP

    • @STDEVRANGE

    • @SYD

    • @TREND

使用稀疏成员块和 BOTTOMUP

非扩展维应用程序方案

1.FIX ("FCCS_EntityInputFCCS_EntityInputFCCS_EntityInputFCCS_EntityInput FCCS_EntityInput FCCS_EntityInputFCCS_EntityInputFCCS_EntityInputFCCS_EntityInput", "Entity "Entity Currency" Currency" Currency" Currency" Currency" Currency" Currency" )
2.FIX ("Inventory_StockInventory_StockInventory_StockInventory_Stock Inventory_StockInventory_Stock Inventory_Stock Inventory_Stock ", "FCCS_Mvmts_NetIncomeFCCS_Mvmts_NetIncomeFCCS_Mvmts_NetIncomeFCCS_Mvmts_NetIncome FCCS_Mvmts_NetIncome FCCS_Mvmts_NetIncome FCCS_Mvmts_NetIncomeFCCS_Mvmts_NetIncomeFCCS_Mvmts_NetIncome ", "FCCS_NoFCCS_NoFCCS_NoFCCS_No FCCS_NoIntercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", "No "No Product", Product", Product", Product", Product", Product", Product", "FCCS_LocalFCCS_LocalFCCS_LocalFCCS_Local FCCS_Local GAAP" GAAP" GAAP" )
3."FCCS_ManagedFCCS_ManagedFCCS_ManagedFCCS_Managed FCCS_Managed FCCS_Managed Data" Data" Data" (
4."FCCS_OtherFCCS_OtherFCCS_OtherFCCS_Other FCCS_Other FCCS_Other Data" Data" Data" ="Warehouse_StockWarehouse_Stock Warehouse_Stock Warehouse_Stock Warehouse_Stock Warehouse_Stock " +"Showroom_Stock Showroom_StockShowroom_Stock Showroom_StockShowroom_Stock Showroom_Stock ";
5.)
6.ENDFIX
7.ENDFIX ENDFIX

扩展维应用程序方案

8.FIX ("FCCS_EntityFCCS_EntityFCCS_EntityFCCS_Entity FCCS_Entity Input", Input", Input", Input", Input", Input", Input", "Entity "Entity Currency" Currency" Currency" Currency" Currency" Currency" Currency" )
9.FIX ("Inventory_StockInventory_StockInventory_StockInventory_Stock Inventory_StockInventory_Stock Inventory_Stock Inventory_Stock ", "FCCS_ManagedFCCS_Managed FCCS_Managed FCCS_ManagedFCCS_ManagedData" Data" Data" ,"FCCS_NoFCCS_NoFCCS_NoFCCS_No FCCS_NoIntercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", Intercompany", "No "No Product", Product", Product", Product", Product", Product", Product", "FCCS_LocalFCCS_LocalFCCS_LocalFCCS_Local FCCS_Local GAAP" GAAP" GAAP" )
10 ."FCCS_Mvmts_NetIncomeFCCS_Mvmts_NetIncome FCCS_Mvmts_NetIncome FCCS_Mvmts_NetIncomeFCCS_Mvmts_NetIncomeFCCS_Mvmts_NetIncome FCCS_Mvmts_NetIncomeFCCS_Mvmts_NetIncome FCCS_Mvmts_NetIncome " (
11 ."FCCS_OtherFCCS_OtherFCCS_OtherFCCS_Other FCCS_Other FCCS_Other Data" Data" Data" ="Warehouse_StockWarehouse_Stock Warehouse_Stock Warehouse_Stock Warehouse_Stock Warehouse_Stock " +"Showroom_Stock Showroom_StockShowroom_Stock Showroom_StockShowroom_Stock Showroom_StockShowroom_Stock ";
12 .)
13 .ENDFIX ENDFIX
14 .ENDFIX

移动成员 "FCCS_Mvmts_NetIncome" 用作锚点。移动维被视为位图维。它是帐户密集维之后的第一个稀疏维。包含单个移动维成员的计算应尽可能使用移动成员作为被称为锚点的成员块。

包含顶级成员/父成员作为源的计算

非扩展维应用程序源

1.       FIX ("Entity Currency", "FCCS_Entity Input")
2.      FIX("FCCS_Managed Data", "FCCS_Intercompany Top",
"Total Custom1", "Total Custom2")
3.      "FCCS_Mvmts_NetIncome"(
4.      IF(@ISLEV("Entity", 0))
5.      "Account 3" = "Account 1" + "Account 2";
6.      )
7.      ENDFIX
8.      ENDFIX

扩展维应用程序方案

1.       FIX ("Entity Currency", "FCCS_Entity Input")
2.      FIX("Account 3" ,"FCCS_Managed Data", "FCCS_No Intercompany", "No Custom1", "No Custom2")

3.      "FCCS_Mvmts_NetIncome"(
4.      IF(@ISLEV("Entity", 0))
5.      "FCCS_Intercompany Top"->"Total Custom1"-
>"Total Custom2"->"Account 1" + "FCCS_Intercompany Top"-
>"Total Custom1"->"Total Custom2"->"Account 2"; 6.     )
7.      ENDFIX
8.      ENDFIX
  1. 顶级成员是动态计算,无法用于 FIX 表达式,因此在计算的右侧使用它们并将结果重定向到 "No <member>"。

  2. 存储计算结果的单个密集维成员将放置在 FIX 中。

扩展维度应用程序中的计算最佳做法

  • 仅当右侧计算不涉及顶级成员/父成员时,才使用自下而上处理。

  • 在密集维上使用 @Remove 删除密集成员,而不是使用 @ISMBR 检查。

  • 使用布尔 @ISLEV,而不是 @LEV 和 @CURRMBR。

  • 从 FIX 中删除受限制的成员。

  • 如果锚点方法不适用,则使用“复制”创建目标块。

  • 应仅在一个目标自定义维成员上执行计算。

  • 使用 @LIKE 将脚本设置为常规。

  • 检查边缘用例。

  • 首先检查常见用例。

  • 计算写入单个移动维成员时,使用移动成员作为被称为锚点的成员块。

  • 计算写入其中帐户是密集维的单个帐户维成员时,将帐户成员移至 FIX。在其中期间和移动是密集成员的应用程序中,将帐户成员移至计算的左侧。

扩展维度应用程序使用混合聚合模式。Calculation Manager 提供了 SET HYBRIDBSOINCALCSCRIPT 构造,它控制当存储的成员依赖于动态成员时,应用程序中的多维数据集是否在计算脚本中使用混合聚合模式。

有关扩展维度应用程序中支持的 Essbase 函数列表,请参阅《Oracle Essbase Technical Reference》中的 "Functions Supported in Hybrid Aggregation Mode"。

客户 A 用例

在此用例中,原始计算包括以下问题:

  • 手动现金流计算

  • 与没有计算相比,在插入点插入现金流计算时性能会较慢。一个实体需要两分钟来合并,而没有计算时只需 40 秒。

  • 根据法定惯例,计算无法使用植入的现金流。

原始计算

1.       FIX("Entity Currency", "FCCS_Entity Input")
2.      /* Account CA3_010 - CET1 Capital ratio */
3.      /* Account CA3_020 - Surplus(+)/Deficit(-) of CET1 capital */
4.      FIX ("FCCS_No Movement", "No Custom2", "No Custom3", "No Custom4", "FCCS_Data Input", "FCCS_No Intercompany")
5.      "Submitted" (
6.      "CA3_010" = ("FCCS_Mvmts_Subtotal"->"Total Custom1"->"Total Custom2"->"Total Custom3"-> "FCCS_Intercompany Top"->"FCCS_Total Data Source"->"FCCS_YTD"->"CA1_020" / "FCCS_Intercompany      Top"->"FCCS_Total Data Source"->"FCCS_YTD"-> "CA2_010") - @Prior("CA3_010"->"FCCS_YTD");

7.      "CA3_020" = ("FCCS_Mvmts_Subtotal"->"Total Custom1"->"Total Custom2"->"Total Custom3"-> "FCCS_Intercompany Top"->"FCCS_Total Data Source"->"FCCS_YTD"->"CA1_020" - ("FCCS_Intercompany Top"->"FCCS_Total Data Source"->"FCCS_YTD"->
"CA2_010" * 0.045)) - @Prior("CA3_020"->"FCCS_YTD");
8.      ENDFIX
9.      ENDFIX

由于以下原因,计算性能不好:

  1. 右侧计算基本上是对 Essbase 的查询,因为各个维的大多数父成员都是动态计算。

  2. 在以上用例中,会启动两个并发查询,并且仅当提取结果时才会启动实际计算,这会导致公式高速缓存较慢。

  3. 上述脚本在合并过程中针对每个实体执行,而不管实体处于哪个级别。

修订的计算

以下示例显示修订的计算。

1.       SET HYBRIDBSOINCALCSCRIPT NONE; /*Turn OFF HYBRID BSO Mode */
2.      FIX("Entity Currency", "FCCS_Entity Input")
3.      /* Account CA3_010 - CET1 Capital ratio */
4.      /* Account CA3_020 - Surplus(+)/Deficit(-) of CET1 capital */
5.      /* First perform the natural aggregation in BOTTOMUP mode */
6.      FIX (@RELATIVE("Total Custom1", 0), @RELATIVE("Total Custom2", 0), @RELATIVE("Total Custom3", 0), "No Custom4",
@RELATIVE("FCCS_Total Data Source", 0), @RELATIVE("FCCS_Intercompany Top", 0))
7.      "FCCS_Mvmts_Subtotal"(@CALCMODE(BOTTOMUP);
8.      IF (@ISLEV("ENTITY", 0))
9.      "FCCS_No Movement"->"FCCS_No Intercompany"->"FCCS_Data Input"->"Submitted"->"CA3_010" = "FCCS_No Movement"->
"FCCS_No Intercompany"->"FCCS_Data Input"->"Submitted"->"CA3_010" + ("FCCS_YTD"->"CA1_020"/"FCCS_YTD"->"CA2_010");

10.     "FCCS_No Movement"->"FCCS_No Intercompany"->"FCCS_Data Input"->"Submitted"->"CA3_020" = "FCCS_No Movement"->
"FCCS_No Intercompany"->"FCCS_Data Input"->"Submitted"->"CA3_020" +
("FCCS_YTD"->"CA1_020" - ("FCCS_YTD"->"CA2_010" * 0.045));
11.     ENDIF;
12.     )
13.     ENDFIX
14.     /* Now leverage usage of @SHIFMINUS instead of subtraction and @PRIOR */
15.     FIX ("No Custom2", "No Custom3", "No Custom4", "FCCS_Data Input", "FCCS_No Intercompany", "Submitted", "CA3_010")
16.     "FCCS_No Movement"(@CALCMODE(BOTTOMUP);
17.     IF (@ISLEV("ENTITY", 0))
18.     @SHIFTMINUS("CA3_010", "FCCS_YTD"->"CA3_010", -1);
19.     ENDIF;
20.     )
21.     ENDFIX
22.     FIX ("No Custom2", "No Custom3", "No Custom4", "FCCS_Data Input", "FCCS_No Intercompany", "Submitted", "CA3_020")
23.     "FCCS_No Movement"(@CALCMODE(BOTTOMUP);
24.     IF (@ISLEV("ENTITY", 0))
25.     @SHIFTMINUS("CA3_020", "FCCS_YTD"->"CA3_020", -1);
26.     ENDIF;
27.     )
28.     ENDFIX
29.     ENDFIX

脚本改进

  • 每个查询计算分离为单独的 FIX,目标密集成员移动到 FIX

  • 合并期间,脚本仅在零级实体上执行

  • 移动成员用作锚点

  • 每个实体的性能从 2 分钟提高到 30 秒

将帐户作为稀疏维并将期间和移动作为密集维的扩展维度应用程序

本节概述适用于将帐户用作稀疏维的扩展维度应用程序的脚本编写技术。当选择创建应用程序或者将现有应用程序转换为将期间和移动作为密集维并将帐户作为稀疏维的应用程序时,请记住以下几点:

  1. 期间和移动是密集维。

  2. 帐户维稀疏。

  3. 植入的父代移动维成员是动态计算。

  4. 公司内维的父代成员是动态计算。

  5. 所有自定义维的父代成员必须是动态计算。

  6. 这是为了具有最小的高级别块计数,并在电子表格操作过程中实现动态聚合。

  7. 在编写自定义计算时,如果父代成员已用于现有计算,那么除了需要重写现有计算,上述第 2 点和第 3 点也很关键。


密集维和稀疏维的示例

客户 A 用例

根据 FCCS_Managed Data 的源数据计算数据源成员 IC_Inventory_Alloc

优化前


客户 A 用例

客户 A - 原始计算脚本

  • a.自上而下 (TOPDOWN) 运行

  • b.使用右侧的动态计算顶级成员,这会导致检索数据变得特别慢

  • c.计算会使用同一交叉点不必要地相乘和相除


客户 A 用例详细信息

客户 A 用例 - 修改后的计算脚本

修改后的计算脚本使用连加技术和 BOTTOMUP 处理。

  • a.计算在 BSO 模式下运行 - SET HYBRIDBSOINCALCSCRIPT NONE

  • b. 使用 @CREATEBLOCK 基于源 FCCS_Managed Data 块自下而上 (BOTTOMUP) 来创建目标 IC_Inventory_Alloc 块

  • c.不是使用动态计算顶级成员,而是使用右侧的已存储成员


客户 A 用例修改后的脚本

客户 B 用例

在迁移到“帐户为稀疏”模型后,必须重新编写盈余帐户计算。移动维中植入父代成员的“数据存储”属性为动态计算。这会带来一些难题,因为合并用时会受到影响。在迁移后必须停止计算。

采用最佳做法后的全年用时:


客户 B 用例用时结果

客户 B 用例 - 原始计算

在原始 FCCS_20 计算中:

  • a.移动维成员用作锚点。移动成员 "FCCS_Mvmts_Total" 是动态计算,无法用作锚点。

  • b.帐户维稀疏,因此右侧的顶级成员 "FCCS_Total Liabilities and Equity" 和 "FCCS_Total Assets" 会导致计算时间较长。


客户 B 用例原始脚本

稀疏用例示例 5

客户 B 用例 - 修改后的计算

此示例显示修改后的 FCCS_20 计算。

  • a.合并成员用作锚点。

  • b.在零级成员 "FCCS_Total Liabilities and Equity" 和 "FCCS_Total Assets" 上连加技术与 FIX 结合使用,首先将所有负债和权益相加,然后减去所有资产


客户 B 用例 - 修改后的计算