News combit Dev Blog

Schöner Filtern mit parametrisierbaren Datenquellen

Veröffentlicht: Montag, 30. April 2018 | 0 Kommentar(e)
 
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}}




Autor: Jochen Bartlau
Entwicklungsleiter List & Label

Jochen Bartlau leitet als Geschäftsführer die Softwareentwicklung bei combit. Microsoft .NET und Agiles Projektmanagement sind zwei seiner Steckenpferde. Der technikbegeisterte Physiker verbringt seine Freizeit am liebsten mit seiner Familie.


  


Kommentare


Aktuell gibt es noch keine Kommentare zu diesem Blogbeitrag.

Ergänzen Sie hier Ihren Kommentar
 
 
 
 
 

Lassen Sie sich über neue Kommentare zu diesem Blogbeitrag informieren


 
RSS
combit Dev BlogRSS
combit Entwicklerblog
Hier teilen wir Informationen über die Entwicklung unserer Softwareprodukte. Außerdem: Allgemeines über die Softwareindustrie.
Archiv
November 2018 (2)
Oktober 2018 (4)
September 2018 (4)
August 2018 (2)
Juli 2018 (2)
Juni 2018 (2)
Mai 2018 (1)
April 2018 (1)
März 2018 (1)
Februar 2018 (2)
Januar 2018 (1)
Dezember 2017 (1)
November 2017 (2)
Oktober 2017 (3)
September 2017 (3)
August 2017 (2)
Juli 2017 (2)
Juni 2017 (1)
Mai 2017 (2)
April 2017 (1)
März 2017 (1)
Ältere Blogposts
Einträge aus dem Zeitraum von März 2014 bis Februar 2017 finden Sie in unserem englischsprachigen Blog.
+49 (0) 7531 90 60 10