Compartir a través de


Representación de la medida calculada (tabular)

Una medida calculada es una expresión DAX con nombre que se evalúa cada vez que se usa; una de las ventajas de ser evaluada cada vez que se usa es el hecho de que la medida calculada se evalúa dinámicamente según el contexto en el que se usa.

Representación de la medida calculada

Una medida calculada es una expresión DAX con nombre lista para ser evaluada, a la que se puede hacer referencia en otras expresiones DAX según su nombre.

Medida calculada en AMO

Cuando se usa AMO para administrar una medida calculada de modelo tabular, hay una correspondencia de uno a uno entre el objeto lógico de medida calculada y una medida definida en un objeto Command del objeto MdxScript; cada medida calculada diferente se define como una expresión CREATE MEASURE dentro de un objeto Command y separada por un punto y comas. Todas las medidas calculadas en un modelo tabular corresponden a la cadena CREATE MEASURE de la colección de un objeto de comando incluido en un objeto MdxScript. Además, para cada medida calculada existe una asignación uno a uno con un objeto CalculationProperty.

En el fragmento de código siguiente se muestra cómo se crea una medida calculada.

        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;
            }
        }

Ejemplo AMO2Tabular

Para obtener una descripción de cómo utilizar AMO para crear y tratar representaciones de medidas calculadas, vea el código fuente del ejemplo AMO a tabular; en concreto, revise el siguiente archivo fuente: AddCalculatedMeasure.cs. El ejemplo está disponible en Codeplex. Una nota importante sobre el código: se proporciona solo como apoyo de los conceptos lógicos explicados aquí y no debe utilizarse en un entorno de producción; no debe usarse para otros fines excepto el pedagógico.