SSRS: Inhaltsverzeichnis / Document Map

(english Version below)

Bisher hatte ich immer nur das Inhaltsverzeichnis in Reporting Services durch ein Tablix erstellt, bzw. lediglich verwendet. Durch die Eigenschaft „DocumentLabel“ kann man jedoch auch Textfelder in das Inhaltsverzeichnis mit aufnehmen. Wenn man dann auch noch einem Tablix eine DocumentMap hinzufügt, sollte man auch dem Tablix eine DocumentLabel Eigenschaft geben, diese gruppiert dann die Inhalte und ordnet das entsprechend:

26-07-_2015_16-10-102

 

 

 

 

English Version:
So far I had only the table of contents in Reporting Services created by a Tablix , or merely used . Through the property “ Document Label “ you can but also record text fields in the table of contents . If you then still a Tablix adds a DocumentMap , you should also give the Tablix a Document Label property , then grouped the contents and assigns the corresponding

SSRS: Summen aus anderen Gruppen erhalten

(see english Version below)

In diesem Szenario will ich aufzeigen, wie man in SQL Server Reporting Services die Summen aus andere Gruppen (über- wie auch untergeordnet) wiederverwenden kann, bspw. um Anteile berechnen zu können.
tablix2

Im diesem Screen sieht man ein Tablix welches Gruppiert nach Ort ist und die Kopfzeile bildet. Darunter ist nach einem Status gruppiert und die Summen zu der jeweiligen Gruppe werden ausgegeben sowie auch für die Kopfzeile (fett gedruckt).

Nun ist das Ziel, dass man anteilig ausrechnen kann, welchen Anteil der jeweilige Status an dem Ergebnis pro Ort hat.

 

 

 

 

Dafür kann man die SUM oder auch COUNT Funktion erweitern indem man den Gruppennamen aus dem Tablix mitgibt:

=SUM(Fields!Betrag.Value)/SUM(Fields!Betrag.Value, "Wohnort")

tablix1

Weitere Informationen gibt es hier: https://technet.microsoft.com/en-us/library/bb630415(v=sql.100).aspx

 

English Version

In this scenario, I will show how you can in SQL Server Reporting Services to reuse the totals from other groups (over like subordinate), eg. To calculate the shares.
In the following screen you can see a Tablix is that groups by location and forms the header. Among them is for a status groups and the totals for each group will be issued as well as for the header (in bold).

tablix2
Now, the goal is that you can calculate proportionally the share has the respective status of the earnings per site.
For this you can expand the SUM or COUNT function by mitgibt the group name from the Tablix:
= SUM (Fields! Betrag.Value) / SUM (Fields! Betrag.Value, Location“)

Further information is available here: https://technet.microsoft.com/en-us/library/bb630415(v=sql.100).aspx

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.

SQL Server 2008/R2 – out of Mainstream Support – vote here!

Microsoft-SQL-Server-2008-R2Der SQL Server 2008 und R2 laufen im Juli aus dem Mainstream Support raus, falls Microsoft hier kein Service Pack mehr ausliefert. Daher hoffe ich, dass hier genügend Stimmen zusammen kommen, damit hier je ein SP veröffentlicht wird und es so abschliessend nicht zu einer Sammlung von CU oder Hotfixen kommt.

Hier zur Wahl auf MS Connect: https://connect.microsoft.com/SQLServer/feedback/details/814658/release-final-service-packs-for-sql-server-2008-and-2008-r2

Markierte Transaktionen – Auf die Transaktion genaues zurückrollen!

Bei größeren Transakionen bietet es sich an, zu wissen wann und welche Aktion die Änderung in der Datenbank verursacht hat, um bei einem Restore der Datenbank mit entsprechenden Transaktions-Protokoll Sicherungen auch wieder auf genau diesen Zeitpunkt zurücksichern zu können. Besser als sich die Zeit zu notieren, ist es beim Ausführen einer Transaktion diese zu markieren. Dafür erhält die Transaktion einen Namen und kann dann bei einem Restore mit einem Haltepunkt angesteuert werden.

Hier das Beispiel:

  1. Zuerst brauchen wir wieder eine Datenbank mit Daten:
CREATE DATABASE markedtran
GO
USE markedtran
GO
CREATE TABLE dbo.test (id int not null primary key, test varchar(255) null);
go
insert into test (id, test) values (1, 'a');
insert into test (id, test) values (2, 'b');
insert into test (id, test) values (3, 'c');
insert into test (id, test) values (4, 'd');
insert into test (id, test) values (5, 'e');
GO
  • Danach sichern wir diese mit einer Vollsicherung, fügen erneut einen Datensatz ein (damit eine Änderung erfolgt) und sichern danach diese Änderung mit einer Transaktionslog Sicherung:
BACKUP DATABASE [markedtran] TO  DISK = N'C:\temp\markedtran.bak' WITH FORMAT, INIT,  NAME = N'markedtran-Vollständig Datenbank Sichern', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
INSERT INTO dbo.Test (id, test) VALUES(6, 'f');
GO
BACKUP LOG [markedtran] TO  DISK = N'C:\temp\markedtran.bak' WITH NOFORMAT, NOINIT,  NAME = N'markedtran-Transaktionsprotokoll  Sichern', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
  • Nun starten wir eine Transaktion, benennen diese, Aktualisieren entsprechene Datensätze mit einem Update und bestätigen diese Transaktion:
BEGIN TRANSACTION HierBinIch
WITH MARK 'Beginne die große Aktualisierung';
GO
UPDATE dbo.test SET test = 'd' WHERE id < 6
GO
COMMIT TRANSACTION HierBinIch
GO
  • Nun fügen wir nochmals einen Datensatz ein (nur um zu sehen, das nach einem Restore mit der nachfolgenden Transaktionslogsicherung dieser Datensatz dann nicht verfügbar ist, wenn nur bis zum markierten Punkt zurückgesichert wurde:
insert into test (id, test) values (9, 'z');
BACKUP LOG [markedtran] TO  DISK = N'C:\temp\markedtran.bak' WITH NOFORMAT, NOINIT,  NAME = N'markedtran-Transaktionsprotokoll  Sichern', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
  • Nun sichern wir die Vollsicherung zurück mit den beiden Transaktionslogsicherungen im Anschluss. Dabei wird dann der markierte Punkt als „Breakpoint“ angegeben:
RESTORE DATABASE [markedtran] FROM  DISK = N'C:\temp\markedtran.bak' WITH  FILE = 1,  NORECOVERY,  NOUNLOAD,  REPLACE,  STATS = 10
GO
RESTORE LOG [markedtran] FROM  DISK = N'C:\temp\markedtran.bak' WITH  FILE = 2, NORECOVERY, NOUNLOAD,  STATS = 10
GO
RESTORE LOG [markedtran] FROM  DISK = N'C:\temp\markedtran.bak' WITH  FILE = 3,  NOUNLOAD,  STATS = 10,  STOPBEFOREMARK = N'HierBinIch'
GO

Das war’s!