Partilhar via


Representação de coluna calculada (tabela)

Uma coluna calculada é uma expressão DAX que cria uma nova coluna em uma tabela, e os valores obtidos são armazenados na tabela; a expressão de coluna calculada é avaliada todas as vezes que a tabela é processada.

Representação de coluna calculada

Em modelos de objeto de tabela, a coluna calculada é uma coluna em uma tabela cujos valores são calculados após a definição da coluna, de uma expressão.

Colunas calculadas no AMO

Ao usar o AMO para gerenciar uma tabela de Modelo de tabela, não há nenhuma correspondência de objeto um para um para uma coluna calculada no AMO; no AMO, uma coluna calculada é representada por um atributo em um Dimension e um atributo em MeasureGroup.

O trecho de código a seguir mostra como adicionar uma coluna calculada a um modelo de tabela existente. O código supõe que você tenha um objeto de banco de dados de AMO, newDatabase e um objeto de cubo AMO, modelCube.

        private void addCalculatedColumn(
                           AMO.Database newDatabase
                         , AMO.Cube modelCube
                         , String ccTableName
                         , String ccName
                         , String newCalculatedColumnExpression
                     )
        {
            if (string.IsNullOrEmpty(ccName) || string.IsNullOrWhiteSpace(ccName))
            {
                MessageBox.Show(String.Format("Calculated Column name is not defined."), "AMO to Tabular message", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (string.IsNullOrEmpty(newCalculatedColumnExpression) || string.IsNullOrWhiteSpace(newCalculatedColumnExpression))
            {
                MessageBox.Show(String.Format("Calculated Column expression is not defined."), "AMO to Tabular message", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (newDatabase.Dimensions[ccTableName].Attributes.Contains(ccName))
            {
                MessageBox.Show(String.Format("Calculated Column name already defined."), "AMO to Tabular message", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            //Add CC attribute to the Dimension
            AMO.Dimension dim = newDatabase.Dimensions[ccTableName];
            AMO.DimensionAttribute currentAttribute = dim.Attributes.Add(ccName, ccName);
            currentAttribute.Usage = AMO.AttributeUsage.Regular;
            currentAttribute.KeyUniquenessGuarantee = false;

            currentAttribute.KeyColumns.Add(new AMO.DataItem(ccTableName, ccName, OleDbType.Empty));
            currentAttribute.KeyColumns[0].Source = new AMO.ExpressionBinding(newCalculatedColumnExpression);
            currentAttribute.KeyColumns[0].NullProcessing = AMO.NullProcessing.Preserve;
            currentAttribute.NameColumn = new AMO.DataItem(ccTableName, ccName, System.Data.OleDb.OleDbType.WChar);
            currentAttribute.NameColumn.Source = new AMO.ExpressionBinding(newCalculatedColumnExpression);
            currentAttribute.NameColumn.NullProcessing = AMO.NullProcessing.ZeroOrBlank;

            currentAttribute.OrderBy = AMO.OrderBy.Key;
            AMO.AttributeRelationship currentAttributeRelationship = dim.Attributes["RowNumber"].AttributeRelationships.Add(currentAttribute.ID);
            currentAttributeRelationship.Cardinality = AMO.Cardinality.Many;
            currentAttributeRelationship.OverrideBehavior = AMO.OverrideBehavior.None;

            //Add CC as attribute to the MG
            AMO.MeasureGroup mg = modelCube.MeasureGroups[ccTableName];
            AMO.DegenerateMeasureGroupDimension currentMGDim = (AMO.DegenerateMeasureGroupDimension)mg.Dimensions[ccTableName];
            AMO.MeasureGroupAttribute mga = new AMO.MeasureGroupAttribute(ccName);

            mga.KeyColumns.Add(new AMO.DataItem(ccTableName, ccName, OleDbType.Empty));
            mga.KeyColumns[0].Source = new AMO.ExpressionBinding(newCalculatedColumnExpression);


            currentMGDim.Attributes.Add(mga);

            try
            {
                //Update Dimension, CubeDimension and MG in server
                newDatabase.Update(AMO.UpdateOptions.ExpandFull, AMO.UpdateMode.UpdateOrCreate);
            }
            catch (AMO.OperationException amoOpXp)
            {
                MessageBox.Show(String.Format("Calculated Column 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 coluna calculada, consulte o código-fonte do exemplo AMO para Tabela; verifique especificamente o seguinte arquivo de origem: AddCalculatedColumn.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.