Rappresentazione della colonna calcolata (tabulare)
Una colonna calcolata è espressione DAX che crea una nuova colonna in una tabella e i valori ottenuti vengono archiviati nella tabella. L'espressione della colonna calcolata viene valutata ogni volta che viene elaborata la tabella.
Rappresentazione della colonna calcolata
Nei modelli a oggetti tabulari la colonna calcolata è una colonna in una tabella i cui valori sono calcolati da un'espressione, in base alla definizione della colonna.
Colonne calcolate in AMO
Se si utilizza AMO per gestire una tabella di modelli tabulari, non vi è corrispondenza di oggetti uno-a-uno per una colonna calcolata. In AMO, una colonna calcolata è rappresentata da un attributo in un oggetto Dimension e un attributo in MeasureGroup.
Nel frammento di codice seguente viene illustrato come aggiungere una colonna calcolata a un modello tabulare esistente. Nel codice si presuppone che si disponga di un oggetto di database AMO, newDatabase, e di un oggetto 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;
}
}
Esempio AMO2Tabular
Per comprendere la modalità di utilizzo di AMO (Analysis Management Objects) per creare e gestire le rappresentazioni delle colonne calcolate, vedere il codice sorgente dell'esempio Da AMO a tabulare. In particolare effettuare un controllo nel seguente file di origine: AddCalculatedColumn.cs. L'esempio è disponibile all'indirizzo Codeplex. Nota importante sul codice: il codice viene fornito solo come supporto ai concetti logici illustrati in questo argomento e non deve essere utilizzato in un ambiente di produzione né deve essere utilizzato per altro scopo se non quello formativo.