擴展維度應用程式中的計算之最佳作法

將科目用作密集維度的擴展維度應用程式

如果您使用將科目用作密集維度的擴展維度應用程式,就可以使用這些指令碼編寫技巧。請注意,下列幾點與這些應用程式相關:

  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 執行此計算。在這些情況下,根據自訂維度之層級 0 成員的整合運算子設為「加」,您可以使用稱為連加的技巧。因為科目是稀疏維度,因此您可以對動態計算來源科目下的層級 0 成員套用 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

在下列案例中,有幾個層級 0 的 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 表示式,因此,請在計算右側使用它們,並將結果重新導向至「無 <member>」。

  2. 儲存計算結果的單一密集維度成員將放置在 FIX 中。

擴展維度應用程式中的計算之最佳作法

  • 唯有當右手邊的計算不涉及上層/父成員時,才使用 BottomUp 處理。

  • 使用 @Remove 移除密集成員,而不對密集維度使用 @ISMBR 檢查。

  • 使用 Boolean @ISLEV 而非 @LEV 和 @CURRMBR。

  • 從 FIX 移除限制成員。

  • 如果錨點法無效,則使用「複製」來建立目標區塊。

  • 只能對一個目標自訂維度成員執行計算。

  • 使用 @LIKE 使指令碼成為通用的。

  • 檢查邊緣案例。

  • 先檢查一般案例。

  • 當計算寫入至單一變動維度成員時,請使用變動成員作為成員區塊 (即所謂的錨點)。

  • 當計算式寫入至單一「科目維度」成員而「科且」科目是「密集」維度時,請將科目成員移至 FIX。在「期間」和「變動」是「密集」成員的應用程式中,將「科目」成員移至計算式的左側。

「擴展維度」應用程式使用混合聚總模式。SET HYBRIDBSOINCALCSCRIPT 是 Calculation Manager 隨附的建構,可在已儲存的成員倚賴動態成員時,控制應用程式中的立方體是否要在計算指令碼中使用混合聚總模式。

如需「擴展維度」應用程式中所支援的 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

  • 在整合期間,只會對層級 0 實體執行指令碼

  • 變動成員用作錨點

  • 每個實體的效能都從 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 區塊建立目標 IC_Inventory_Alloc 區塊,BOTTOMUP

  • 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.連加技巧可搭配對層級 0 的成員 "FCCS_Total Liabilities and Equity" 和 "FCCS_Total Assets" 套用 FIX 使用,首先加上所有負債與權益,然後減去所有資產


客戶 B 使用案例 - 修改後的計算