導出資料行表示法 (表格式)
導出資料行是在資料表中建立新資料行的 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 上取得此範例。 有關此程式碼的重要注意事項:此程式碼的提供目的只是為了支援這裡所說明的邏輯概念,不應該用於實際執行環境,也不應該用於教學以外的其他用途。