Freigeben über


Programmieren erweiterter AMO OLAP-Objekte

gilt für: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium

In diesem Thema werden die Programmierdetails von erweiterten OLAP-Objekten (Analysis Management Objects, AMO) erläutert.

Action-Objekte

Aktionsklassen werden verwendet, um beim Durchsuchen bestimmter Bereiche des Cubes eine aktive Antwort zu erstellen. Aktionsobjekte können mithilfe von AMO definiert werden, werden jedoch von der Clientanwendung verwendet, die die Daten durchsucht. Aktionen können unterschiedlich sein und müssen entsprechend ihrer Art erstellt werden. Aktionen können folgendes sein:

  • Drillthroughaktionen, die den Satz von Zeilen zurückgeben, die die zugrunde liegenden Daten der ausgewählten Zellen des Cubes darstellen, in denen die Aktion auftritt.

  • Berichtsaktionen, die einen Bericht zurückgeben, der dem ausgewählten Abschnitt des Cubes zugeordnet ist, in dem die Aktion auftritt.

  • Standardaktionen, die das Aktionselement (URL, HTML, DataSet, RowSet und andere Elemente) zurückgeben, die dem ausgewählten Abschnitt des Cubes zugeordnet sind, in dem die Aktion auftritt.

Zum Erstellen eines Aktionsobjekts sind die folgenden Schritte erforderlich:

  1. Erstellen Sie das abgeleitete Aktionsobjekt, und füllen Sie grundlegende Attribute auf.

    Im Folgenden sind die grundlegenden Attribute aufgeführt: Typ der Aktion, des Zieltyps oder des Abschnitts des Cubes, des Ziels oder eines bestimmten Bereichs des Cubes, in dem die Aktion verfügbar ist, Beschriftung und der Ort, an dem die Beschriftung ein MDX-Ausdruck ist.

  2. Füllen Sie die spezifischen Attribute des Aktionstyps auf.

    Attribute sind für die drei Arten von Aktionen unterschiedlich, siehe Codebeispiel, das für Parameter folgt.

  3. Fügen Sie der Cubesammlung die Aktion hinzu, und aktualisieren Sie den Cube. Die Aktion ist kein aktualisierbares Objekt.

Das Testen der Aktion erfordert eine andere Programmanwendung. Sie können Ihre Aktion in Visual Studio testen.

Der folgende Beispielcode repliziert drei verschiedene Aktionen aus dem Adventure Works Analysis Services-Projektbeispiel. Sie können die Aktionen unterscheiden, da die Aktionen, die Sie mithilfe des folgenden Beispiels einführen, mit "Mein" beginnen.

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-Objekte

Ein Key Performance Indicator (KPI) ist eine Sammlung von Berechnungen, die einer Maßgruppe in einem Würfel zugeordnet sind und zur Auswertung des Geschäftserfolgs verwendet werden. Kpi Objekte können von AMO definiert werden, werden jedoch von der Clientanwendung verwendet, die die Daten durchsucht.

Zum Erstellen eines Kpi Objekts sind die folgenden Schritte erforderlich:

  1. Erstellen Sie das Kpi Objekt, und füllen Sie die grundlegenden Attribute auf.

    Es folgt eine Liste der grundlegenden Attribute: Beschreibung, Anzeigeordner, zugeordnete Messgruppe und Wert. Der Anzeigeordner teilt der Clientanwendung mit, wo sich der KPI befindet, damit der Endbenutzer ihn finden kann. Die zugeordnete Maßgruppe gibt die Maßgruppe an, auf die bei allen MDX-Berechnungen verwiesen werden soll. Der Wert zeigt den tatsächlichen Wert des Leistungsindikators als MDX-Ausdruck an.

  2. KPI-Indikatoren definieren: Ziel, Status und Trend.

    Indikatoren sind MDX-Ausdrücke, die zwischen -1 und 1 ausgewertet werden sollen. Die Browsing-Anwendung definiert den Wertebereich für die Indikatoren.

  3. Wenn Sie KPIs durchsuchen, werden Werte, die kleiner als -1, als -1 behandelt, und Werte, die größer als 1 sind, werden als 1 behandelt.

  4. Definieren Sie Grafiken.

    Grafikbilder sind Zeichenfolgenwerte, die als Verweis in der Clientanwendung verwendet werden, um den richtigen Satz anzuzeigender Bilder zu identifizieren. Die Grafikbildzeichenfolge definiert auch das Verhalten der Anzeigefunktion. In der Regel wird der Bereich in einer ungeraden Anzahl von Zuständen aufgeteilt, von schlecht bis gut, und jedem Zustand wird ein Bild aus der Menge zugewiesen.

    Wenn Sie Visual Studio verwenden, um Ihre KPIs zu durchsuchen, wird der Indikatorbereich je nach Namen in drei oder fünf Zustände unterteilt. Darüber hinaus gibt es Namen, bei denen der Bereich invertiert ist, d. h. -1 "Gut" ist und 1 "Schlecht" ist. In Visual Studio gibt es drei Zustände innerhalb des Bereichs, die folgendermaßen sind:

    • Ungültig = -1 bis -0,5

    • OK = -0,4999 bis -0,4999

    • Gut = 0,50 bis 1

    In Visual Studio lauten fünf Zustände innerhalb des Bereichs wie folgt:

    • Schlecht = -1 bis -0,75

    • Risiko = -0,7499 bis -0,25

    • OK = -0,2499 bis 0,2499

    • Erhöhung = 0,25 auf 0,7499

    • Gut = 0,75 bis 1

