Hypothèses MDX inattendues et gestion des erreurs pour les sous-ensembles dans TM1/Planning Analytics

J’ai récemment rencontré un bogue dans une application TM1 qui était très difficile à détecter, et c’était parce que je ne comprenais pas les différentes manières dont TM1 pouvait répondre à des expressions MDX vagues ou incorrectes. MDX fait des hypothèses inattendues.
Prenons l’exemple de cube simplifié suivant :
Supposons que j’ai un rapport de formulaire actif et que je souhaite filtrer les clients dont les ventes nettes sont supérieures ou égales à 600 $, sur toutes les gammes de produits.
Si je crée un sous-ensemble client de :
{ FILTER ( {TM1SUBSETALL( [Customer] )} , ( Sales.( [Product].[All Products], [m_Measures].[Net] )>= 600 ) ) }
il renvoie correctement :
GM Tesla
Le processus TI avait une faute de frappe qui générait l’équivalent de :
{ FILTER ( {TM1SUBSETALL( [Customer] )} , ( Sales.( [Product].[All Products], [m_Measures].[Nt] )>= 600 ) ) }
Alors quel sera le résultat ? J’aurais deviné que cela générerait une erreur d’exécution ou produirait un sous-ensemble vide. Au lieu de cela, il renvoie :
Nissan Rivian
Quoi?!
Parce que l’interpréteur ne reconnaît pas le nom de l’élément, il va au premier élément de la dimension ! Cela semblait vraiment fou et incohérent, mais plus tard, un collègue qui était nouveau sur TM1 a écrit une expression comme celle-ci :
{ FILTER ( {TM1SUBSETALL( [Customer] )} , ( Sales.( [m_Measures].[Net] )>= 600 ) ) }
Nous ne l’avons pas remarqué pendant un moment car l’expression fonctionnait bien, même si toutes les dimensions n’étaient pas définies. Pourquoi ça marchait ? C’était la même hypothèse au travail que le problème ci-dessus. Lorsqu’un élément de dimension n’était pas défini pour la requête, TM1 se contentait par défaut du premier élément de la dimension. Cette hypothèse est probablement fausse, mais peut être suffisamment proche pour que vous n’attrapiez pas l’erreur jusqu’à ce qu’elle vous embarrasse en production.
Il y a quelques nuances à ce comportement. Dans « [m_Measures].[Nt] », le système sait quelle dimension j’appelle, il peut donc décider sur quelle dimension faire une supposition. Si je ne spécifie pas les dimensions, cette syntaxe fonctionnera correctement (si les noms d’éléments ne sont pas ambigus) :
{ FILTER ( {TM1SUBSETALL( [Customer] )} , ( Sales.( [All Products], [Net] )>= 600 ) ) }
Mais ça:
{ FILTER ( {TM1SUBSETALL( [Customer] )} , ( Sales.( [All Products], [Nt] )>= 600 ) ) }
va enfin lancer une erreur !
Pour traiter ce problème précis, il peut sembler préférable de ne pas déclarer les dimensions dans la spécification de la requête, mais dans un grand modèle qui causera d’autres problèmes. La syntaxe sans dimension ne fonctionne que si l’élément que vous appelez est unique dans toutes les dimensions de cette instance TM1. Même si cela fonctionne lorsque vous le créez pour la première fois, il peut se casser si quelqu’un crée une dimension similaire plus tard, même s’il se trouve dans un cube totalement indépendant.
Alors, qu’est-ce que tu penses? Avez-vous vu d’autres exemples de cela? Je n’ai aucune expérience MDX en dehors de TM1, mais bien sûr, il est largement utilisé ailleurs. Ce comportement MDX est-il normal dans d’autres systèmes ? Faites-moi savoir dans les commentaires.
Source link