Benutzer mit den meisten Antworten
SQL Server Reporting Services SOAP

Frage
-
Hallo
Ich bin dabei eine Visual Studio 2010 Visual Basic Anwendung zu schreiben mit der ich mittels SOAP diverse Administrationen die Reporting Services betreffen machen zu können.
Mit ...
Dim rs As New ReportingService2010 rs.Credentials = System.Net.CredentialCache.DefaultCredentials() ' Alle Elemente des Roots durchgehen und Namen mit Typen ausgeben. Dim items() As CatalogItem = rs.ListChildren("/", True) For Each item As CatalogItem In items StandardComboBox.Items.Add(Microsoft.VisualBasic.Left(item.Name & " ", 30) & " => " & Microsoft.VisualBasic.Left(item.TypeName.ToString() & " ", 100)) Next
... hab ich schon geschafft die Reports auszulesen und anzuzeigen.
Ich würde nun gerne ermitteln welche Datasets ein Bericht verwendet. Ich hab im Netz recherchiert, bin auf ...
Dim rs As New ReportingService2010 rs.Credentials = System.Net.CredentialCache.DefaultCredentials() rs.ListReportDataSource("/Verzeichnis/Bericht")
... gestossen. Aber leider funktioniert das nicht. (Scheint für Reportingservices2005 zu sein)
Hat jemand einen Tip wie ich das lösen könnte?
Vielen Dank
Sql Server 2008 R2 Sql Server 2008 R2 Business Intelligence Development Studio Sql Server 2008 R2 Management Studio Visual Basic 2010 Excel 2010 PowerPivot
Antworten
-
Hallo Peter,
mein letzter Ansatz schein mir der beste zu sein. Also, XSD für die Reports runter laden (http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition), mit dem XSD.exe Tool die Klassen generieren lassen und der Rest sieht dann so aus:
Imports System.IO Imports System.Web.Services.Protocols Imports System.Xml.Serialization Imports Rs2012Soap.Rs2010Reference Module Test Sub Main() Dim rs As New ReportingService2010 rs.Credentials = System.Net.CredentialCache.DefaultCredentials() Try ' Bericht "MyReport" aus dem Root laden Dim reportBytes = rs.GetItemDefinition("/MyReport") Dim report As ReportDefinition.Report Using stream = New MemoryStream(reportBytes) Dim serializer = New XmlSerializer(GetType(ReportDefinition.Report)) report = DirectCast(serializer.Deserialize(stream), ReportDefinition.Report) End Using For Each item In report.Items If TypeOf item Is ReportDefinition.DataSetsType Then Dim dataSets = DirectCast(item, ReportDefinition.DataSetsType) ' Alle Dataset des Reports durchgehen For i = dataSets.DataSet.GetLowerBound(0) To dataSets.DataSet.GetUpperBound(0) Dim dataSet = dataSets.DataSet(i) Console.WriteLine(dataSet.Name) Next End If Next Catch ex As SoapException Console.WriteLine(ex.Detail.InnerXml.ToString()) End Try Console.WriteLine("Ende") Console.ReadKey() End Sub End Module
wobei "ReportDefinition" das Namespace von der generierten Klasse ist. Bei Bedarf kann ich Dir das Test Projekt zur Verfügung stellen.
Olaf Helper
Blog Xing- Als Antwort markiert Peter01 Freitag, 26. Juli 2013 05:10
Alle Antworten
-
Ich würde nun gerne ermitteln welche Datasets ein Bericht verwendet. Ich hab im Netz recherchiert, bin auf ...
Dim rs As New ReportingService2010 rs.Credentials = System.Net.CredentialCache.DefaultCredentials() rs.ListReportDataSource("/Verzeichnis/Bericht")
Hallo Peter,
was darf es denn nun genau sein, die DataSources wie im Code oder die DataSets wie in der Frage?
Über die SOAP kannst Du alles machen, was Du auch über die Report Manager GUI machen kannst; dort kann man die DataSources einsehen/ändern, aber nicht die DataSets.
In SSRS 2010 gibt es die Methode ReportingService2010.GetItemDataSources; wurde geändert, da nun ja nicht nur die Reports eine DataSource haben können (ReportParts, ...). Alle Methoden der SOAP findest Du hier: ReportingService2010-MethodenWenn es doch die DataSets sein sollen, wird es etwas komplizierter.
Olaf Helper
Blog Xing -
Hallo Olaf,
Ja klar sollen es die Datasets sein. Ich hab den falschen Code reinkopiert. Tut mir leid.
Danke für die Antwort. Wie kompliziert würde das mit den Datasets werden ?
Grüße
Peter
Sql Server 2008 R2 Sql Server 2008 R2 Business Intelligence Development Studio Sql Server 2008 R2 Management Studio Visual Basic 2010 Excel 2010 PowerPivot
-
Hallo Peter,
wie kompliziert es wird, weiss ich noch gar nicht so genau; das muss ich mir noch genauer ansehen, allerdings fehlt mir heute die Zeit dazu.
Beim einen Blick in den Objekt-Katalog zur SOAP Schnittstelle findet man zwar
eine DataSetDefinition-Klasse, die sich genau nach dem gesucht anhört, sogar ein QueryDefinition und eine Field-Auflistung gibt es. Ließt man etwas in der Doku, ist es das Rückgabe-Objekt von der ReportingService2010.PrepareQuery-Methode ist, was wiederum zur Data Driven Subscription gehört ... und wohl nicht zum Ziel führt wird.
Über ReportingService2010.GetItemDefinition-Methode kann man den Report laden, allerdings als Byte-Array. Das ist dann inhaltlich die RDL Datei, also XML, wozu es eine XSD gibt, aus der man wiederum das Objektmodell als Code generieren kann; spricht man müsste Byte[] => XML => Report Objekt casten können. Sollte eigentlich nicht so wild sein, halt nur mit Fleißarbeit verbunden ... wie gesagt, wenn etwas mehr Zeit da ist.
Olaf Helper
Blog Xing -
Hallo Peter,
mein letzter Ansatz schein mir der beste zu sein. Also, XSD für die Reports runter laden (http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition), mit dem XSD.exe Tool die Klassen generieren lassen und der Rest sieht dann so aus:
Imports System.IO Imports System.Web.Services.Protocols Imports System.Xml.Serialization Imports Rs2012Soap.Rs2010Reference Module Test Sub Main() Dim rs As New ReportingService2010 rs.Credentials = System.Net.CredentialCache.DefaultCredentials() Try ' Bericht "MyReport" aus dem Root laden Dim reportBytes = rs.GetItemDefinition("/MyReport") Dim report As ReportDefinition.Report Using stream = New MemoryStream(reportBytes) Dim serializer = New XmlSerializer(GetType(ReportDefinition.Report)) report = DirectCast(serializer.Deserialize(stream), ReportDefinition.Report) End Using For Each item In report.Items If TypeOf item Is ReportDefinition.DataSetsType Then Dim dataSets = DirectCast(item, ReportDefinition.DataSetsType) ' Alle Dataset des Reports durchgehen For i = dataSets.DataSet.GetLowerBound(0) To dataSets.DataSet.GetUpperBound(0) Dim dataSet = dataSets.DataSet(i) Console.WriteLine(dataSet.Name) Next End If Next Catch ex As SoapException Console.WriteLine(ex.Detail.InnerXml.ToString()) End Try Console.WriteLine("Ende") Console.ReadKey() End Sub End Module
wobei "ReportDefinition" das Namespace von der generierten Klasse ist. Bei Bedarf kann ich Dir das Test Projekt zur Verfügung stellen.
Olaf Helper
Blog Xing- Als Antwort markiert Peter01 Freitag, 26. Juli 2013 05:10
-
Hallo Olaf
Tut mir leid, dass ich mich erst jetzt wieder melde. War ein paar Tage unterwegs und konnte nicht so richtig weitermachen bei dem Programm.
Es gibt jetzt 3 Möglichkeiten:
1. Dein Vorschlag (wobei ich das mit der XSD.Exe und der Klasse generieren erst noch verstehen muss)
2. mittesl TSQL und XMLNAMESPACES die RepotServer Tabelle Catalog auslesen
3. Wir bekommen ein Tool das ins die ganze Datenbankstruktur und auch die Reporting Objekte ausliest und bereitstellt. (Das ist natürlich jetzt der einfachste Weg)
Gerne nehme ich aber trotzdem dein Angebot an dein Rs2012Soap Projekt anzusehen an, ich bin stark an SOAP interessiert. (Skydrive kann ich hier am Arbeitsplatz nicht, kann ich erst zuhause probieren)
Liebe Grüße
Peter
Sql Server 2008 R2 Sql Server 2008 R2 Business Intelligence Development Studio Sql Server 2008 R2 Management Studio Visual Basic 2010 Excel 2010 PowerPivot
-
2. mittesl TSQL und XMLNAMESPACES die RepotServer Tabelle Catalog auslesen
Hallo Peter,
Skydrive & Co ist bei mir auf der Arbeit auch geblocked.
Warum hast du nicht gleich gesagt, das der Weg, wie die Information ermittelt werden, eigentlich egal ist; Du hattest ja gleich explizit mit SOAP gestartet?
Siehe mein T-SQL Skript im TechNet ScriptCenter: List datasets with command text for all SSRS reports
Olaf Helper
Blog Xing -
Hallo Olaf
Ja ich hab deshalb mit SOAP gestartet, weil ich so eine Art SSRS Admin-Programm schreibe. Das hatte ich ursprünglich mit SOAP begonnen. Deshalb wollte ich auch mit SOAP weitermachen.
Ich bin im Netz auf ein ähnliches TSQL Statement gestossen. Das hat auch funktioniert. Aber trotzdem war ich nicht ganz glücklich damit wseil ich es doch mit SOAP schaffen will. (wegen der Einheitlichkeit)
Ich werde mir sicher dein Projekt ansehen. Da kann ich viel über SOAP lernen. Ich schaus mir morgen an (kanns erst heute Abend runterladen)
Ich melde mich dann.
Liebe
Sql Server 2008 R2 Sql Server 2008 R2 Business Intelligence Development Studio Sql Server 2008 R2 Management Studio Visual Basic 2010 Excel 2010 PowerPivot
-
Hallo Olaf
So jetzt hab ich mir dein Projekt angesehen. Ehrlichgesagt bin ich nicht 100% dahintergekommen was es alles macht. Ist es soweit korrekt, das es sich dabei um eine Demo handelt wie man die Datasets eines Berichtes anzeigen kann? Was mir nicht klar ist...
1. wie die XSD.Exe da reinspielt
2. Ich hab gesehen das du eine Rs2005Reference und eine Rs2010Reference in dein Produkt eingebunden hast. Erstens, ich schaffs nicht eine zweite Reference (für Produktion und Entwicklungsumgebung) einzubinden. Zusatzfrage, kann man die Reference sozusagen zur Laufzeit umschalten, einmal wenn ich die Produktive Umgebung auswerten will und dann mal die Entwicklungsumgebung.
Im groben hab ich mein Projekt genauso angelegt wie deines. Nur diese XSD.exe verwende ich nicht.
Liebe Grüße
Peter
Sql Server 2008 R2 Sql Server 2008 R2 Business Intelligence Development Studio Sql Server 2008 R2 Management Studio Visual Basic 2010 Excel 2010 PowerPivot
-
Hallo Peter,
die Reports (RDL) sind XML Dateien mit einem fest definiertem Aufbau, dieser ist in der XSD = "XML Schema Definition" festgelegt. Mit dem Tool xsd.exe kann man aus der XSD sich Klassen generieren lassen, die Code-seitig der XSD entsprechen.
Das Demoprojekt lädt via SOAP aus SSRS den Report aus, allerdings erhält man es "nur" als Byte Array. Dieses wird in XML umgewandelt und dann in diese Klassen serialisiert. So kann man bequem Objekt-Orientiert arbeiten, statt sich mit XML herumquälen zu müssen. Der umgekehrte Weg geht auch, Du könntest per Programm den Report abändern und dann als RDL abspeichern oder gleich nach SSRS hochladen.
Die zweite Web-Referenz zeigt auf die zweite SOAP von SSRS, auf ReportExecution. Mit der Schnittstelle kann man per Programm Reports render, drucken, etc lassen.
Der Konstruktut von ReportingService2010 hat eine Überladung die erlaubt, die URL des Ssrs anzugeben, dann wird nicht die verwendet, die in der app.config hinterlegt ist.
Olaf Helper
Blog Xing -
Hallo Olaf
Jetzt hab ich verstanden. Danke. Ich werde es mir noch genauer ansehen, weil das könnte ich sehr gut gebrauchen. Sobald ich wieder Fragen dazu hab melde ich mich ganz bestimmt ;-).
Nochmal vielen Dank für Deine Hilfe. Die hat mir schon sehr viel gebracht.
Liebe Grüße
Peter
Sql Server 2008 R2 Sql Server 2008 R2 Business Intelligence Development Studio Sql Server 2008 R2 Management Studio Visual Basic 2010 Excel 2010 PowerPivot