Partager via


Représentation (tabulaire) d'une colonne calculée

Une colonne calculée est l'expression DAX qui crée une colonne dans une table et dont les valeurs obtenues sont stockées dans la table ; l'expression de colonne calculée est évaluée chaque fois que la table est traitée.

Représentation d'un colonne calculée

Dans les modèles objet tabulaires, la colonne calculée est une colonne d'une table dont les valeurs sont calculées lors de la définition de la colonne, à partir d'une expression.

Colonnes calculées dans AMO

Lorsque vous utilisez AMO pour gérer une table de modèle tabulaire il n'existe aucune correspondance d'objet un-à-un pour une colonne calculée dans AMO ; dans AMO, une colonne calculée est représentée par un attribut dans Dimension et un attribut dans MeasureGroup.

L'extrait de code suivant montre comment ajouter une colonne calculée à un modèle tabulaire existant. Le code suppose que vous avez un objet de base de données AMO (newDatabase) et un objet de cube 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;
            }
        }

Exemple AMO2Tabular

Pour savoir comment utiliser AMO pour créer et manipuler des représentations de colonne calculée, consultez le code source de l'exemple Objets AMO vers objets tabulaires ; plus précisément, archivez le fichier source suivant : AddCalculatedColumn.cs. L'exemple est disponible sur Codeplex. Remarque importante à propos du code : le code est fourni uniquement comme un support aux concepts logiques expliqués ici et ne doit pas être utilisé dans un environnement de production, ni à des fins autres que pédagogiques.