Verwenden von kaskadierenden URL-Parametern in paginierten Berichten
Dieser Artikel richtet sich an Berichtsautoren, die paginierte Berichte in Power BI entwerfen. Der Artikel enthält einige Szenarien für den Entwurf von kaskadierenden Parametern. Bei kaskadierenden Parametern handelt es sich um Berichtsparameter mit Abhängigkeiten. Wenn ein Berichtsbenutzer einen Parameterwert auswählt, wird dieser Wert verwendet, um verfügbare Werte für einen anderen Parameter festzulegen.
Hinweis
Dieser Artikel bietet keine Einführung zu kaskadierenden Parametern und deren Konfiguration. Wenn Sie mit dem Konzept der kaskadierenden Parameter nicht vertraut sind, empfiehlt es sich, zuerst den Artikel Hinzufügen von kaskadierenden Parametern zu einem Bericht in Power BI Report Builder zu lesen.
Entwurfsszenarien
Für die Verwendung von kaskadierenden Parametern gibt es zwei Entwurfsszenarien. Diese können effektiv für Folgendes eingesetzt werden:
- Filtern großer Mengen an Elementen
- Präsentieren relevanter Elemente
Beispieldatenbank
Die Beispiele in diesem Artikel basieren auf einer Azure SQL-Datenbank. In der Datenbank werden Vertriebsvorgänge erfasst, und sie enthält verschiedene Tabellen mit Handelspartnern, Produkten und Verkaufsaufträgen.
Eine Tabelle namens Reseller speichert einen Datensatz für jeden Handelspartner und enthält mehrere Tausend Datensätze. Die Tabelle Reseller weist folgende Spalten auf:
- ResellerCode (Ganzzahl)
- ResellerName
- Country-Region
- State-Province
- Stadt
- PostalCode
Es gibt auch eine Tabelle namens Sales (Verkäufe). Diese Tabelle speichert Datensätze zu Verkaufsaufträgen und weist in der Spalte ResellerCode eine Fremdschlüsselbeziehung mit der Tabelle Reseller auf.
Beispielanforderung
Es gibt eine Anforderung, einen Bericht mit einem Handelspartnerprofil zu erstellen. Der Bericht muss so entworfen werden, dass er Informationen zu einem einzelnen Handelspartner anzeigt. Es ist nicht sinnvoll, dass Benutzer des Berichts einen Handelspartnercode eingeben, da Benutzer sich diesen selten merken.
Filtern großer Mengen an Elementen
Sehen wir uns in drei Beispielen an, wie sich große Mengen an verfügbaren Elementen – wie z. B. Handelspartner – eingrenzen lassen. Sie lauten wie folgt:
Filtern nach zugehörigen Spalten
In diesem Beispiel interagiert der Berichtsbenutzer mit fünf Berichtsparametern. Der Benutzer muss folgende Parameter auswählen: „Country-Region“, „State-Province“, „City“ und „Postal Code“. Ein letzter Parameter listet Handelspartner auf, die sich am entsprechenden geografischen Standort befinden.
So können Sie kaskadierende Parameter entwickeln:
Erstellen Sie die fünf Berichtsparameter, und ordnen Sie sie in der richtigen Reihenfolge an.
Erstellen Sie mit der folgenden Abfrageanweisung das Dataset CountryRegion, das verschiedene Country-Region-Werte abruft:
SELECT DISTINCT [Country-Region] FROM [Reseller] ORDER BY [Country-Region]
Erstellen Sie mit der folgenden Abfrageanweisung das Dataset StateProvince, das verschiedene State-Province-Werte für den ausgewählten Country-Region-Wert abruft:
SELECT DISTINCT [State-Province] FROM [Reseller] WHERE [Country-Region] = @CountryRegion ORDER BY [State-Province]
Erstellen Sie mit der folgenden Abfrageanweisung das Dataset City, das verschiedene City-Werte für die ausgewählten State-Province- und Country-Region-Werte abruft:
SELECT DISTINCT [City] FROM [Reseller] WHERE [Country-Region] = @CountryRegion AND [State-Province] = @StateProvince ORDER BY [City]
Setzen Sie dieses Muster fort, um das Dataset PostalCode zu erstellen.
Erstellen Sie mit der folgenden Abfrageanweisung das Dataset Reseller, um alle Handelspartner für die ausgewählten geografischen Werte abzurufen:
SELECT [ResellerCode], [ResellerName] FROM [Reseller] WHERE [Country-Region] = @CountryRegion AND [State-Province] = @StateProvince AND [City] = @City AND [PostalCode] = @PostalCode ORDER BY [ResellerName]
Ordnen Sie für jedes Dataset mit Ausnahme des ersten die Abfrageparameter den entsprechenden Berichtsparametern zu.
Hinweis
Alle Abfrageparameter (die als Präfix das Symbol „@“ aufweisen) in diesen Beispielen können in SELECT-Anweisungen eingebettet oder an gespeicherte Prozeduren übergeben werden.
Im Allgemeinen sind gespeicherte Prozeduren die bessere Wahl beim Entwurf. Der Grund hierfür ist, dass Abfragepläne für gespeicherte Prozeduren für eine schnellere Ausführung zwischengespeichert werden und dass gespeicherte Prozeduren bei Bedarf die Entwicklung einer ausgefeilteren Logik ermöglichen. Für relationale Datenquellen mit Gatewayzugriff wie SQL Server, Oracle und Teradata werden gespeicherte Prozeduren derzeit allerdings nicht unterstützt.
Schließlich sollten Sie immer sicherstellen, dass geeignete Indizes vorhanden sind, um einen effizienten Datenabruf zu unterstützen. Andernfalls kann es lange dauern, bis die Berichtsparameter aufgefüllt sind, und die Datenbank kann überlastet werden. Weitere Informationen zur Indizierung für SQL Server finden Sie im Leitfaden zur Architektur und zum Design von SQL Server-Indizes.
Filtern nach Gruppierungsspalte
In diesem Beispiel interagiert der Berichtsbenutzer mit einem Berichtsparameter, um den ersten Buchstaben eines Handelspartners auszuwählen. Ein zweiter Parameter listet dann die Handelspartner auf, deren Namen mit dem ausgewählten Buchstaben beginnen.
So können Sie kaskadierende Parameter entwickeln:
Erstellen Sie die Berichtsparameter ReportGroup und Reseller, und ordnen Sie sie in der richtigen Reihenfolge an.
Erstellen Sie mit der folgenden Abfrageanweisung das Dataset ReportGroup, um die ersten Buchstaben aller Handelspartner abzurufen:
SELECT DISTINCT LEFT([ResellerName], 1) AS [ReportGroup] FROM [Reseller] ORDER BY [ReportGroup]
Erstellen Sie mit der folgenden Abfrageanweisung das Dataset Reseller, um alle Handelspartner abzurufen, deren Namen mit dem ausgewählten Buchstaben beginnen:
SELECT [ResellerCode], [ResellerName] FROM [Reseller] WHERE LEFT([ResellerName], 1) = @ReportGroup ORDER BY [ResellerName]
Ordnen Sie den Abfrageparameter des Datasets Reseller dem entsprechenden Berichtsparameter zu.
Es ist effizienter, die Gruppierungsspalte der Tabelle Reseller hinzuzufügen. Wenn diese dauerhaft gespeichert und indiziert wird, liefert sie die besten Ergebnisse. Weitere Informationen finden Sie unter Specify Computed Columns in a Table.
ALTER TABLE [Reseller]
ADD [ReportGroup] AS LEFT([ResellerName], 1) PERSISTED
Diese Vorgehensweise kann ein noch größeres Potenzial bieten. Sehen Sie sich das folgende Skript an, das eine neue Gruppierungsspalte hinzufügt, mit der Handelspartner nach vordefinierten Buchstabenbereichen gefiltert werden können. Es erstellt auch einen Index, damit die von den Berichtsparametern benötigten Daten effizient abgerufen werden können.
ALTER TABLE [Reseller]
ADD [ReportGroup2] AS CASE
WHEN [ResellerName] LIKE '[A-C]%' THEN 'A-C'
WHEN [ResellerName] LIKE '[D-H]%' THEN 'D-H'
WHEN [ResellerName] LIKE '[I-M]%' THEN 'I-M'
WHEN [ResellerName] LIKE '[N-S]%' THEN 'N-S'
WHEN [ResellerName] LIKE '[T-Z]%' THEN 'T-Z'
ELSE '[Other]'
END PERSISTED
GO
CREATE NONCLUSTERED INDEX [Reseller_ReportGroup2]
ON [Reseller] ([ReportGroup2]) INCLUDE ([ResellerCode], [ResellerName])
GO
Filtern nach Suchmuster
In diesem Beispiel interagiert der Berichtsbenutzer mit einem Berichtsparameter, um ein Suchmuster einzugeben. Ein zweiter Parameter listet dann die Handelspartner auf, deren Namen das Suchmuster enthält.
So können Sie kaskadierende Parameter entwickeln:
Erstellen Sie die Berichtsparameter Search und Reseller, und ordnen Sie sie in der richtigen Reihenfolge an.
Erstellen Sie mit der folgenden Abfrageanweisung das Dataset Reseller, um alle Handelspartner abzurufen, deren Namen den Suchtext enthalten:
SELECT [ResellerCode], [ResellerName] FROM [Reseller] WHERE [ResellerName] LIKE '%' + @Search + '%' ORDER BY [ResellerName]
Ordnen Sie den Abfrageparameter des Datasets Reseller dem entsprechenden Berichtsparameter zu.
Tipp
Sie können dieses Design verbessern, um den Berichtsbenutzern eine bessere Steuerung zu bieten. Sie können es Benutzern ermöglichen, eigene Werte für den Musterabgleich zu definieren. Der Suchwert „red%“ beispielsweise filtert auf alle Handelspartner, deren Namen mit den Buchstaben „red“ beginnen.
Weitere Informationen finden Sie unter LIKE (Transact-SQL).
So können Sie es Berichtsbenutzern ermöglichen, eigene Muster zu definieren.
WHERE
[ResellerName] LIKE @Search
Benutzer, die sich nicht beruflich mit Datenbanken beschäftigen, kennen das Prozentzeichen (%) als Platzhalterzeichen häufig nicht. Sie sind eher mit dem Sternchen (*) vertraut. Durch Ändern der WHERE-Klausel können Sie es Benutzern ermöglichen, dieses Zeichen zu verwenden.
WHERE
[ResellerName] LIKE SUBSTITUTE(@Search, '%', '*')
Präsentieren relevanter Elemente
In diesem Szenario können Sie Faktendaten verwenden, um verfügbare Werte zu begrenzen. Berichtsbenutzern werden Elemente angezeigt, für die eine Aktivität aufgezeichnet wurde.
In diesem Beispiel interagiert der Berichtsbenutzer mit drei Berichtsparametern. Die ersten beiden legen einen Datumsbereich für Verkaufsauftragsdaten fest. Der dritte Parameter listet die Handelspartner auf, die in diesem Zeitraum Aufträge erstellt haben.
So können Sie kaskadierende Parameter entwickeln:
Erstellen Sie die Berichtsparameter OrderDateStart, OrderDateEnd und Reseller, und ordnen Sie sie in der richtigen Reihenfolge an.
Erstellen Sie mit der folgenden Abfrageanweisung das Dataset Reseller, um alle Handelspartner abzurufen, die in diesem Zeitraum Aufträge erstellt haben:
SELECT DISTINCT [r].[ResellerCode], [r].[ResellerName] FROM [Reseller] AS [r] INNER JOIN [Sales] AS [s] ON [s].[ResellerCode] = [r].[ResellerCode] WHERE [s].[OrderDate] >= @OrderDateStart AND [s].[OrderDate] < DATEADD(DAY, 1, @OrderDateEnd) ORDER BY [r].[ResellerName]
Empfehlungen
Es wird empfohlen, Berichte mit kaskadierenden Parametern zu entwerfen, wann immer dies möglich ist. Gründe:
- Diese Parameter bieten eine intuitive und nützliche Funktionalität für die Benutzer von Berichten.
- Sie sind effizient, weil sie kleinere Gruppen verfügbarer Werte abrufen.
Optimieren Sie Ihre Datenquellen mit folgenden Maßnahmen:
- Verwenden Sie nach Möglichkeit gespeicherte Prozeduren.
- Fügen Sie geeignete Indizes hinzu, um einen effizienten Datenabruf zu ermöglichen.
- Machen Sie Spaltenwerte – und sogar Zeilen – verfügbar, um kostspielige Auswertungen zur Abfragezeit zu vermeiden.
Zugehöriger Inhalt
Weitere Informationen zu diesem Artikel finden Sie in den folgenden Ressourcen: