設計 AMO OLAP 進階物件的程式
本主題說明 OLAP 進階物件的分析管理物件 (AMO) 程式設計詳細資料。本主題包含下列章節:
動作物件
Kpi 物件
檢視方塊物件
ProactiveCaching 物件
翻譯物件
動作物件
動作類別是用以在瀏覽 Cube 的某些區域時,建立主動式回應。動作物件可以使用 AMO 來定義,但是是從瀏覽資料的用戶端應用程式來使用這些物件。動作可以屬於不同類型,而且必須據其類型來建立。動作可以是:
鑽研動作,該動作會傳回一組資料列,這些資料列表示動作發生所在之 Cube 中選定資料格的基礎資料。
報表動作,該動作會從與動作發生所在之 Cube 中選定區段有關的 Reporting Services 內傳回報表。
標準動作,該動作會傳回與動作發生所在之 Cube 中選定區段有關的動作元素 (URL、HTML、DataSet、RowSet 和其他元素)。
建立動作物件需要下列步驟:
建立衍生的動作物件並擴展基本屬性。
下列為基本屬性:動作類型、Cube 的目標類型或區段、可以使用動作之所在 Cube 的目標或特定區域、標題,以及標題是 MDX 運算式的位置。
擴展動作類型的特定屬性。
三種類型的動作各有不同的屬性,請參閱以下程式碼範例以了解參數。
將動作加入 Cube 集合並更新 Cube。動作不是可更新的物件。
測試這個動作需要不同的程式應用程式。您可以在 Business Intelligence Development Studio 中測試動件。首先,您必須安裝 Reporting Services 範例,請參閱<Processing Analysis Services Objects>。
下列範例程式碼將會從 AdventureWorks Analysis Services 專案範例複寫三種不同的動作。如需有關安裝範例的詳細資訊,請參閱<AdventureWorks Sample Databases>。您可以區分這些動作,因為使用下列範例所介紹的這些動作,是以 "My" 開頭。
static public void CreateActions(Cube cube)
{
#region Adding a drillthrough action
// Verify That action exists and drop it
if (cube.Actions.ContainsName("My Reseller Details"))
cube.Actions.Remove("My Drillthrough Action",true);
//Create a Drillthrough action
DrillThroughAction dtaction = new DrillThroughAction("My Reseller Details", "My Drillthrough Action");
//Define the Action
dtaction.Type = ActionType.DrillThrough;
dtaction.TargetType = ActionTargetType.Cells;
dtaction.Target = "MeasureGroupMeasures(\"Reseller Sales\")";
dtaction.Caption = "My Drillthrough...";
dtaction.CaptionIsMdx = false;
#region create drillthrough action specifics
//Adding Drillthrough columns
//Adding Measure columns to the drillthrough
MeasureGroup mg = cube.MeasureGroups.FindByName("Reseller Sales");
MeasureBinding mb1 = new MeasureBinding();
mb1.MeasureID = mg.Measures.FindByName( "Reseller Sales Amount").ID;
dtaction.Columns.Add(mb1);
MeasureBinding mb2 = new MeasureBinding();
mb2.MeasureID = mg.Measures.FindByName("Reseller Order Quantity").ID;
dtaction.Columns.Add(mb2);
MeasureBinding mb3 = new MeasureBinding();
mb3.MeasureID = mg.Measures.FindByName("Reseller Unit Price").ID;
dtaction.Columns.Add(mb3);
//Adding Dimension Columns to the drillthrough
CubeAttributeBinding cb1 = new CubeAttributeBinding();
cb1.CubeID = cube.ID;
cb1.CubeDimensionID = cube.Dimensions.FindByName("Reseller").ID;
cb1.AttributeID = "Reseller Name";
cb1.Type = AttributeBindingType.All;
dtaction.Columns.Add(cb1);
CubeAttributeBinding cb2 = new CubeAttributeBinding();
cb2.CubeID = cube.ID;
cb2.CubeDimensionID = cube.Dimensions.FindByName("Product").ID;
cb2.AttributeID = "Product Name";
cb2.Type = AttributeBindingType.All;
dtaction.Columns.Add(cb2);
#endregion
//Add the defined action to the cube
cube.Actions.Add(dtaction);
#endregion
#region Adding a Standard action
// Verify That action exists and drop it
if (cube.Actions.ContainsName("My City Map"))
cube.Actions.Remove("My Action", true);
//Create a Drillthrough action
StandardAction stdaction = new StandardAction("My City Map", "My Action");
//Define the Action
stdaction.Type = ActionType.Url;
stdaction.TargetType = ActionTargetType.AttributeMembers;
stdaction.Target = "[Geography].[City]";
stdaction.Caption = "\"My View Map for \" + [Geography].[City].CurrentMember.Member_Caption + \"...\"";
stdaction.CaptionIsMdx = true;
#region create standard action specifics
stdaction.Expression = "\"http://maps.msn.com/home.aspx?plce1=\" + " +
"[Geography].[City].CurrentMember.Name + \",\" + " +
"[Geography].[State-Province].CurrentMember.Name + \",\" + " +
"[Geography].[Country].CurrentMember.Name + " +
"\"®n1=\" + " +
"Case " +
"When [Geography].[Country].CurrentMember Is " +
"[Geography].[Country].&[Australia] " +
"Then \"3\" " +
"When [Geography].[Country].CurrentMember Is " +
"[Geography].[Country].&[Canada] " +
"Or [Geography].[Country].CurrentMember Is " +
"[Geography].[Country].&[United States] " +
"Then \"0\" " +
"Else \"1\" " +
"End ";
#endregion
//Add the defined action to the cube
cube.Actions.Add(stdaction);
#endregion
#region Adding a Reporting action
// Verify That action exists and drop it
if (cube.Actions.ContainsName("My Sales Reason Comparisons"))
cube.Actions.Remove("My Report Action", true);
//Create a Report action
ReportAction rsaction = new ReportAction("My Sales Reason Comparisonsp", "My Report Action");
//Define the Action
rsaction.Type = ActionType.Report;
rsaction.TargetType = ActionTargetType.AttributeMembers;
rsaction.Target = "[Product].[Category]";
rsaction.Caption = "\"My Sales Reason Comparisons for \" + [Product].[Category].CurrentMember.Member_Caption + \"...\"";
rsaction.CaptionIsMdx = true;
#region create Report action specifics
rsaction.ReportServer = "MyRSSamplesServer";
rsaction.Path = "ReportServer?/AdventureWorks Sample Reports/Sales Reason Comparisons";
rsaction.ReportParameters.Add("ProductCategory", "UrlEscapeFragment( [Product].[Category].CurrentMember.UniqueName )");
rsaction.ReportFormatParameters.Add("rs:Command", "Render");
rsaction.ReportFormatParameters.Add("rs:Renderer", "HTML5");
#endregion
//Add the defined action to the cube
cube.Actions.Add(rsaction);
#endregion
}
Kpi 物件
關鍵效能指標 (KPI) 是一種計算集合,與 Cube 中的量值群組關聯,並且用以評估企業存取。Kpi 物件可由 AMO 定義,但是是從瀏覽資料的用戶端應用程式使用。
建立 Kpi 物件需要下列步驟:
建立 Kpi 物件並擴展基本屬性。
下列是基本屬性清單:「描述」、「顯示資料夾」、「相關聯的量值群組」以及「值」。「顯示資料夾」會告訴用戶端應用程式一般使用者在哪裡可以找到 KPI。「相關聯的量值群組」指出應參考所有 MDX 計算之量值群組。「值」將效能指標的實際值顯示成 MDX 運算式。
定義 KPI 標記:目標、狀態和趨勢。
指標是應該在 -1 到 1 之間評估的 MDX 運算式,但為定義指標值範圍的瀏覽應用程式。
當您在 Business Intelligence Development Studio 中瀏覽 KPI 時,會將小於 -1 的值視為 -1,並將大於 1 的值視為 1。
定義圖形影像。
圖形影像是字串值,可做為用戶端應用程式中的參考使用,以識別要顯示之影像的正確集合。圖形影像字串也會定義顯示函數的行為。通常範圍會分成奇數的狀態、從良好到不良,並且會從該集合指派每個狀態一個影像。
如果您使用 Business Intelligence Development Studio 瀏覽 KPI,則視名稱而定,會將指標範圍分成三個狀態或是五個狀態。此外,有些反轉範圍的名稱,-1 代表「良好」,而 1 則代表「不良」。在 Business Intelligence Development Studio 中,範圍中的三個狀態如下所示:
不良 = -1 到 -0.5
沒有問題 = -0.4999 to -0.4999
良好 = 0.50 到 1
在 Business Intelligence Development Studio 中,範圍內有五個狀態,如下所示:
不良 = -1 到 -0.75
危險 = -0.7499 到 -0.25
沒有問題 = -0.2499 到 0.2499
引發 = 0.25 到 0.7499
良好 = 0.75 到 1
下表列出與其影像關聯之用法、名稱和狀態數目。
影像使用量 |
映像名稱 |
狀態的數目 |
---|---|---|
狀態 |
圖形 |
3 |
狀態 |
號誌燈 |
3 |
狀態 |
道路標誌 |
3 |
狀態 |
量測軌 |
3 |
狀態 |
反向量測軌 |
5 |
狀態 |
溫度計 |
3 |
狀態 |
圓柱 |
3 |
狀態 |
笑臉 |
3 |
狀態 |
變異箭頭 |
3 |
趨勢 |
標準箭頭 |
3 |
趨勢 |
狀態箭頭 |
3 |
趨勢 |
反向狀態箭頭 |
5 |
趨勢 |
笑臉 |
3 |
- 將 KPI 加入 Cube 集合並更新 Cube,因為 KPI 不是可更新的物件。
測試 KPI 需要不同的程式應用程式。您可以在 Business Intelligence Development Studio 中測試您的 KPI。
下列範例程式碼會為包括在 AdventureWorks Analysis Services 專案範例中的 AdventureWorks Cube,在 "Financial Perpective/Grow Revenue" 資料夾中建立 KPI。如需有關安裝範例的詳細資訊,請參閱<AdventureWorks Sample Databases>。
static public void CreateKPIs(Cube cube)
{
Kpi kpi = cube.Kpis.Add("My Internet Revenue", "My Internet Revenue");
kpi.Description = "(My) Revenue achieved through direct sales via Interner";
kpi.DisplayFolder = "\\Financial Perspective\\Grow Revenue";
kpi.AssociatedMeasureGroupID = "Internet Sales";
kpi.Value = "[Measures].[Internet Sales Amount]";
#region Goal
kpi.Goal = "Case" +
" When IsEmpty" +
" (" +
" ParallelPeriod" +
" (" +
" [Date].[Fiscal Time].[Fiscal Year]," +
" 1," +
" [Date].[Fiscal Time].CurrentMember" +
" )" +
" )" +
" Then [Measures].[Internet Sales Amount]" +
" Else 1.10 *" +
" (" +
" [Measures].[Internet Sales Amount]," +
" ParallelPeriod" +
" (" +
" [Date].[Fiscal Time].[Fiscal Year]," +
" 1," +
" [Date].[Fiscal Time].CurrentMember" +
" )" +
" ) " +
" End";
#endregion
#region Status
kpi.Status = "Case" +
" When KpiValue( \"Internet Revenue\" ) / KpiGoal ( \"Internet Revenue\" ) >= .95 " +
" Then 1 " +
" When KpiValue( \"Internet Revenue\" ) / KpiGoal ( \"Internet Revenue\" ) < .95 " +
" And " +
" KpiValue( \"Internet Revenue\" ) / KpiGoal ( \"Internet Revenue\" ) >= .85 " +
" Then 0 " +
" Else -1 " +
"End";
#endregion
#region Trend
kpi.Trend = "Case " +
" When VBA!Abs " +
" ( " +
" KpiValue( \"Internet Revenue\" ) - " +
" ( " +
" KpiValue ( \"Internet Revenue\" ), " +
" ParallelPeriod " +
" ( " +
" [Date].[Fiscal Time].[Fiscal Year], " +
" 1, " +
" [Date].[Fiscal Time].CurrentMember " +
" ) " +
" ) / " +
" ( " +
" KpiValue ( \"Internet Revenue\" ), " +
" ParallelPeriod " +
" ( " +
" [Date].[Fiscal Time].[Fiscal Year], " +
" 1, " +
" [Date].[Fiscal Time].CurrentMember " +
" ) " +
" ) " +
" ) <=.02 " +
" Then 0 " +
" When KpiValue( \"Internet Revenue\" ) - " +
" ( " +
" KpiValue ( \"Internet Revenue\" ), " +
" ParallelPeriod " +
" ( " +
" [Date].[Fiscal Time].[Fiscal Year], " +
" 1, " +
" [Date].[Fiscal Time].CurrentMember " +
" ) " +
" ) / " +
" ( " +
" KpiValue ( \"Internet Revenue\" ), " +
" ParallelPeriod " +
" ( " +
" [Date].[Fiscal Time].[Fiscal Year], " +
" 1, " +
" [Date].[Fiscal Time].CurrentMember " +
" ) " +
" ) >.02 " +
" Then 1 " +
" Else -1 " +
"End";
#endregion
kpi.TrendGraphic = "Standard Arrow";
kpi.StatusGraphic = "Cylinder";
}.
檢視方塊物件
Perspective 物件可以使用 AMO 來定義,但是是從瀏覽資料的用戶端應用程式來使用這些物件。
建立 Perspective 物件需要下列步驟:
建立 Perspective 物件並擴展基本屬性。
下列是基本屬性的清單:「名稱」、「預設量值」、「描述」和註解。
從一般使用者應該看到的父 Cube,加入所有的物件。
加入 Cube 維度 (屬性和階層)、量值群組 (量值和量值群組)、動作、KPI 和計算。
將檢視方塊加入 Cube 集合並更新 Cube,因為檢視方塊不是可更新的物件。
測試檢視方塊需要不同的程式應用程式。您可以在 Business Intelligence Development Studio 中測試您的檢視方塊。
下列程式碼範會為提供的 Cube 建立名為 "Direct Sales" 的檢視方塊。
static public void CreatePerspectives(Cube cube)
{
Perspective perspective = cube.Perspectives.Add("Direct Sales", "Direct Sales");
CubeDimension dim1 = cube.Dimensions.GetByName("Date");
PerspectiveDimension pdim1 = perspective.Dimensions.Add(dim1.DimensionID);
pdim1.Attributes.Add("Date");
pdim1.Attributes.Add("Calendar Year");
pdim1.Attributes.Add("Fiscal Year");
pdim1.Attributes.Add("Calendar Quarter");
pdim1.Attributes.Add("Fiscal Quarter");
pdim1.Attributes.Add("Calendar Month Number");
pdim1.Attributes.Add("Fiscal Month Number");
pdim1.Hierarchies.Add("Calendar Time");
pdim1.Hierarchies.Add("Fiscal Time");
CubeDimension dim2 = cube.Dimensions.GetByName("Product");
PerspectiveDimension pdim2 = perspective.Dimensions.Add(dim2.DimensionID);
pdim2.Attributes.Add("Product Name");
pdim2.Attributes.Add("Product Line");
pdim2.Attributes.Add("Model Name");
pdim2.Attributes.Add("List Price");
pdim2.Attributes.Add("Size");
pdim2.Attributes.Add("Weight");
pdim2.Hierarchies.Add("Product Model Categories");
pdim2.Hierarchies.Add("Product Categories");
PerspectiveMeasureGroup pmg = perspective.MeasureGroups.Add("Internet Sales");
pmg.Measures.Add("Internet Sales Amount");
pmg.Measures.Add("Internet Order Quantity");
pmg.Measures.Add("Internet Unit Price");
pmg = perspective.MeasureGroups.Add("Reseller Sales");
pmg.Measures.Add("Reseler Sales Amount");
pmg.Measures.Add("Reseller Order Quantity");
pmg.Measures.Add("Reseller Unit Price");
PerspectiveAction pact = perspective.Actions.Add("Drillthrough Action");
PerspectiveKpi pkpi = perspective.Kpis.Add("Internet Revenue");
Cube.Update();
}
ProactiveCaching 物件
ProactiveCaching 物件可由 AMO 定義。
建立 ProactiveCaching 物件需要下列步驟:
建立 ProactiveCaching 物件。
沒有要定義的基本屬性。
加入快取規格。
規格 |
說明 |
---|---|
AggregationStorage |
彙總的儲存類型。 只適用於資料分割。維度上它必須是 Regular. |
SilenceInterval |
在 MOLAP 影像處理開始之前,快取存在的最少時間量。 |
Latency |
最早通知與終結 MOLAP 影像之間的時間量。 |
SilenceOverrideInterval |
在 MOLAP 影像處理無條件介入之後,初始通知後的時間。 |
ForceRebuildInterval |
在 MOLAP 影像處理無條件開始之後 (沒有通知) 的時間 (在捨棄全新的 MOLAP 影像之後開始)。 |
OnlineMode |
當 MOLAP 影像是可用的。 可以為 Immediate 或 OnCacheComplete。 |
- 將 ProactiveCaching 物件加入父集合。您將需要更新父系,因為 ProactiveCaching 不是可更新的物件。
下列程式碼範例會在所有資料分割上建立 ProactiveCaching 物件,這些資料分割是來自指定資料庫的 Adventure Works Cube 中之「網際網路銷售」量值群組。
static public void SetProactiveCachingSettings(Database db)
{
ProactiveCaching pc;
if (db.Cubes.ContainsName("Adventure Works") && db.Cubes.FindByName("Adventure Works").MeasureGroups.ContainsName("Internet Sales"))
{
ProactiveCachingTablesBinding pctb;
TableNotification tn;
MeasureGroup mg = db.Cubes.FindByName("Adventure Works").MeasureGroups.FindByName("Internet Sales");
foreach(Partition part in mg.Partitions)
{
pc = new ProactiveCaching();
pc.AggregationStorage = ProactiveCachingAggregationStorage.MolapOnly;
pc.SilenceInterval = TimeSpan.FromSeconds(10);
pc.Latency = TimeSpan.FromSeconds(-1);
pc.SilenceOverrideInterval = TimeSpan.FromMinutes(10);
pc.ForceRebuildInterval = TimeSpan.FromSeconds(-1);
pc.Enabled = true;
pc.OnlineMode = ProactiveCachingOnlineMode.OnCacheComplete;
pctb = new ProactiveCachingTablesBinding();
pctb.NotificationTechnique = NotificationTechnique.Server;
tn = new TableNotification("[FactInternetSales]", "dbo");
pctb.TableNotifications.Add( tn);
pc.Source = pctb;
part.ProactiveCaching = pc;
part.Update();
}
}
}
翻譯物件
翻譯物件可以使用 AMO 來定義,但是是從瀏覽資料的用戶端應用程式來使用這些物件。翻譯物件是非常容易撰寫程式的物件。物件標題的翻譯是由「地區設定識別碼」與「已翻譯標題」配對所提供。任何標題都可以啟用多個翻譯。翻譯可以提供給大部分的 Analysis Services 物件使用,例如維度、屬性、階層、Cube、量值群組、量值等等。
下列程式碼範例為屬性 Product Name 的名稱提供西班牙文的翻譯。
static public void CreateTranslations(Database db)
{
//Spanish Tranlations for Product Category in Product Dimension
Dimension dim = db.Dimensions["Product"];
DimensionAttribute atr = dim.Attributes["Product Name"];
Translation tran = atr.Translations.Add(3082);
tran.Caption = "Nombre Producto";
dim.Update(UpdateOptions.ExpandFull);
}