In der folgenden Tabelle sind die Verwendung, der Name und die Anzahl der Zustände aufgeführt, die dem Bild zugeordnet sind.

Bildnutzung Bildname Anzahl der Staaten
Der Status Shapes 3
Der Status Ampel 3
Der Status Verkehrszeichen 3
Der Status Messgerät 3
Der Status Umgekehrtes Messgerät 5
Der Status Thermometer 3
Der Status Zylinder 3
Der Status Faces 3
Der Status Varianzpfeil 3
Tendenz Standardpfeil 3
Tendenz Statuspfeil 3
Tendenz Umgekehrter Statuspfeil 5
Tendenz Faces 3
  1. Fügen Sie den KPI zur Cubeauflistung hinzu, und aktualisieren Sie den Cube, da der KPI kein aktualisierbares Objekt ist.

Zum Testen des KPI ist eine andere Programmanwendung erforderlich. Sie können Ihren KPI in Visual Studio testen.

Der folgende Beispielcode erstellt einen KPI im Ordner "Financial Perpective/Grow Revenue" für den Adventure Works-Cube, der im Adventure Works Analysis Services-Projektbeispiel enthalten ist.

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";  
}.  

Perspektivische Objekte

Perspective Objekte können von AMO definiert werden, werden jedoch von der Clientanwendung verwendet, die die Daten durchsucht.

Zum Erstellen eines Perspective Objekts sind die folgenden Schritte erforderlich:

  1. Erstellen Sie das Perspective Objekt, und füllen Sie die grundlegenden Attribute auf.

    Es folgt eine Liste mit grundlegenden Attributen: Name, Standardmaß, Beschreibung und Anmerkungen.

  2. Fügen Sie alle Objekte aus dem übergeordneten Cube hinzu, die vom Endbenutzer angezeigt werden sollen.

    Fügen Sie Cubedimensionen (Attribute und Hierarchien), Maßgruppen (Maß und Maßgruppe), Aktionen, KPIs und Berechnungen hinzu.

  3. Fügen Sie der Cubekollektion die Perspektive hinzu und aktualisieren Sie den Würfel, weil eine Perspektive kein aktualisierbares Objekt ist.

Das Testen der Perspektive erfordert eine andere Programmanwendung.

Im folgenden Codebeispiel wird eine Perspektive namens "Direct Sales" für den bereitgestellten Cube erstellt.

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();  
}  

ProaktiveCaching-Objekte

ProactiveCaching Objekte können von AMO definiert werden.

Zum Erstellen eines ProactiveCaching Objekts sind die folgenden Schritte erforderlich:

  1. Erstellen Sie das ProactiveCaching Objekt.

    Es gibt keine grundlegenden Attribute, die definiert werden müssen.

  2. Fügen Sie Cachespezifikationen hinzu.

Specification Description
Aggregationsspeicher Der Speichertyp für Aggregationen.

Gilt nur für die Partition. Bei der Dimension muss es Regular. sein.
Stilleintervall Die minimale Zeitspanne, während der der Cache besteht, bevor die MOLAP-Imageerstellung beginnt.
Latenz Die Zeitspanne zwischen der frühesten Benachrichtigung und dem Zeitpunkt, in dem die MOLAP-Bilder zerstört werden.
SilenceOverrideIntervall Die Zeit nach einer ersten Benachrichtigung, nach der die MOLAP-Imageerstellung bedingungslos gestartet wird.
ForceRebuildInterval Die Zeit (beginnend nach dem Löschen eines neuen MOLAP-Bilds), nach der die MOLAP-Imageerstellung bedingungslos beginnt (keine Benachrichtigungen).
Online-Modus Wenn das MOLAP-Bild verfügbar ist.

Kann Sofort oder OnCacheComplete sein.
  1. Fügen Sie das ProactiveCaching-Objekt der übergeordneten Sammlung hinzu. Sie müssen das übergeordnete Objekt aktualisieren, da ProactiveCaching kein aktualisierbares Objekt ist.

Im folgenden Codebeispiel wird ein ProactiveCaching Objekt in allen Partitionen der Maßgruppe "Internet Sales" im Adventure Works-Cube in einer angegebenen Datenbank erstellt.

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();  
        }  
    }  
}  

Übersetzungsobjekte

Übersetzungsobjekte können von AMO definiert werden, werden jedoch von der Clientanwendung verwendet, die die Daten durchsucht. Übersetzungsobjekte sind einfache Objekte für Code. Übersetzungen für Objektbeschriftungen werden durch Paare aus Gebietsschema-Identifier und übersetzter Beschriftung bereitgestellt. Für jede Beschriftung können mehrere Übersetzungen aktiviert werden. Übersetzungen können für die meisten Objekte bereitgestellt werden, wie z. B. Dimensionen, Attribute, Hierarchien, Würfel, Messgruppen, Messungen und andere.

Im folgenden Codebeispiel wird eine spanische Übersetzung für den Namen des Attributs "Produktname" bereitgestellt.

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);  
  
}