Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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:
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.
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.
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 + " +
"\"®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-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:
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.
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.
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.
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 |
- 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:
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.
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.
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:
Erstellen Sie das ProactiveCaching Objekt.
Es gibt keine grundlegenden Attribute, die definiert werden müssen.
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. |
- 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);
}