Mejores prácticas para cálculos en aplicaciones de dimensionalidad ampliada

Aplicaciones de dimensionalidad ampliada con la dimensión de cuenta como la dimensión densa

Si utiliza una aplicación de dimensionalidad ampliada con la dimensión de cuenta como la dimensión densa, puede utilizar estas técnicas de creación de scripts. Tenga en cuenta los siguientes puntos relativos a estas aplicaciones:

  1. Orden de las dimensiones: la dimensión de movimiento es la primera dimensión ligera del orden de dimensiones y se conoce como dimensión de mapa de bits.

  2. Los miembros padre de la dimensión intercompañía son de cálculo dinámico.

  3. Todas las dimensiones personalizadas deben tener sus miembros padre definidos en Cálculo dinámico.

  4. La idea es tener un recuento mínimo de bloques de nivel superior y obtener agregaciones dinámicas durante las operaciones de hoja de cálculo.

  5. Los puntos 2 y 3 anteriores tienen un rol significativo mientras se escriben cálculos personalizados, además de la necesidad de reescribir los cálculos existentes, si se utilizan miembros superiores/padre en los cálculos existentes.


Account y Movement de dimensiones ampliadas

SET HYBRIDBSOINCALCSCRIPT FULL / NONE

Se necesita HYBRIDBSOINCALCSCRIPT cuando el lado derecho de la expresión tiene miembros superiores, por ejemplo:

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

En este caso, debe desactivar HYBRIDBSOINCALCSCRIPT para la línea incorrecta y, a continuación, volver a activar ese valor tras la ejecución de la línea incorrecta, por ejemplo:

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

Recuerde, si es necesario, esto solo se debe llevar a cabo con reglas de cálculo configurables (punto de inserción).

SET HYBRIDBSOINCALCSCRIPT FULL / NONE

En ocasiones, cuando solo hay un miembro superior en el lado derecho, HYBRIDBSOINCALCSCRIPT ralentiza la expresión, por ejemplo:

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

En este caso, debe desactivar HYBRIDBSOINCALCSCRIPT para la línea incorrecta y, a continuación, volver a activar ese valor tras la ejecución de la línea incorrecta, por ejemplo:

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

Recuerde, si es necesario, esto solo se debe llevar a cabo con reglas de cálculo configurables (punto de inserción).

Técnica de suma sucesiva

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

En este ejemplo, la intención es almacenar el resultado del cálculo dinámico del lado derecho en un miembro denso almacenado. Este cálculo no se realiza si se ejecuta con SET HYBRIDBSOINCALCSCRIPT FULL. En estas situaciones, según los operadores de consolidación de los miembros de nivel cero de la dimensión personalizada definidos como Suma, podrá utilizar una técnica denominada suma sucesiva. Debido a que la dimensión de cuenta es ligera, debe utilizar FIX en miembros de nivel cero bajo la cuenta de origen de cálculo dinámico. Además, recuerde que debe desactivar el modo híbrido.

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

Tenga en cuenta el siguiente caso en el que algunos miembros Custom1 de nivel cero tienen el operador de consolidación definido como se describe a continuación: los miembros Custom1_A y Custom1_B tienen el operador de consolidación definido como Restar.


Ejemplo 3 de suma sucesiva

Consideración importante al utilizar esta técnica: cuando se ejecuta la regla de negocio varias veces, es muy probable que la cuenta de destino tenga un valor acumulado. Esto da lugar a números incorrectos. Por tanto, considere la posibilidad de inicializar el valor objetivo en #Missing, en un proceso BOTTOMUP, dado que el script se habría ejecutado al menos una vez.


Ejemplo 4 de suma sucesiva

Evite las construcciones siguientes:

  1. CALC DIM, CALC ALL, AGG y cualquier otra expresión sin asignación que calcule un subárbol. Las mejores prácticas consisten en limitar el uso de CALC DIM y AGG a las dimensiones en las que ninguno de los miembros almacenados depende de los miembros dinámicos.

  2. No utilice CREATENONMISSINGBLOCK ni CREATEBLOCKONEQ en los scripts de cálculo.

  3. Evite utilizar estas funciones dentro de los puntos de inserción:

    • @ALLOCATE

    • @CREATEBLOCK

    • @IRREX

    • @MDALLOCATE

    • @MDSHIFT

    • @MOVSUMX

    • @PTD

    • @SANCESTVAL

    • @STDEV

    • @STDEVP

    • @STDEVRANGE

    • @SYD

    • @TREND

