계층 표현(테이블 형식)
계층은 최종 사용자에게 풍부한 드릴업 및 드릴다운 환경을 제공하는 메커니즘입니다.
계층 표현
테이블 형식 개체 모델에서 계층은 사용자가 선택한 값을 기준으로 한 특성에서 다른 특성으로의 탐색 경로를 나타냅니다.
AMO의 계층
AMO를 사용하여 테이블 형식 모델 테이블을 관리하는 경우 AMO의 계층에 대해 일 대 일 개체 일치가 있습니다. AMO의 계층은 Hierarchy 개체로 표현됩니다.
다음 코드 조각에서는 계층을 기존 테이블 형식 모델에 추가하는 방법을 보여 줍니다. 이 코드에서는 AMO 데이터베이스 개체인 newDatabase 및 AMO 큐브 개체인 modelCube를 보유하고 있다고 가정합니다.
private void addHierarchy(
AMO.Database newDatabase
, AMO.Cube modelCube
, string tableName
, string hierarchyName
, string levelsText
)
{
//Validate input
if (string.IsNullOrEmpty(hierarchyName) || string.IsNullOrEmpty(levelsText))
{
MessageBox.Show(String.Format("Hierarchy Name or Layout must be provided."), "AMO to Tabular message", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
if (!overwriteHierarchy.Checked && newDatabase.Dimensions[tableName].Hierarchies.Contains(hierarchyName))
{
MessageBox.Show(String.Format("Hierarchy already exists.\nGive a new name or enable overwriting"), "AMO to Tabular message", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
try
{
if (newDatabase.Dimensions[tableName].Hierarchies.Contains(hierarchyName))
{
//Hierarchy exists... deleting it to write it later
newDatabase.Dimensions[tableName].Hierarchies.Remove(hierarchyName, true);
newDatabase.Dimensions[tableName].Update(AMO.UpdateOptions.AlterDependents);
}
AMO.Hierarchy currentHierarchy = newDatabase.Dimensions[tableName].Hierarchies.Add(hierarchyName, hierarchyName);
currentHierarchy.AllMemberName = string.Format("(All of {0})", hierarchyName);
//Parse hierarchyLayout
using (StringReader levels = new StringReader(levelsText))
{
//Each line:
// must come with: The columnId of the attribute in the dimension --> this represents the SourceAttributeID
// optional: A display name for the Level (if this argument doesn't come the default is the SourceAttributeID)
string line;
while ((line = levels.ReadLine()) != null)
{
if (string.IsNullOrEmpty(line) || string.IsNullOrWhiteSpace(line)) continue;
line = line.Trim();
string[] hierarchyData = line.Split(',');
if (string.IsNullOrEmpty(hierarchyData[0])) continue; //first argument cannot be empty or blank,
//assume is a blank line and ignore it
string levelSourceAttributeID = hierarchyData[0].Trim();
string levelID = (hierarchyData.Length > 1 && !string.IsNullOrEmpty(hierarchyData[1])) ? hierarchyData[1].Trim() : levelSourceAttributeID;
currentHierarchy.Levels.Add(levelID).SourceAttributeID = levelSourceAttributeID;
}
}
newDatabase.Dimensions[tableName].Update(AMO.UpdateOptions.AlterDependents);
}
catch (Exception ex)
{
MessageBox.Show(String.Format("Error creating hierarchy [{0}].\nError message: {1}", newHierarchyName.Text, ex.Message), "AMO to Tabular message", MessageBoxButtons.OK, MessageBoxIcon.Warning);
if (newDatabase.Dimensions[tableName].Hierarchies.Contains(hierarchyName))
{
//Hierarchy was created but exception prevented complete hierarchy to be written... deleting incomplete hierarchy
newDatabase.Dimensions[tableName].Hierarchies.Remove(hierarchyName, true);
newDatabase.Dimensions[tableName].Update(AMO.UpdateOptions.AlterDependents);
}
}
newDatabase.Dimensions[tableName].Process(AMO.ProcessType.ProcessFull);
modelCube.MeasureGroups[tableName].Process(AMO.ProcessType.ProcessFull);
}
AMO2Tabular 예제
AMO를 사용하여 계층 표현을 만들고 조작하려면 AMO to Tabular 예제의 원본 코드를 참조하십시오. 특히 원본 파일 AddHierarchies.cs에서 확인하십시오. 이 예제는 Codeplex에 있습니다. 코드에 대한 중요 정보: 코드는 여기에서 설명한 논리적 개념에 대한 지원으로만 제공되며 프로덕션 환경에서 사용해서는 안 됩니다. 그리고 교육 목적 이외의 목적으로는 사용할 수 없습니다.