Meilleures pratiques de calculs dans les applications de dimensionnalité étendue

Applications de dimensionnalité étendue avec la dimension Compte en tant que dimension dense

Si vous utilisez une application de dimensionnalité étendue avec la dimension Compte en tant que dimension dense, vous pouvez recourir aux techniques de script suivantes. Tenez compte des points suivants concernant ces applications :

  1. Ordre des dimensions : la dimension Mouvement est la première dimension dispersée de la liste des dimensions. Elle est appelée dimension bitmap.

  2. Les membres parent de la dimension Intragroupe sont de type Calcul dynamique.

  3. Les membres parent de toutes les dimensions libres doivent être définis sur Calcul dynamique.

  4. L'idée est de disposer d'un nombre minimal de blocs de niveau supérieur et de réaliser des agrégations dynamiques pendant les opérations de feuille de calcul.

  5. Outre la nécessité de réécrire des calculs existants, les points 2 et 3 ci-avant jouent un rôle important lors de l'écriture des calculs personnalisés si des membres supérieurs/parent sont utilisés dans des calculs existants.


Dimensions étendues Compte et Mouvement

SET HYBRIDBSOINCALCSCRIPT FULL/NONE

HYBRIDBSOINCALCSCRIPT est requis lorsque le côté droit de l'expression comporte des membres supérieurs, par exemple :

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

Dans ce cas, vous devez désactiver HYBRIDBSOINCALCSCRIPT pour la ligne incriminée, puis le réactiver après l'exécution de cette ligne, par exemple :

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

N'oubliez pas que, si elle est requise, cette opération est à effectuer uniquement pour les règles de calcul configurable (point d'insertion).

SET HYBRIDBSOINCALCSCRIPT FULL/NONE

Parfois, lorsqu'un seul membre supérieur est présent du côté droit, HYBRIDBSOINCALCSCRIPT ralentit l'expression, par exemple :

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

Dans ce cas, vous devez désactiver HYBRIDBSOINCALCSCRIPT pour la ligne incriminée, puis le réactiver après l'exécution de cette ligne, par exemple :

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

N'oubliez pas que, si elle est requise, cette opération est à effectuer uniquement pour les règles de calcul configurable (point d'insertion).

Technique de l'addition successive

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

Dans cet exemple, notre intention est de stocker le résultat du calcul dynamique du côté droit, dans un membre dense stocké. Ce calcul n'est pas effectué en cas d'exécution avec SET HYBRIDBSOINCALCSCRIPT FULL. Dans ces situations, étant donné que les opérateurs de consolidation des membres de niveau zéro de la dimension libre sont définis sur Addition, vous pouvez utiliser la technique connue sous le nom d'addition successive. La dimension Compte étant dispersée, vous appliquez FIX sur les membres de niveau zéro sous le compte source de calcul dynamique. Par ailleurs, n'oubliez pas de désactiver le mode hybride.

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

Penchez-vous sur le cas suivant, dans lequel l'opérateur de consolidation de quelques membres Custom1 de niveau zéro est défini comme suit : pour les membres Custom1_A et Custom1_B, l'opérateur de consolidation est défini sur Soustraire.


Exemple d'addition successive 3

Remarque importante relative à l'utilisation de cette technique : lorsque la règle métier est exécutée plusieurs fois, il est possible que le compte cible comporte une valeur cumulée. Cela entraîne des chiffres incorrects. Par conséquent, envisagez d'initialiser la valeur cible sur #Missing dans un processus BOTTOMUP, car le script aura été exécuté au moins une fois.


Exemple d'addition successive 4

Evitez les constructions suivantes :

  1. CALC DIM, CALC ALL, AGG et toute autre expression sans affectation calculant une sous-arborescence. Il est recommandé de limiter l'utilisation de CALC DIM et d'AGG aux dimensions où aucun membre stocké ne dépend de membres dynamiques.

  2. N'utilisez ni CREATENONMISSINGBLOCK ni CREATEBLOCKONEQ dans les scripts de calcul.

  3. Evitez d'utiliser les fonctions suivantes dans les points d'insertion :

    • @ALLOCATE

    • @CREATEBLOCK

    • @IRREX

    • @MDALLOCATE

    • @MDSHIFT

    • @MOVSUMX

    • @PTD

    • @SANCESTVAL

    • @STDEV

    • @STDEVP

    • @STDEVRANGE

    • @SYD

    • @TREND

