Dans les scripts de calcul Oracle Essbase, l'instruction if
permet d'exécuter le code si une condition est vraie, tandis que les instructions else
et else if
permettent d'indiquer chaque nouvelle condition à tester si la condition évaluée précédemment est fausse.
Vous pouvez optimiser le code qui utilise les instructions if
et else if
en analysant la condition à laquelle répondent la plupart de vos données et en déplaçant ensuite l'évaluation de cette condition au début du code afin de l'exécuter le plus tôt possible.
Prenons le script de calcul suivant comme exemple pour Sample.Basic, où les dimensions de compte et de temps sont des dimensions denses :
SET UPDATECALC OFF; "SalesYTD"( IF(@ismbr("Jan")) SalesYTD" = "Sales"; Else "SalesYTD"="Sales" + @prior("SalesYTD"); Endif )
Dans ce cas, plus de 90 % des données satisfont le critère de la condition else
. Seulement 10 % des données environ satisfont le critère de la condition if
. En raison de la fonction @prior
dans la condition else
, le mois de janvier doit être calculé avant tous les autres mois. Lors de l'exécution de ce calcul, le temps total écoulé est indiqué comme suit :
Total Calc Elapsed Time for [IF.csc] : [0.203] seconds
Dans ce calcul, le membre SalesYTD est calculé en mode cellule, ce qui signifie que janvier est calculé en premier quel que soit l'ordre des instructions conditionnelles if
car il apparaît avant les autres mois dans l'outline.
Vous pouvez optimiser ce type de script en réorganisant les instructions et en ajoutant l'opérateur NOT
à la première condition, comme illustré dans l'exemple suivant :
SET UPDATECALC OFF; "SalesYTD"( IF(NOT(@ismbr("Jan"))) "SalesYTD" = "Sales" + @prior("SalesYTD"); Else "SalesYTD"="Sales"; Endif )
Ici, le calcul dure moins d'un quart du temps nécessaire au calcul de l'exemple précédent car plus de 90 % des données satisfont le critère de l'instruction if
.
Note:
Dans cet exemple, il est impératif de calculer la formule dans l'ordre de l'outline (février doit être calculé après janvier, mars après février, etc.) pour obtenir des résultats corrects. Vous pouvez utiliser@calcmode(Cell)
pour forcer l'ordre s'il n'est pas automatiquement respecté.