Automatisiert Adressen in Geo-Daten umwandeln und die Entfernung zu einem Standort berechnen

WeltkugelImmer wieder habe ich das Problem, dass ich haufenweise Adressen habe und diese bspw. in einem Report (Reporting Services) verarbeiten muss. D.h. ich brauche Geo-Daten und will diese natürlich nicht Datensatz für Datensatz in Längen- und Breitengrad übersetzen. In diesem Artikel will ich kurz beschreiben, wie eine CSV Datei mit Adressen automatisch mit den Google Webdiensten in Längen- und Breitengrad übersetzt wird und diese Daten dann im SQL Server wiederverwendet werden können.

Beispiel: Eine CSV Datei mit verschiedenen Imbiss Buden aus Koblenz (via den Gelben Seiten abgefragt):

2014-06-21_15-17-21

Via PHP wurde nun die Datei zeilenweise ausgelesen und die Adresse wurde an Google gesendet:2014-06-21_15-20-19

Die Ausgabe des Scripts ergibt folgendes:2014-06-21_15-22-20

Diese Daten können nun super per SSIS in die Datenbank eingelesen werden – natürlich kann man auch gleich die Daten in den SQL Server, bzw. die Datenbank schreiben. Die Tabelle dazu:
2014-06-21_15-24-48

Und nun brauchen wir noch eine Tabelle wo wir unseren eigenen Standort reinschreiben:
2014-06-21_15-25-29

Nun haben wir eine Tabelle in der die Adressen sind und auch eine Tabelle wo unser Standort enthalten ist. Über je ein Update Statement lassen wir gleich das GEO-Feld in den beiden Tabellen füllen (aus Längen- und Breitengrad) und über die STDistance Funktion können wir dann die jeweilige Entfernung zwischen dem Standort und der jeweiligen Adresse finden – so finden wir den nächsten Imbiss :-)

UPDATE dbo.Orte SET geo = GEOGRAPHY::STPointFromText(‚POINT(‚ + CONVERT(VARCHAR, laengengrad) + ‚ ‚ + CONVERT(VARCHAR, breitengrad) + ‚)‘,4326)

UPDATE meinStandort SET geo = GEOGRAPHY::STPointFromText(‚POINT(‚ + CONVERT(VARCHAR, laengengrad) + ‚ ‚ + CONVERT(VARCHAR, breitengrad) + ‚)‘,4326)

SELECT name, orte.adresse, orte.geo.STDistance(ms.geo) As [Entfernung In Meter] FROM dbo.Orte CROSS JOIN meinStandort ms

Reporting Services: Weitergabe von „Multi Value“-Parametern

Immer wieder kommt es vor, dass man Parameter von einem Bericht an den anderen weitergeben möchte. Bei einem Parameter der lediglich einen Wert aufnimmt, ist das ziemlich simpel. Was aber, wenn der Parameter mehrere Werte (Multi Value Parameter) aufnehmen kann und auch alle diese Werte an einen weiteren Bericht weitergegeben werden sollen?

Hier die Lösung:

Ausgangslage ist ein Bericht, der 4 verschiedene Werte als Multi Value Parameter aufnehmen kann und diese im Bericht darstellt.

Dieser Parameter nutzt ein Dataset für die verfügbaren Werte:
2014-05-02_20-42-39

 

2014-05-02_20-42-55
Ergebnis:
2014-05-02_20-47-32

 

 

 

 

 

Die Ausgabe ist folgendermaßen realisiert.2014-05-02_20-47-51

Der Text hier wird verlinkt auf einen weiteren Bericht der das gleiche Dataset nutzt. Hier wird erwartet, dass der übergebene Parameter die Werte vor ausfüllt und aufnimmt, die vom aufrufenden Bericht übergeben werden. Also das hier in diesem Beispiel die Werte für Nord, Süd, Ost und West übergeben werden.

Das Textfeld für die Ausgabe wird nun verlinkt auf den anderen Bericht:
2014-05-02_20-52-00

Als Ausdruck für den Parameter ist folgender Code notwendig:

2014-05-02_20-52-52Nun werden die entsprechenden Werte aus dem Multi Value Parameter an den Unterbericht weitergegeben. An dem Unterbericht muss nicht geändert werden, lediglich muss er den Parameter aufnehmen und auch als Multi Value Parameter definiert werden.

SSRS: Dokument-Fußzeile nur auf der ersten Seite darstellen

Innerhalb von Reporting Services ist es nur möglich, einen Seitenkopf und Seitenfuß zu einzurichten, die auf jeder Seite innerhalb des Berichts dargestellt werden. Bspw. in MS Word kann dies auch pro Dokument eingestellt werden, indem bspw. die Fußzeile nur im Ersten Blatt des Dokuments dargestellt wird. Um dies auch in SSRS zu erreichen, sind folgende Schritte notwendig:
1. Legen Sie einen Seitenfuß an (Bericht -> Seitenfuß hinzufügen)
2. Erstellen Sie im Seitenfuß ein Rechteck über die Toolbox
3. Wechseln Sie in die Eigenschaften des Rechtecks und auf die Seite Sichtbarkeit:

 

 

 

 

 

 

 

 

 

 

 

und ergänzen Sie den Ausdruck wie oben dargestellt.

Nun wird immer geprüft, ob die aktuelle Seitennummer der ersten Seite entspricht, wenn dies Wahr ergibt, wird der Dokumenten-Fuß angezeigt.

SSRS: Berechnungen innerhalb eines Tablix mit der vorherigen Zeile

Um innerhalb einer Tabelle (Tablix) mit der vorherigen Zeile zu rechnen, kann die Funktion Previous() genutzt werden. Diese liefert die Daten aus der vorherigen Zeile zurück:

=Fields!Umsatz.Value-Previous(Fields!Umsatz.Value)

Ergebnis:

Um nun jedoch diese Daten als Prozentwert für einen Indikator wiederverwenden zu können (Darstellung eines Trends), darf jedoch die Funktion Pervious() nicht mehr eingesetzt werden, da diese bereits eine Aggregat-Funktion beinhaltet. Dafür ist es dann notwendig, dass die Daten pro Zeile erstmal zwischengespeichert werden. Das kann über eigenen Code innerhalb der RDL erreicht werden:

Nun kann einerseits in der Tabelle die prozentuale Veränderung dargestellt werden

=code.ZeigeProzentualeVeraenderung(Fields!Umsatz.Value, Previous(Fields!Umsatz.Value))

und diese Daten können nun in einem Indikator verwendet werden:

Ergebnis: