Schöner Filtern mit parametrisierbaren Datenquellen

Die leistungsfähigen Filteroptionen von List & Label konnten bisher nicht für alle Datenquellen genutzt werden. Das liegt daran, dass es insbesondere bei webbasierten Datenquellen nicht möglich oder machbar ist, zuerst "alle" Daten zu erhalten und dann auf die gewünschte Teilmenge zu filtern. Die kommende Version 24 kommt mit einer leistungsstarken neuen Funktion, die genau dieses Problem löst: parametrisierbare Datenquellen. Sie ermöglichen die Kombination von Datenquellen-Parametern mit tatsächlichen Berichtsparametern im Designer.

Bisher konnten die Filteroptionen nicht verwendet werden für:

  • Webservices/REST APIs (über JsonDataProvider, XmlDataProvider und RestDataProvider)
  • Stored Procedures (für alle SQL-Datenbanken wie SQL Server, Oracle, PostgreSQL, …)
  • Excel-Tabellen (ExcelDataProvider)

Ein einfaches Beispiel: Für eine REST API, die Jobdaten im JSON-Format bereitstellt, kann der JsonDataProvider verwendet werden. Wichtige Filterkriterien (z. B. Kundennummer) müssen in der Regel in der URL des Webservices übertragen werden, da sonst zu viele Daten auf einmal übertragen würden (d. h. es würden die Bestelldaten aller Kunden übertragen werden).

Wenn die Aufträge für den Kunden mit der ID 123 gefiltert werden sollen, könnte die URL so aussehen:

http://example.net/api/customers/123/orders

Vor LL24 musste diese URL jedoch an den JsonDataProvider im Konstruktor übergeben werden:

JsonDataProvider orderData = new JsonDataProvider ("http://example.net/api/customers/123/orders");

Das Problem zeigt sich sofort: Die URL, die ursprünglich übergeben wurde, kann nachträglich nicht mehr geändert werden. Im Designer hätten Sie zwar die einmal geladenen Auftragsdaten des Kunden 123 weiter filtern können (z. B. über benutzerdefinierte Berichtsparameter), aber nie die Möglichkeit gehabt, in der Designer-Vorschau spontan zu den Auftragsdaten eines anderen Kunden (z. B. Kunde Nr. 456) zu wechseln.

Jetzt kommen die neuen parametrisierbaren Datenquellen ins Spiel: Sie ermöglichen die Kombination von Parametern für die Datenquellen selbst mit den eigentlichen Berichtsparametern im Designer. Noch besser, eine Datenquelle kann automatisch die Berichtsparameter erstellen, die für eine korrekte Verwendung erforderlich sind. Sie werden definiert, bevor der Designer überhaupt geöffnet oder ein Druckvorgang gestartet wird.

Für Datenprovider, die das neue Feature unterstützen, können variable Parameter in die zuvor festgelegten Optionen (z. B. die URL für den JsonDataProvider) eingefügt werden. Dies geschieht mit einer speziellen Syntax.

Beispiele


JSON
Als praktisches Beispiel für JSON zeigt die folgende URL den Wasserstand in Konstanz für die letzten 30 Tage:

http://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/KONSTANZ/W/measurements.json?start=P30D

Wenn Sie eine flexiblere Datenquelle wünschen, die verschiedene Stationen entlang des Rheins bietet, können Sie einfach diese URL nutzen:

http://www.pegelonline.wsv.de/webservices/rest-api/v2/stations/{{City=KONSTANZ|choices=KONSTANZ,BONN,KOBLENZ|multiselect=false}}/W/measurements.json?start=P{{ViewDays=30|choices=10,20,30|multiselect=false}}D

Dabei werden einige der unten aufgeführten erweiterten Optionen verwendet, um verschiedene Optionen für die Parameter anzubieten. 

So sieht das Ergebnis im HTML5-Viewer aus:

In der Desktop-Vorschau:

SQL
Für eine gespeicherte SQL-Abfrage sollte die Client-ID als Parameter übergeben werden, um deren Daten zu erhalten. Bisher gab es keine Möglichkeit, die Daten eines Mandanten mit einer anderen ID im Designer oder für den Drilldown (falls gewünscht) aufzurufen. Die Werte der Parameter-Eigenschaft von DbCommands können nun unsere Datenquellen-Parameter aufnehmen:

getOrdersCommand.parameter[0].Value = "{{ClientId=ABC}}""

Ein vollständiges Beispiel für eine Access-Datenbank wäre Folgendes:

OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + _databasePath);
conn.Open();
OleDbCommand cmd = new OleDbCommand("SELECT * FROM Customers Where Customers.Country=?", conn);
OleDbParameter param = new OleDbParameter("Country", OleDbType.VarChar, 50);
param.Value = "{{Country=Germany|choicesfield=Customers.Country}}";
cmd.Parameters.Add(param);

OleDbCommand cmd2 = new OleDbCommand("SELECT Customers.Country FROM Customers", conn);

DbCommandSetDataProvider prov = new DbCommandSetDataProvider();
prov.AddCommand(cmd, "CustomersFiltered", "[{0}]", null);
prov.AddCommand(cmd2, "Customers", "[{0}]", null);
using (ListLabel LL = new ListLabel())
{
LL.DataSource = prov;
LL.AutoShowSelectFile = false;
LL.Design();
}

Excel
Wenn ein Benutzer für jedes Jahr (2016.xls, 2017.xls,….) eine eigene Excel-Datei mit Messergebnissen erstellt und die Daten über den XlsDataProvider auswerten möchte, gab es keine Möglichkeit, zwischen den Dateien für die verschiedenen Jahre in der Vorschau oder im Designer zu wechseln. Hier können Sie nun den Dateipfad parametrisieren:

var excelData = new XlsDataProvider(@"\\FileServer\RawData\{{Year=2018|choices=2016,2017,2018}}.xlsx", firstRowContainsColumnNames);

Erweiterte Optionen
Um Fehleingaben zu vermeiden, können Sie genauer definieren, welche Werte ein Datenquellen-Parameter erwartet. Diese „Spezifikation“ wird dann so genau wie möglich in die Einstellungen der generierten Berichtsparameter übernommen.

Anforderung Parameter-Option Beispiel
Nur numerische Werte erlauben {{CustomerID=123|format=number}}
Nur vordefinierte Werte erlauben {{Country=US|choices=US,CA,GB}}
Werte aus Datenquelle ermitteln {{Country=US|choicesfield=countries.code}}
Parameter ausblenden (nützlich für Drilldown) {{Country=US|hidden=true}}

Empfohlene Artikel

Schreibe einen Kommentar