共用方式為


導出資料行表示法 (表格式)

導出資料行是在資料表中建立新資料行的 DAX 運算式,而且取得的值會儲存在資料表中。每次處理資料表時,系統都會評估導出資料行運算式。

導出資料行表示法

在表格式物件模型內,導出資料行是資料表中的資料行,該資料行的值是根據運算式的資料行定義計算而來。

AMO 中的導出資料行

當您使用 AMO 管理表格式模型資料表時,物件與 AMO 中的導出資料行不會有一對一的相符關係;AMO 中的導出資料行是由 Dimension 中的屬性和 MeasureGroup 中的屬性表示。

下列程式碼片段示範如何將導出資料行加入至現有的表格式模型。 此程式碼假設您擁有 AMO 資料庫物件 newDatabase 及 AMO Cube 物件 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;
            }
        }

AMO2Tabular 範例

若要了解如何使用 AMO 建立及操作導出資料行表示法,請參閱 AMO 對表格式範例的原始程式碼,特別要檢查以下的原始程式檔:AddCalculatedColumn.cs。 您可以在 Codeplex 上取得此範例。 有關此程式碼的重要注意事項:此程式碼的提供目的只是為了支援這裡所說明的邏輯概念,不應該用於實際執行環境,也不應該用於教學以外的其他用途。