共用方式為


程序設計 AMO OLAP 進階物件

適用於: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium

本主題說明 OLAP 進階物件的分析管理物件 (AMO) 程式設計詳細數據。

動作物件

流覽 Cube 的特定區域時,動作類別可用來建立作用中的回應。 動作物件可以使用 AMO 來定義,但會從瀏覽資料的用戶端應用程式使用。 動作可以是不同類型的動作,而且必須根據其類型來建立它們。 動作可以是:

  • 鑽研動作,會傳回一組數據列,代表執行動作之 Cube 所選取單元格的基礎數據。

  • 報告動作,其會從傳回與發生動作之 Cube 所選取區段相關聯的報表。

  • 標準動作,其會傳回動作專案(URL、HTML、DataSet、RowSet 和其他元素),與動作發生所在 Cube 的選取區段相關聯。

建立動作物件需要下列步驟:

  1. 建立衍生動作物件並填入基本屬性。

    以下是基本屬性:動作類型、Cube 的目標類型或區段、動作可用之 Cube 的目標或特定區域、標題和標題為 MDX 表達式的位置。

  2. 填入動作類型的特定屬性。

    這三種動作類型的屬性不同,請參閱參數的後續程式代碼範例。

  3. 將動作新增至 Cube 集合,並更新 Cube。 動作不是可更新的物件。

測試動作需要不同的程式應用程式。 您可以在 Visual Studio 中測試您的動作。

下列範例程式代碼會從 Adventure Works Analysis Services 專案範例複寫三個不同的動作。 您可以區分動作,因為您使用下列範例所介紹的動作,從 “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 + " +  
        "\"&regn1=\" + " +  
        "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 物件需要下列步驟:

  1. 建立 Kpi 物件並填入基本屬性。

    以下是基本屬性的清單:描述、顯示資料夾、相關聯的量值群組和值。 顯示資料夾會告訴用戶端應用程式,用戶應該找到 KPI 的位置。 相關聯的量值群組會指出應該參考所有 MDX 計算的量值群組。 值會將效能指標的實際值顯示為 MDX 運算式。

  2. 定義 KPI 指標:目標、狀態和趨勢。

    指標是應在 -1 到 1 之間評估的 MDX 運算式,但是瀏覽應用程式,定義指標的值範圍。

  3. 當您流覽 KPI 時,小於 -1 的值會視為 -1,且大於 1 的值會視為 1。

  4. 定義圖形影像。

    圖形影像是字串值,在用戶端應用程式中用來識別要顯示的正確影像集。 圖形影像字串也會定義顯示函式的行為。 範圍通常會分割成奇數狀態、從壞到良好,以及從集合指派映射的每個狀態。

    如果您使用 Visual Studio 來流覽 KPI,則視名稱而定,指標範圍會分割成三種狀態或五種狀態。 此外,有名稱會反轉範圍,也就是 -1 為「良好」,1 則為「壞」。 在 Visual Studio 中,範圍內的三個狀態如下所示:

    • Bad = -1 為 -0.5

    • OK = -0.4999 至 -0.4999

    • Good = 0.50 至 1

    在 Visual Studio 中,範圍內的五個狀態如下所示:

    • Bad = -1 至 -0.75

    • Risk = -0.7499 至 -0.25

    • OK = -0.2499 至 0.2499

    • 引發 = 0.25 至 0.7499

    • Good = 0.75 至 1

下表列出與映像相關聯的使用方式、名稱及狀態數目。

影像使用方式 映射名稱 狀態數目
地位 形狀 3
地位 交通燈 3
地位 路標 3
地位 軌距 3
地位 反向量測計 5
地位 溫度計 3
地位 圓柱體 3
地位 面臨 3
地位 變異數箭號 3
趨勢 標準箭號 3
趨勢 狀態箭號 3
趨勢 反轉狀態箭號 5
趨勢 面臨 3
  1. 將 KPI 新增至 Cube 集合並更新 Cube,因為 KPI 不是可更新的物件。

測試 KPI 需要不同的程式應用程式。 您可以在 Visual Studio 中測試 KPI。

下列範例程式代碼會在 Adventure Works Analysis Services 專案範例中包含的 Adventure Works Cube 的 「財務 Perpective/Grow Revenue」資料夾中建立 KPI。

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 物件

Perspective 物件可由 AMO 定義,但會從瀏覽資料的用戶端應用程式使用。

建立 Perspective 物件需要下列步驟:

  1. 建立 Perspective 物件並填入基本屬性。

    以下是基本屬性的清單:名稱、預設量值、描述和批注。

  2. 從用戶應該看到的父 Cube 新增所有物件。

    新增 Cube 維度(屬性和階層)、量值群組(量值和量值群組)、動作、KPI 和計算。

  3. 將檢視方塊新增至 Cube 集合並更新 Cube,因為檢視方塊不是可更新的物件。

測試檢視方塊需要不同的程式應用程式。

下列程式代碼範例會為提供的 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 物件需要下列步驟:

  1. 建立 ProactiveCaching 物件。

    沒有要定義的基本屬性。

  2. 新增快取規格。

規範 描述
AggregationStorage 匯總的記憶體類型。

僅適用於分割區。 在維度上,它必須 一般。
SilenceInterval 快取在 MOLAP 映像啟動之前存在的時間下限。
延遲 最早通知與 MOLAP 影像終結的時間量。
SilenceOverrideInterval 初始通知之後的時間,MOLAP 成像會無條件啟動。
ForceRebuildInterval 時間(從新的 MOLAP 映像卸除後開始)之後,MOLAP 映射會無條件啟動(沒有通知)。
OnlineMode 當 MOLAP 映像可用時。

可以是 即時OnCacheComplete
  1. ProactiveCaching 物件新增至父集合。 您必須更新父代,因為 ProactiveCaching 不是可更新的物件。

下列程式代碼範例會在指定資料庫中 Adventure Works Cube 中 Internet Sales 量值群組的所有分割區中建立 ProactiveCaching 物件。

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 定義,但會從瀏覽資料的用戶端應用程式使用。 翻譯對像是程式代碼的簡單物件。 對象標題的翻譯是由地區設定標識符和翻譯標題的配對所提供。 針對任何標題,可以啟用多個翻譯。 大部分的物件都可以提供翻譯,例如維度、屬性、階層、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);  
  
}