SSRS – Daten per PowerShell aus Report auslesen

Wenn man plötzlich vor der Herausforderung steht, Daten oder Werte aus einem Bericht der SQL Server Reporting Services (SSRS) auszulesen, gibt es eine interessante Möglichkeit über PowerShell. Man kann sich den entsprechenden Report einfach über die URL aufrufen, diesen so als XML speichern und dann über XPath die gewünschte Werte auslesen. Anschließend kann man die ausgelesenen Werte ganz einfach in einem Workflow weiterverarbeiten, in eine Währung umrechnen oder per E-Mail schicken.

Da das ganze nicht so trivial ist, hier eine kurze Anleitung um dir viel Zeit und Kopfzerbrechen zu ersparen! Als Beispiel nehme ich hier an, dass ich vom Kostenstellenbericht (Self Service Portal) die Gesamtsumme der Kosten auslesen will.

Auszulesendes Fehld des Reports

Kontrollieren, ob Feld in XML mit ausgegeben ist

Zuerst musst du mal prüfen, ob in der generierten XML des Berichts der entsprechende Wert überhaupt mit ausgegeben wird. Öffne den Report dafür einfach und generiere dir über die Symbolleiste die XML:

Report als XML speichern
XML ohne den gewünschten Wert

Vorsicht Falle: Hier sehen wir zwar ebenfalls 27 Euro als Cell Total, aber nicht die Zelle Gesamtsumme! Klar ist in diesem Fall natürlich egal, aber nächsten Monat vielleicht schon nicht mehr. Von daher müssen wir die Gesamtsummer zunächst als im Berichts-Generator als exportierbar kennzeichnen:

Report in Report-Builder bearbeiten

Wenn wir uns nun die XML erneut speichern und nochmals kontrollieren, sehen wir, dass das Feld Gesamtsumme nun im XML-Export enthalten ist:

Exportiere XML mit dem gewünschten Wert

PowerShell-Skript zum Auslesen des Wertes

Jetzt brauchen wir noch ein PowerShell-Skript, welches den Wert aus der XMl extrahiert und den Wert in Dezimal umrechnet. Zumindest brächten wir das Dezimal-Format, um anschließt im Workflow damit “vernünftig” weiterzuarbeiten.

#Variables
$urlWebportal = "http://srvwsm001:81/ReportServer"
$reportpath = "/M42/DE/Service Portal/kostenstellenrechnung"
$UserFragmentID = "bfecb19e-cc09-e511-d380-0050562f9516"
$UserCurrencyCode = "EUR"
$ReportParaCostCentersURL = "&CostCenter=f4a41c4c-4029-e511-80ee-0050562f9516"
$ReportParaMonth = "01"
$ReportParaYear = "2021"

#Main Script

$reportURL = ($urlWebportal + "/Pages/ReportViewer.aspx?" + $reportpath + "&UserFragmentID=" + $UserFragmentID + "&UserCurrency=" + $UserCurrencyCode + "&report:IsPortal=true" + $ReportParaCostCentersURL +  "&STARTMONTH=" + $ReportParaMonth + "&ENDMONTH=" + $ReportParaMonth + "&STARTYEAR=" + $ReportParaYear + "&ENDYEAR=" + $ReportParaYear + "&rs:Format=XML")

$WebRequest = New-Object System.Net.WebClient
$WebRequest.UseDefaultCredentials = $true
 
[xml]$doc = $WebRequest.DownloadString($reportURL)

$GesamtSumme = $doc.Report.matrix1.textbox32.matrix1_ColumnGroup1_Collection.matrix1_ColumnGroup1.Cell.textbox43

$GesamtSummeDecimal = [System.Convert]::ToDecimal($GesamtSumme,[cultureinfo]::GetCultureInfo('en-US'))Code-Sprache: PowerShell (powershell)

Erklärung

  1. Die Variablen am Anfang des Skripts setzen die URL zum Report-Server, den Report-Pfad und die benötigten Parameter wie User-ID, Jahr, Monat, Kostenstelle, etc.
  2. Danach werden die Parameter zur Variable “reportURL” zusammengebaut.
  3. Diese URL wird dann über einen WebRequest mit NTLM-Anmeldung (UseDefaultCredentials = $true) aufgerufen. Der Parameter “&rs:Format=XML” ganz am Ende der URL bewirkt den Export in eine XML-Datei.
    • Information: Der Benutzer, der das Skript ausführt, benötigt also Zugriffsrechte auf den Report-Server, sollte im Workflow aber kein Thema sein.
  4. Die XML wird in der Variable “doc” gespeichert.
  5. Die Gesamtsumme wird in der XML-Variable “doc” anschließend via XPath gesucht und extrahiert ($doc.Report.Xpaht.zum.gewuenschten.wert)
  6. Zu guter Letzt wird die Gesamtsumme vom Typ “String” noch in eine Variable vom Typ “Dezimal” konvertiert.

Ergebnis

PowerShell Skript ergebnis
Das war’s auch schon. Jetzt haben wir den gewünschten Wert aus dem Report extrahiert und können damit machen, was wir wollen 😉
0
Falls du noch Fragen hast, wir helfen gerne!x
morpheus42 Icon

Hallo 👋
Schön, dich zu treffen.

Trag dich ein, um neue ESM-Beiträge direkt in deinen Posteingang zu bekommen!

Wir senden keinen Spam! Erfahre mehr in unserer Datenschutzerklärung.

Foto des Autors
Autor
Simon
Gründer von morpheus42, ESM Senior Consultant, Kaffee-Suchtie & Smart Home Fanatiker. A wise man once said: "Have you cleared the Cache?"

Abonnieren
Benachrichtige mich bei
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
Alle Kommentare anzeigen
Send this to a friend