Utilisation d'un bloc de membres dispersés et de BOTTOMUP

Scénario d'application de dimension non étendue

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

Scénario d'application de dimension étendue

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

Le membre Mouvement "FCCS_Mvmts_NetIncome" est utilisé en tant qu'ancrage. La dimension Mouvement est considérée comme une dimension bitmap. Il s'agit de la première dimension dispersée après la dimension dense Compte. Dans la mesure du possible, les calculs impliquant un membre de dimension Mouvement unique doivent utiliser ce membre en tant que bloc de membres (également appelé ancrage).

Calcul impliquant des membres supérieurs/parent en tant que source

Source d'application de dimension non étendue

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

Scénario d'application de dimension étendue

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. Les membres supérieurs sont de type Calcul dynamique et ne peuvent pas être employés dans des expressions FIX. Par conséquent, utilisez-les dans la partie droite du calcul et redirigez les résultats vers "No <membre>".

  2. Un membre de dimension dense unique stockant le résultat du calcul doit être placé dans FIX.

Meilleures pratiques de calculs dans les applications de dimensionnalité étendue

  • Utilisez le traitement de bas en haut uniquement si la partie droite du calcul n'implique pas de membres supérieurs/parent.

  • Plutôt que d'utiliser la vérification @ISMBR sur la dimension dense, utilisez @Remove pour enlever le membre dense.

  • Utilisez la fonction booléenne @ISLEV au lieu de @LEV et @CURRMBR.

  • Enlevez les membres restreints de l'instruction FIX.

  • Utilisez l'option Copier pour créer le bloc cible si l'approche d'ancrage ne fonctionne pas.

  • Le calcul ne doit être effectué que pour un membre de dimension libre cible.

  • Utilisez @LIKE pour rendre le script générique.

  • Recherchez les exceptions.

  • Recherchez d'abord les cas courants.

  • Si les calculs écrivent dans un membre de dimension Mouvement unique, utilisez ce dernier en tant que bloc de membres, également appelé ancrage.

  • Si les calculs écrivent dans un membre de dimension Compte unique, où le compte est la dimension Dense, déplacez le compte vers l'instruction FIX. Dans une application où Période et Mouvement sont les membres denses, déplacez le membre Compte vers la partie gauche du calcul.

Les applications de dimension étendue utilisent un mode d'agrégation hybride. La construction SET HYBRIDBSOINCALCSCRIPT est disponible dans Calculation Manager. Elle vérifie si les cubes de l'application utilisent un mode d'agrégation hybride dans les scripts de calcul lorsque les membres stockés dépendent de membres dynamiques.

Pour obtenir la liste des fonctions Essbase prises en charge dans les applications de dimension étendue, reportez-vous à la section Fonctions prises en charge dans le mode d'agrégation hybride dans le guide Référence technique d'Oracle Essbase.

Cas d'utilisation du client A

Dans ce cas d'utilisation, les calculs initiaux présentaient les problèmes suivants :

  • Calculs de flux de trésorerie manuels

  • Les performances étaient plus lentes en cas d'insertion des calculs de flux de trésorerie dans les points d'insertion que sans les calculs. La consolidation d'une entité prenait deux minutes, contre 40 secondes sans le calcul.

  • Le calcul ne pouvait pas utiliser le flux de trésorerie prédéfini en raison des pratiques légales en vigueur.

Calculs initiaux

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

Le calcul ne s'effectue pas correctement pour les raisons suivantes :

  1. La partie droite des calculs consiste essentiellement en des requêtes adressées à Essbase. En effet, la plupart des membres parent des dimensions respectives sont de type Calcul dynamique.

  2. Dans le cas ci-avant, deux requêtes simultanées sont lancées. Le calcul réel n'est exécuté qu'une fois les résultats extraits, d'où un cache de formule lent.

  3. Pendant une consolidation, le script ci-avant s'exécute pour chaque entité, quel qu'en soit le niveau.

Calcul révisé

L'exemple suivant illustre un calcul révisé.

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

