none
SQL Server Reporting Services SOAP RRS feed

  • 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

    Dienstag, 16. Juli 2013 12:59

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
    Mittwoch, 17. Juli 2013 11:03

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-Methoden

    Wenn es doch die DataSets sein sollen, wird es etwas komplizierter.


    Olaf Helper

    Blog Xing

    Dienstag, 16. Juli 2013 14:42
  • 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

    Mittwoch, 17. Juli 2013 05:07
  • 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

    Mittwoch, 17. Juli 2013 06:51
  • 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
    Mittwoch, 17. Juli 2013 11:03
  • Hallo Peter,

    hast Du es hin bekommen? Ansonsten kannst Du mein Demo Projekt von meinem SkyDrive => Rs2012Soap runter laden; ist ein VS 2010 Projekt in VB.NET.


    Olaf Helper

    Blog Xing

    Donnerstag, 25. Juli 2013 16:38
  • 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

    Freitag, 26. Juli 2013 05:10
  • 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

    Freitag, 26. Juli 2013 05:42
  • 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

    Freitag, 26. Juli 2013 06:00
  • 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

    Mittwoch, 31. Juli 2013 06:35
  • 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

    Mittwoch, 31. Juli 2013 17:20
  • 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

    Donnerstag, 1. August 2013 05:21