계산 측정값 표현(테이블 형식)
계산 측정값은 사용할 때마다 평가되는 명명된 DAX 식입니다. 계산 측정값이 사용할 때마다 평가되기 때문에 얻는 이점 중 하나는 계산 측정값이 사용 중인 컨텍스트에 따라 동적으로 평가된다는 점입니다.
계산 측정값 표현
계산 측정값은 평가 준비가 된 명명된 DAX 식이며, 다른 DAX 식에서 이름에 의해 참조될 수도 있습니다.
AMO의 계산 측정값
AMO를 사용하여 테이블 형식 모델 계산 측정값을 관리하는 경우 논리적 계산 측정값 개체와 MdxScript 개체의 Command 개체에 정의된 측정값 사이에 일 대 일 일치 관계가 있습니다. 각각의 다른 계산 측정값이 Command 개체 내부에서 CREATE MEASURE 식으로 정의되고 세미콜론으로 구분됩니다. 테이블 형식 모델의 모든 계산 측정값은 MdxScript 개체에 있는 하나의 명령 개체에서 컬렉션 CREATE MEASURE 문자열과 대응합니다. 또한 각 계산 측정값에는 CalculationProperty에 대한 일 대 일 매핑이 있습니다.
다음 코드 조각에서는 계산 측정값을 만드는 방법을 보여 줍니다.
private void addCalculatedMeasure(
AMO.Cube modelCube
, string cmTableName
, string cmName
, string newCalculatedMeasureExpression
)
{
//Verify input requirements
if (string.IsNullOrEmpty(cmName) || string.IsNullOrWhiteSpace(cmName))
{
MessageBox.Show(String.Format("Calculated Measure name is not defined."), "AMO to Tabular message", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (string.IsNullOrEmpty(newCalculatedMeasureExpression) || string.IsNullOrWhiteSpace(newCalculatedMeasureExpression))
{
MessageBox.Show(String.Format("Calculated Measure expression is not defined."), "AMO to Tabular message", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
StringBuilder measuresCommand = new StringBuilder();
AMO.MdxScript mdxScript = modelCube.MdxScripts["MdxScript"];
//ToDo: Verify if measure already exits and ask user what wants to do next
if (mdxScript.Commands.Count == 1)
{
measuresCommand.AppendLine("-------------------------------------------------------------");
measuresCommand.AppendLine("-- Tabular Model measures command (do not modify manually) --");
measuresCommand.AppendLine("-------------------------------------------------------------");
measuresCommand.AppendLine();
measuresCommand.AppendLine();
mdxScript.Commands.Add(new AMO.Command(measuresCommand.ToString()));
}
else
{
measuresCommand.Append(mdxScript.Commands[1].Text);
}
measuresCommand.AppendLine(string.Format("CREATE MEASURE '{0}'[{1}]={2};", cmTableName, cmName, newCalculatedMeasureExpression));
mdxScript.Commands[1].Text = measuresCommand.ToString();
if (!mdxScript.CalculationProperties.Contains(cmName))
{
AMO.CalculationProperty cp = new AMO.CalculationProperty(cmName, AMO.CalculationType.Member);
cp.FormatString = ""; // ToDo: Get formatting attributes for the member
cp.Visible = true;
mdxScript.CalculationProperties.Add(cp);
}
try
{
modelCube.Update(AMO.UpdateOptions.ExpandFull, AMO.UpdateMode.UpdateOrCreate);
MessageBox.Show(String.Format("Calculated Measure successfully defined."), "AMO to Tabular message", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (AMO.OperationException amoOpXp)
{
MessageBox.Show(String.Format("Calculated Measure 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 to Tabular 예제의 원본 코드를 참조하십시오. 특히 원본 파일 AddCalcualtedMeasure.cs에서 확인하십시오. 이 예제는 Codeplex에 있습니다. 코드에 대한 중요 정보: 코드는 여기에서 설명한 논리적 개념에 대한 지원으로만 제공되며 프로덕션 환경에서 사용해서는 안 됩니다. 그리고 교육 목적 이외의 목적으로는 사용할 수 없습니다.