Améliorations du script

  • Chaque calcul de requête est isolé en tant qu'instruction FIX distincte et le membre dense de destination est déplacé vers FIX

  • Le script s'exécute uniquement sur l'entité de niveau zéro pendant une consolidation

  • Le membre de mouvement est utilisé comme ancrage

  • Les performances ont été améliorées, passant de deux minutes à 30 secondes par entité

Applications de dimensionnalité étendue avec la dimension Compte en tant que dimension dispersée, et les dimensions Période et Mouvement en tant que dimensions denses

Cette section présente les techniques de script pour les applications de dimensionnalité étendue utilisant la dimension Compte en tant que dimension dispersée. Lorsque vous choisissez de créer une application utilisant les dimensions Période et Mouvement en tant que dimensions denses, et la dimension Compte en tant que dimension dispersée, ou de convertir une application existante en application de ce type, tenez compte des points suivants :

  1. Les dimensions Période et Mouvement sont des dimensions denses.

  2. La dimension Compte est une dimension dispersée.

  3. Les membres parent prédéfinis de la dimension Mouvement sont de type Calcul dynamique.

  4. Les membres parent de la dimension Intragroupe sont de type Calcul dynamique.

  5. Tous les membres parent des dimensions libres doivent être de type Calcul dynamique.

  6. L'idée est de disposer d'un nombre minimal de blocs de niveau supérieur et de réaliser des agrégations dynamiques pendant les opérations de feuille de calcul.

  7. Outre la nécessité de réécrire des calculs existants, les points 2 et 3 jouent un rôle important lors de l'écriture des calculs personnalisés si des membres parent sont utilisés dans des calculs existants.


Exemple de dimensions denses et dispersées

Cas d'utilisation du client A

Calcul du membre de source de données IC_Inventory_Alloc, en fonction des données source de FCCS_Managed Data

Avant optimisation


Cas d'utilisation du client A

Client A - Script de calcul d'origine

  • a. Exécute TOPDOWN

  • b. Utilise les membres supérieurs de calcul dynamique du côté droit, ce qui ralentit l'extraction des données

  • c. Le calcul effectue des multiplications et divisions superflues avec le même croisement


Détails du cas d'utilisation du client A

Cas d'utilisation du client A - Script de calcul modifié

Le script de calcul modifié utilise la technique de l'addition successive et le traitement BOTTOMUP.

  • a. Le calcul est exécuté en mode BSO - SET HYBRIDBSOINCALCSCRIPT NONE

  • b. @CREATEBLOCK permet de créer les blocs IC_Inventory_Alloc cible sur la base des blocs FCCS_Managed Data source, BOTTOMUP

  • c. A la place des membres supérieurs de calcul dynamique, les membres stockés sont utilisés du côté droit


Script modifié du cas d'utilisation du client A

Cas d'utilisation du client B

Ce calcul de compte d'excédent a dû être réécrit après la migration vers le modèle de dimension Compte dispersée. La propriété de stockage des données des membres parent prédéfinis de la dimension Mouvement est Calcul dynamique. Cela a posé des difficultés en raison de délais de consolidation compromis. Le calcul a dû être interrompu après la migration.

Délais sur une année complète après adoption des meilleures pratiques :


Résultats du cas d'utilisation du client A concernant les délais

Cas d'utilisation du client B - Calcul d'origine

Dans le calcul FCCS_20 d'origine :

  • a. Les membres de la dimension Mouvement ont été utilisés comme ancrage. Le membre Mouvement "FCCS_Mvmts_Total" est de type Calcul dynamique, et n'a pas pu être utilisé comme ancrage.

  • b. La dimension Compte étant dispersée, les membres supérieurs "FCCS_Total Liabilities and Equity" et "FCCS_Total Assets" du côté droit ont augmenté les durées de calcul.


Script d'origine du cas d'utilisation du client B

Exemple de cas d'utilisation

Cas d'utilisation du client B - Calcul modifié

Cet exemple présente le calcul FCCS_20 modifié.

  • a. Le membre de consolidation est utilisé comme ancrage.

  • b. La technique de l'addition successive est utilisée avec FIX sur les membres de niveau zéro de "FCCS_Total Liabilities and Equity" et de "FCCS_Total Assets", en commençant par ajouter l'intégralité du passif et des capitaux propres, puis en soustrayant tous les actifs.


Cas d'utilisation du client B - Calcul modifié