Uso de un bloque de miembros ligeros y de BOTTOMUP

Escenario de aplicaciones de dimensiones no ampliadas

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

Escenario de aplicaciones de dimensiones ampliadas

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

El miembro de Movement "FCCS_Mvmts_NetIncome" se utiliza como un anclaje. La dimensión Movement está considerada una dimensión de mapa de bits. Es la primera dimensión ligera después de la dimensión densa Cuenta. Siempre que sea posible, los cálculos que implican el uso de un miembro individual de la dimensión Movement deben utilizar el miembro Movement como un bloque de miembros (conocido como un anclaje).

Cálculo que implica el uso de miembros superiores/padre como origen

Origen de aplicaciones de dimensiones no ampliadas

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

Escenario de aplicaciones de dimensiones ampliadas

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. Los miembros padre son de cálculo dinámico y no se pueden utilizar en expresiones FIX, por lo que se deben utilizar en la parte derecha del cálculo y redireccionar el resultado a "No <member>".

  2. Se colocará en FIX un miembro individual de dimensión ligera que almacene el resultado del cálculo.

Mejores prácticas para cálculos en aplicaciones de dimensionalidad ampliada

  • Utilice el procesamiento BottomUp solo cuando el cálculo de la parte derecha no implique miembros superiores/padre.

  • Utilice @Remove para eliminar el miembro denso en lugar de utilizar la comprobación @ISMBR en la dimensión densa.

  • Utilice @ISLEV booleano en lugar de @LEV y @CURRMBR.

  • Elimine los miembros restringidos de FIX.

  • Utilice Copiar para crear los bloques de destino si no funciona el enfoque de anclaje.

  • Los cálculos solo se deben realizar en un miembro de la dimensión Custom de destino.

  • Utilice @LIKE para crear el script genérico.

  • Compruebe los casos de posición.

  • Compruebe primero los casos comunes

  • Si se escriben los cálculos en un miembro individual de la dimensión Movement, utilice el miembro de Movement como un bloque de miembros, lo que se denomina anclaje.

  • Si se escriben los cálculos en un miembro individual de la dimensión de cuentas, donde Cuenta es la dimensión densa, mueva el miembro de Cuenta a FIX. En una aplicación en la que Periodo y Movimiento son los miembros densos, mueva el miembro de Cuenta al lado izquierdo del cálculo.

En las aplicaciones de dimensiones ampliadas se usa un modo de agregación híbrido. El constructor SET HYBRIDBSOINCALCSCRIPT está disponible como parte de Calculation Manager y controla si los cubos de la aplicación usan el modo de agregación híbrido en los scripts de cálculo cuando los miembros almacenados dependen de los miembros dinámicos.

Para conocer una lista de funciones de Essbase soportadas en las aplicaciones de dimensiones ampliadas, consulte la sección sobre funciones soportadas en el modo de agregación híbrido de la Oracle Essbase Technical Reference (sólo disponible en inglés).

Caso de uso del cliente A

En este caso de uso, los cálculos originales incluían estos problemas:

  • Cálculos manuales de flujo de caja

  • El rendimiento era bajo cuando se insertaban cálculos de flujo de caja en los puntos de inserción frente a sin cálculos. Una entidad tardó dos minutos en consolidarse frente a 40 segundos sin el cálculo.

  • El cálculo no pudo utilizar el flujo de caja predefinido debido a sus prácticas estatutarias.

Cálculos originales

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

El cálculo no se realiza correctamente debido a los siguientes motivos:

  1. Los cálculos de la parte derecha son básicamente consultas a Essbase, porque la mayoría de los miembros padre de las dimensiones correspondientes son de cálculo dinámico.

  2. En el caso anterior, se inician dos consultas simultáneas y solo se iniciará el cálculo cuando se recuperen los resultados, lo que puede tener como resultado una caché de fórmula lenta.

  3. El script anterior se ejecuta para todas las entidades, durante una consolidación, independientemente del nivel de la entidad.

Cálculo revisado

El ejemplo siguiente muestra un cálculo revisado.

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

