Rappresentazione della misura calcolata (tabulare)

Una misura calcolata è un'espressione DAX denominata valutata ogni volta che viene utilizzata; uno dei vantaggi di essere valutata ogni volta che viene utilizzata è che la misura calcolata viene valutata dinamicamente a seconda del contesto in cui viene utilizzata.

Rappresentazione della misura calcolata

Una misura calcolata è un'espressione DAX denominata pronta per essere valutata, a cui si può fare riferimento anche nelle altre espressioni DAX in base al nome.

Misure calcolate in AMO

Quando si utilizza AMO (Analysis Management Objects) per gestire una misura calcolata di un modello tabulare, esiste una corrispondenza uno-a-uno tra l'oggetto logico della misura calcolata e la misura definita in un oggetto Command dell'oggetto MdxScript; ogni misura calcolata diversa è definita come un'espressione CREATE MEASURE all'interno di un oggetto Command ed è separata da un punto e virgola. Tutte le misure calcolate in un modello tabulare corrispondono alla stringa CREATE MEASURE della raccolta in un oggetto comando all'interno di un oggetto MdxScript. Inoltre, per ogni misura calcolata è presente il mapping uno-a-uno con un oggetto CalculationProperty.

Nel frammento di codice seguente viene illustrato come creare una misura calcolata.

        private void addCalculatedMeasure(
                           AMO.Cube modelCube
                         , string cmTableName
                         , string cmName
                         , string newCalculatedMeasureExpression
                     )
        {
            //Verify input requirements
            if (string.IsNullOrEmpty(cmName) || string.IsNullOrWhiteSpace(cmName))
            {
                MessageBox.Show(String.Format("Calculated Measure name is not defined."), "AMO to Tabular message", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (string.IsNullOrEmpty(newCalculatedMeasureExpression) || string.IsNullOrWhiteSpace(newCalculatedMeasureExpression))
            {
                MessageBox.Show(String.Format("Calculated Measure expression is not defined."), "AMO to Tabular message", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            StringBuilder measuresCommand = new StringBuilder();

            AMO.MdxScript mdxScript = modelCube.MdxScripts["MdxScript"];

            //ToDo: Verify if measure already exits and ask user what wants to do next

            if (mdxScript.Commands.Count == 1)
            {
                measuresCommand.AppendLine("-------------------------------------------------------------");
                measuresCommand.AppendLine("-- Tabular Model measures command (do not modify manually) --");
                measuresCommand.AppendLine("-------------------------------------------------------------");
                measuresCommand.AppendLine();
                measuresCommand.AppendLine();
                mdxScript.Commands.Add(new AMO.Command(measuresCommand.ToString()));

            }
            else
            {
                measuresCommand.Append(mdxScript.Commands[1].Text);
            }
            measuresCommand.AppendLine(string.Format("CREATE MEASURE '{0}'[{1}]={2};", cmTableName, cmName, newCalculatedMeasureExpression));


            mdxScript.Commands[1].Text = measuresCommand.ToString();


            if (!mdxScript.CalculationProperties.Contains(cmName))
            {
                AMO.CalculationProperty cp = new AMO.CalculationProperty(cmName, AMO.CalculationType.Member);
                cp.FormatString = ""; // ToDo: Get formatting attributes for the member
                cp.Visible = true;
                mdxScript.CalculationProperties.Add(cp);
            }

            try
            {
                modelCube.Update(AMO.UpdateOptions.ExpandFull, AMO.UpdateMode.UpdateOrCreate);
                MessageBox.Show(String.Format("Calculated Measure successfully defined."), "AMO to Tabular message", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (AMO.OperationException amoOpXp)
            {
                MessageBox.Show(String.Format("Calculated Measure expression contains syntax errors, or references undefined or missspelled elements.\nError message: {0}", amoOpXp.Message), "AMO to Tabular message", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            catch (AMO.AmoException amoXp)
            {
                MessageBox.Show(String.Format("AMO exception accessing the server.\nError message: {0}", amoXp.Message), "AMO to Tabular message", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            catch (Exception)
            {
                throw;
            }
        }

Esempio AMO2Tabular

Per comprendere le modalità di utilizzo di AMO (Analysis Management Objects) per creare e gestire le rappresentazioni delle misure calcolate, vedere il codice sorgente dell'esempio Da AMO a tabulare; in particolare effettuare un controllo nel seguente file di origine: AddCalculatedMeasure.cs. L'esempio è disponibile all'indirizzo Codeplex. Nota importante sul codice: il codice viene fornito solo come supporto ai concetti logici illustrati in questo argomento e non deve essere utilizzato in un ambiente di produzione né deve essere utilizzato per altro scopo se non quello formativo.