Freigeben über


Programmieren von erweiterten AMO OLAP-Objekten

In diesem Thema werden die Programmierdetails von erweiterten OLAP-Objekten in Analysis Management Objects (AMO) erläutert. Dieses Thema enthält folgende Abschnitte:

  • Aktionsobjekte

  • KPI-Objekte

  • Perspective-Objekte

  • ProactiveCaching-Objekte

  • Übersetzungsobjekte

Aktionsobjekte

Aktionsklassen werden verwendet, um beim Durchsuchen von bestimmten Bereichen des Cubes eine aktive Antwort zu erstellen. Aktionsobjekte können mithilfe von AMO definiert werden, sie werden jedoch von der Clientanwendung verwendet, die die Daten durchsucht. Aktionen können von anderen Typen sein, und sie müssen entsprechend ihrem Typ erstellt werden. Folgende Aktionen stehen zur Verfügung:

  • Drillthroughaktionen geben die Zeilen zurück, die die zugrunde liegenden Daten der ausgewählten Zellen des Cubes darstellen, in dem die Aktion ausgeführt wird.

  • Berichtsaktionen geben einen Bericht von Reporting Services zurück, der mit dem ausgewählten Abschnitt des Cubes verbunden ist, in dem die Aktion ausgeführt wird.

  • Standardaktionen geben das Aktionselement zurück (URL, HTML, DataSet, RowSet und sonstige Elemente), das mit dem ausgewählten Abschnitt des Cubes verbunden ist, in dem die Aktion ausgeführt wird.

Für die Erstellung eines Aktionsobjekts sind folgende Schritte erforderlich:

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

    Folgende grundlegende Attribute stehen zur Verfügung: Typ der Aktion, Zieltyp oder Abschnitt des Cubes, Ziel oder spezifischer Bereich des Cubes, in dem die Aktion verfügbar ist, Beschriftung und Beschriftung als MDX-Ausdruck.

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

    Die Attribute unterscheiden sich für die drei Aktionstypen, weitere Informationen zu Parametern finden Sie im folgenden Codebeispiel.

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

Für den Test der Aktion ist eine andere Programmanwendung erforderlich. Sie können Ihre Aktion in Business Intelligence Development Studio testen. Zunächst müssen Sie Reporting Services-Beispiele installieren, weitere Informationen finden Sie unter Processing Analysis Services Objects.

Der folgende Beispielcode repliziert drei unterschiedliche Aktionen aus dem AdventureWorks Analysis Services-Projektbeispiel. Weitere Informationen zum Installieren von Beispielen finden Sie unter AdventureWorks Sample Databases. Sie können die Aktionen unterscheiden, da die von Ihnen anhand des folgenden Beispiels eingeführten mit „My“ 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 Auflistung von Berechnungen, die einer Measuregruppe in einem Cube zugeordnet ist und für die Berechnung des Geschäftserfolgs verwendet wird. Kpi-Objekte können mithilfe von AMO definiert werden, sie werden jedoch von der Clientanwendung verwendet, die die Daten durchsucht.

Für die Erstellung eines Kpi-Objekts sind folgende Schritte erforderlich:

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

    Folgende grundlegende Attribute stehen zur Verfügung: Beschreibung, Anzeigeordner, zugeordnete Measuregruppe und Wert. Der Anzeigeordner teilt der Clientanwendung mit, wo sich der KPI befindet, damit er vom Endbenutzer gefunden werden kann. Die zugeordnete Measuregruppe gibt die Measuregruppe an, auf die sich alle MDX-Berechnungen beziehen. Der Wert zeigt den tatsächlichen Wert des Performance Indicators als MDX-Ausdruck an.

  2. Definieren des KPI-Indikators: Ziel, Status und Trend.

    Indikatoren sind MDX-Ausdrücke, die zu einem Wert zwischen -1 und 1 ausgewertet werden sollten. Der Wertebereich für die Indikatoren wird jedoch von der durchsuchenden Anwendung definiert.

  3. Beim Durchsuchen von KPIs in Business Intelligence Development Studio werden Werte kleiner als -1 wie -1 und Werte größer als 1 wie 1 behandelt.

  4. Definieren Sie Grafiken.

    Grafiken sind Zeichenfolgenwerte, die in der Clientanwendung als Referenz verwendet werden, um den richtige Satz von Bildern für die Anzeige zu identifizieren. Die Grafikzeichenfolge definiert auch das Verhalten der Anzeigefunktion. Normalerweise wird der Bereich in eine ungerade Anzahl von Status aufgeteilt, von ungültig bis gut, und jedem Status wird ein Bild aus dem Satz zugeordnet.

    Wenn Sie zum Durchsuchen Ihrer KPIs Business Intelligence Development Studio verwenden, wird der Indikatorbereich in Abhängigkeit von den Namen in drei oder fünf Status aufgeteilt. Zudem gibt es Namen, bei denen sich die Bereiche umkehren, d. h., -1 ist „Gut“, und 1 ist „Ungültig“. In Business Intelligence Development Studio werden die drei Status folgendermaßen bezeichnet:

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

    • OK = -0,4999 bis 0,4999

    • Gut = 0,50 bis 1

    In Business Intelligence Development Studio werden die fünf Status folgendermaßen bezeichnet:

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

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

    • OK = -0,2499 bis 0,2499

    • Steigend = 0,25 bis 0,7499

    • Gut = 0,75 bis 1