Mejoras del script

  • Cada cálculo de consulta se segrega como un FIX distinto, mientras que el miembro denso de destino se mueve a FIX

  • El script solo se ejecuta en la entidad de nivel cero, durante una consolidación

  • El miembro de movimiento se usa como anclaje

  • El rendimiento se ha mejorado, pasando de dos minutos a 30 segundos por entidad

Aplicaciones de dimensionalidad ampliada con la dimensión de cuenta como dimensión ligera, y las dimensiones de período y movimiento como dimensiones densas

En esta sección se describen las técnicas de creación de scripts para aplicaciones de dimensionalidad ampliada que utilizan la dimensión de cuenta como dimensión ligera. Al seleccionar que se cree una aplicación o que se convierta una existente en una con las dimensiones de período y movimiento como dimensiones densas y la dimensión de cuenta como dimensión ligera, tenga en cuenta los siguientes puntos:

  1. Las dimensiones de período y movimiento son densas.

  2. La dimensión de cuenta es ligera.

  3. Los miembros padre de la dimensión de movimiento predefinidos son de cálculo dinámico.

  4. Los miembros padre de la dimensión de intercompañía son de cálculo dinámico.

  5. Todos los miembros padre de la dimensión personalizada deben ser de cálculo dinámico.

  6. La idea es tener un recuento mínimo de bloques de nivel superior y obtener agregaciones dinámicas durante las operaciones de hoja de cálculo.

  7. Los puntos 2 y 3 tienen un rol significativo mientras se escriben cálculos personalizados, además de la necesidad de reescribir los cálculos existentes, si se utilizan miembros padre en los cálculos existentes.


Ejemplo de dimensiones densas y ligeras

Caso de uso del cliente A

Cálculo del miembro de origen de datos IC_Inventario_Asignación, basado en el origen de datos en FCCS_Datos gestionados

Antes de la optimización


Caso de uso del cliente A

Cliente A: script de cálculo original

  • a. Ejecuta TOPDOWN

  • b. Utiliza los miembros superiores de cálculo dinámico de la derecha, lo cual causa demora en la recuperación de los datos

  • c. El cálculo multiplica y divide innecesariamente utilizando la misma intersección


Detalles del caso de uso del cliente A

Caso de uso del cliente A: script de cálculo modificado

El script de cálculo modificado utiliza la técnica de suma sucesiva y el procesamiento BOTTOMUP.

  • a. El cálculo se ejecuta en el modo BSO: SET HYBRIDBSOINCALCSCRIPT NONE

  • b. @CREATEBLOCK se utiliza para crear bloques de IC_Inventario_Asignación de destino según los bloques de FCCS_Datos gestionados de origen, BOTTOMUP

  • c. En lugar de los miembros superiores del cálculo dinámico, se utilizan los miembros almacenados del lado derecho


Script modificado en el caso de uso del cliente A

Caso de uso del cliente B

Ha sido necesario reescribir el cálculo de esta cuenta Excedente tras la migración a la dimensión de cuenta como modelo ligero. La propiedad de almacenamiento de datos de los miembros padre predefinidos en la dimensión de movimiento es de cálculo dinámico. Esto ha presentado algunos desafíos ya que se han visto comprometidos los tiempos de consolidación. El cálculo debía detenerse después de la migración.

Tiempos del año completo después de adoptar las mejores prácticas.


Resultados de tiempos del caso de uso del cliente B

Caso de uso del cliente B: cálculo original

En el cálculo original FCCS_20:

  • a. Los miembros de la dimensión de movimiento se han utilizado como anclaje. El miembro de movimiento "FCCS_Mvmts_Total" es de cálculo dinámico y no se ha podido utilizar como anclaje.

  • b. La dimensión de cuenta es ligera, por lo tanto, los miembros superiores "FCCS_Pasivos totales y patrimonio" y "FCCS_Activos totales" del lado derecho han dado como resultado tiempos de cálculo más largos.


Script original del caso de uso del cliente B

Ejemplo 5 de caso de uso ligero

Caso de uso del cliente B: cálculo modificado

En este ejemplo se muestra el cálculo FCCS_20 modificado.

  • a. El miembro de Consolidation se usa como anclaje

  • b. La técnica de suma sucesiva se usa con FIX en miembros de nivel cero de "FCCS_Pasivos totales y patrimonio" y "FCCS_Activos totales", sumando en primer lugar todos los pasivos y valores de renta variable, y restando a continuación todos los activos


Caso de uso del cliente B: cálculo modificado