Compartilhar via


Representação de medida calculada (de tabela)

Uma medida calculada é uma expressão DAX nomeada avaliada toda vez que é usada; um dos benefícios de ser avaliada toda vez que é usada é o fato de a medida calculada ser avaliada dinamicamente de acordo com o contexto em que é usada.

Representação de medida calculada

Uma medida calculada é uma expressão DAX nomeada pronta para ser avaliada, que também pode ser referenciada em outras expressões DAX por seu nome.

Medidas calculadas no AMO

Ao usar o AMO para gerenciar uma Medida Calculada de Modelo de Tabela, há uma correspondência um-para-um entre o objeto de Medida Calculada lógica e uma medida definida em um objeto Command do objeto MdxScript; cada Medida Calculada diferente é definida como uma expressão CREATE MEASURE dentro de um objeto Command e separada por um ponto-e-vírgula. Todas as medidas calculadas em um modelo de tabela correspondem à cadeia de caracteres da coleção CREATE MEASURE em um objeto de comando em um objeto MdxScript; além disso, para cada medida calculada há mapeamento de um para um com um CalculationProperty.

O trecho de código a seguir mostra como criar uma 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;
            }
        }

Exemplo de AMO2Tabular

Para compreender como usar o AMO para criar e manipular representações de medida calculada, consulte o código-fonte do exemplo AMO para Tabela; verifique especificamente o seguinte arquivo de origem: AddCalculatedMeasure.cs. O exemplo está disponível em Codeplex. Uma nota importante sobre o código: o código é fornecido apenas como um suporte aos conceitos lógicos explicados aqui; ele não deve ser usado em um ambiente de produção, nem para fins que não sejam pedagógicos.