In der folgenden Tabelle werden die Verwendung, der Name und die Anzahl von Status aufgeführt, die dem Bild zugeordnet sind.

Verwendung des Bilds

Name des Bilds

Anzahl von Status

Status

Formen

3

Status

Verkehrsampel

3

Status

Straßenschilder

3

Status

Maßstab

3

Status

Umgekehrter Maßstab

5

Status

Thermometer

3

Status

Zylinder

3

Status

Gesichter

3

Status

Varianzpfeil

3

Trend

Standardpfeil

3

Trend

Statuspfeil

3

Trend

Umgekehrter Statuspfeil

5

Trend

Gesichter

3

  1. Fügen Sie den KPI der Cubeauflistung hinzu, und aktualisieren Sie den Cube, da der KPI kein aktualisierbares Objekt ist.

Für den Test der KPI ist eine andere Programmanwendung erforderlich. Sie können Ihren KPI in Business Intelligence Development Studio testen.

Der folgende Beispielcode erstellt einen KPI im Ordner „Financial Perpective/Grow Revenue“ für den Cube AdventureWorks, der im AdventureWorks Analysis Services-Projektbeispiel enthalten ist. Weitere Informationen zum Installieren von Beispielen finden Sie unter 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-Objekte

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

Für die Erstellung eines Perspective-Objekts sind folgende Schritte erforderlich:

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

    Folgende grundlegende Attribute stehen zur Verfügung: Name, Standardmeasure, Beschreibung und Anmerkungen.

  2. Fügen Sie alle Objekte aus dem übergeordneten Cube hinzu, die für den Endbenutzer sichtbar sein sollen.

    Fügen Sie Cubedimensionen (Attribute und Hierarchien), Measuregruppen (Measure und Measuregruppe), Aktionen, KPIs und Berechnungen hinzu.

  3. Fügen Sie die Perspektive der Cubeauflistung hinzu, und aktualisieren Sie den Cube, da die Perspektive kein aktualisierbares Objekt ist.

Für den Test der Perspektive ist eine andere Programmanwendung erforderlich. Sie können Ihre Perspektive in Business Intelligence Development Studio testen.

Das folgende Codebeispiel erstellt eine Perspektive mit dem Namen „Direct Sales“ für den bereitgestellten Cube.

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

ProactiveCaching-Objekte können mithilfe von AMO definiert werden.

Für die Erstellung eines ProactiveCaching-Objekts sind folgende Schritte erforderlich:

  1. Erstellen Sie das ProactiveCaching-Objekt.

    Es müssen keine grundlegenden Attribute definiert werden.

  2. Fügen Sie Cachespezifikationen hinzu.

Spezifikation

Beschreibung

AggregationStorage

Der Speichertyp für Aggregationen.

Gilt nur für Partitionen. Für Dimensionen muss Regular. verwendet werden.

SilenceInterval

Minimale Zeit, die der Cache vorhanden ist, bevor das MOLAP-Imaging beginnt.

Latenzzeit

Die Zeit zwischen der frühesten Benachrichtigung und dem Zeitpunkt, an dem die MOLAP-Images zerstört werden.

SilenceOverrideInterval

Die Zeit nach einer ersten Benachrichtigung, nach der das MOLAP-Imaging unbedingt zum Einsatz kommt.

ForceRebuildInterval

Die Zeit (beginnend, nachdem ein neues MOLAP-Image gelöscht wurde), nach der MOLAP-Imaging unbedingt startet (ohne Benachrichtigung).

OnlineMode

Zeitpunkt, zu dem das MOLAP-Image verfügbar ist.

Dies kann entweder Immediate oder OnCacheComplete lauten.

  1. Fügen Sie das ProactiveCaching-Objekt der übergeordneten Auflistung hinzu. Sie müssen das übergeordnete Element aktualisieren, da ProactiveCaching kein aktualisierbares Objekt ist.

Das folgende Codebeispiel erstellt ein ProactiveCaching-Objekt in allen Partitionen der Measuregruppe „Internet Sales“ in der angegebenen Datenbank des Cubes „Adventure Works“.

        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 mithilfe von AMO definiert werden, sie werden jedoch von der Clientanwendung verwendet, die die Daten durchsucht. Übersetzungsobjekte sind einfach zu codierende Objekte. Übersetzungen für Objektbeschriftungen werden von Paaren von Gebietsschemabezeichnern und übersetzten Beschriftungen bereitgestellt. Für alle Beschriftungen können mehrere Übersetzungen aktiviert werden. Übersetzungen können für die meisten Analysis Services-Objekte bereitgestellt werden, beispielsweise für Dimensionen, Attribute, Hierarchien, Cubes, Measuregruppen, Measures usw.

Im folgenden Codebeispiel wird eine spanische Übersetzung für den Namen des Attributs „Product Name“ 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);

        }