[SSAS] L’opérateur UNION manquant en DMX

Il vous est peut être arrivé de vouloir intégrer un Forecast généré avec Analysis Services Data Mining dans une application. C’est très joli à présenter, et ça l’est encore plus au sein d’un rapport Reporting Services.

Malheureusement, l’instruction PredictTimeSeries() qui gouverne la sortie d’un modèle de type TimeSeries ne permet que d’effectuer des sorties de données passées OU futures mais pas les deux mixées… Or l’ami Reporting Services ne supporte qu’un DataSet par DataRegion donc impossible de réaliser nativement une belle courbe avec le réel suivi du forecast…

Jamie Mc Lennan l’architecte du produit, propose sur son blog de réaliser une SP managée pour rempalcer PredictTimeSeries. Solution efficace et que j’ai déjà testé, mais qui masque à mon avis un problème de DMX, le manque d’opérateur UNION en n’adressant qu’une seule problématique induite.

En codant un petit bout de C# on arrive pourtant facilement à obtenir un pseudo opérateur union parfaitement fonctionnel, d’abord en écrivant une méthode d’exécution de code DMX renvoyée sous forme de DataTable:

private DataTable ExecuteQuery(string query)
{
using (AdomdCommand cmd = new AdomdCommand(query))
{
AdomdDataReader dr = cmd.ExecuteReader();
DataTable destinationDt = new DataTable();
DataTable schemaDt = dr.GetSchemaTable();
foreach (DataRow schemaDr in schemaDt.Rows)
{
destinationDt.Columns.Add((string)schemaDr["ColumnName"], (Type)schemaDr["DataType"]);
}

DataRow currentDr = null;
while (dr.Read())
{
currentDr = destinationDt.NewRow();
for (int i = 0; i < dr.FieldCount; i++)
{
currentDr[i] = dr[i];
}
destinationDt.Rows.Add(currentDr);
}
}
return destinationDt;
}

Qu'il suffit ensuite d'utiliser avec cette méthode:

private DataTable ForgeUnionDMX(params object[] dmxQueries)
{
DataTable t1 = this.ExecuteQuery(dmxQueries[0].ToString());
for (int i = 1; i < dmxQueries.Length; i++)
{
t1.Merge(this.ExecuteQuery(dmxQueries[i].ToString()));
}
return t1;
}

Malheureusement, et c'est le seul point que je n'ai pas réussi à résoudre, il semble qu'Analysis Services soit incapable de reconnaitre les procédures stockées acceptant un paramètre de type params (ParamArray en VB).
Ce n'est donc pas cette méthode qu'il faut exposer mais plutôt autant d'alias qu'on souhaite accepter de paramètres...

public DataTable UnionDMX(string dmxQuery1, string dmxQuery2)
{
return this.ForgeUnionDMX(dmxQuery1, dmxQuery2);
}
public DataTable UnionDMX(string dmxQuery1, string dmxQuery2, string dmxQuery3)
{
return this.ForgeUnionDMX(dmxQuery1, dmxQuery2, dmxQuery3);
}

Sale et dommage, mais inéluctable semble-t-il: Greg Galloway et Darren Gosbell ont fait de même à de nombreux endroits dans le projet ASSP.

Voilà à vous de coller ça dans un projet C# et de l'essayer: vous allez voir c'est très joli et cela constitue un argument assez immédiat en faveur de ce type d'applications

A bientôt.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s