none
SSRS Frage zu Datasets RRS feed

  • Frage

  • Hallo

    Ich habe eine Frage zu Datasets. Ich will herausfinden, ob man ein SQL Statement eines Datasets sozusagen durch die Hintertüre verändern kann.

    Ich weiss das Shared Datasets im Projekt abgespeichert sind (als XML Datei) aber wo befindet sich das Dataset nach dem Bereitstellen (Deployen) ? In einer Datenbank? Verspeichert als Datei auf dem SQL Server? oder beides?

    Mir ist bewusst das ich die Dataset Datei (*.rsd) im Projekt verändern könnte, aber dann mus ich das Dataset deployen. Mir wäre also lieber wenn ich das "produktive" Dataset manipulieren könnte.

    Hat jemand eine Idee dazu?

    Und wie verhält es sich mit im Report verspeicherten Datasets? Wo sind die den verspeichert?

     

    Vielen Dank für Antworten

     

    Peter

     

     

     

     

     

     

     

     


    Sql Server 2008 R2 Business Inteligence Development Studio Viasul Basic 2010 Express Excel 2010
    Donnerstag, 26. Januar 2012 12:32

Antworten

  • Servus Peter,

    machen wir es doch einfach mal an einem Beispiel fest... Der nachfolgende Code legt die Tabelle mit den Konfigurationen an. Die zwei Views sollen nur als Beispiele dienen, die als Report-Dataset verwendet werden.

    USE tempdb
    GO
    
    -- Erstellung der RecordSource-Tabelle
    IF EXISTS (SELECT * FROM sys.sysobjects WHERE id = OBJECT_ID('dbo.tbl_ReportSources', 'U'))
    	DROP TABLE dbo.tbl_ReportSources
    	GO
    
    CREATE TABLE dbo.tbl_ReportSources
    (
    	ReportName		nvarchar(255)		NOT NULL	PRIMARY KEY,
    	SQLStatement	nvarchar(4000)		NOT NULL
    )
    GO
    
    -- Eintragen von ein paar Daten (ich nehme Views für die bessere Sichtbarkeit!)
    IF EXISTS (SELECT * FROM sys.sysobjects WHERE id = OBJECT_ID('dbo.view_rpt_Source1', 'V'))
    	DROP VIEW dbo.view_rpt_Source1
    	GO
    
    CREATE VIEW dbo.view_rpt_Source1
    AS
    	-- Ist nur ein Beispiel für "GLEICHE ATTRIBUTNAMEN!"
    	SELECT	principal_id				AS	Column1,
    			name						AS	Column2
    	FROM	sys.server_principals
    	WHERE	type = 'R'
    GO
    
    IF EXISTS (SELECT * FROM sys.sysobjects WHERE id = OBJECT_ID('dbo.view_rpt_Source2', 'V'))
    	DROP VIEW dbo.view_rpt_Source2
    	GO
    
    CREATE VIEW dbo.view_rpt_Source2
    AS
    	-- Ist nur ein Beispiel für "GLEICHE ATTRIBUTNAMEN!"
    	SELECT	principal_id				AS	Column1,
    			name						AS	Column2
    	FROM	sys.server_principals
    	WHERE	type = 'S'
    GO
    
    -- Eintragen der Werte in SQL-Tabelle
    INSERT INTO dbo.tbl_ReportSources
    (ReportName, SQLStatement)
    VALUES
    ('MeinBericht1', 'SELECT * FROM dbo.view_rpt_Source1'),
    ('MeinBericht2', 'SELECT * FROM dbo.view_rpt_Source2')
    
    SELECT * FROM dbo.tbl_ReportSources
    


    Wenn Du den Code ausführen läßt, wirst Du in der Tabelle für zwei Berichte jeweils eigenen DataSources haben. Wie Du aus der Konstruktion der Views erkennen kannst, hat jedes Attribut der Relation einen dedizierten Attributnamen für die Ausgabe - siehe dazu auch den Hinweis von Christoph.

    Wenn Du nun für den Bericht "MeinBericht1" eine andere Source verwenden möchtest (z. B. auch die View2) dann einfach das [SQLStatement für "MEinReport1" auf "SELECT * FROM dbo.view_rpt_View2" aktuallisieren.


    Uwe Ricken

    MCITP Database Administrator 2005
    MCITP Database Administrator 2008
    MCITP Microsoft SQL Server 2008, Database Development

    db Berater GmbH
    http://www-db-berater.de
    • Als Antwort markiert Peter01 Freitag, 27. Januar 2012 13:44
    Freitag, 27. Januar 2012 13:16

Alle Antworten

  • Hallo Peter,

    ich weiß zwar noch nicht wirklich, was Du da genau machen möchtest aber wenn es darum geht, SQL-Sources für Reports "manuell" zu ändern, würde ich etwas anders vorgehen.

    1. Erstelle eine Tabelle mit zwei Attributen [ReportName], [SQLStatement]

    2. Erstelle eine "generische" Prozedur, die für alle Berichte gelten soll mit folgendem Inhalt

    CREATE PROC dbo.proc_app_DynamicReportSource
        @ReportName nvarchar(128)
    AS
        SET NOCOUNT ON
    
        DECLARE @stmt nvarchar(4000)
    
        SELECT TOP 1
                @stmt = SQLStatement
        FROM dbo.tbl_ReportSources
        WHERE ReportName = @ReportName
    
        IF @stmt IS NOT NULL
        EXEC sp_executeSQL @stmt
    
        SET NOCOUNT OFF
    GO
    

    Dadurch machst Du dich "unabhängig von irgendwelchen Systemrelationen der Reporting Services. Ich würde davon abraten, in den Metadaten der Reportdefintionsdatenbank (i. d. R. ReportServer) herzumzuspielen.


    Uwe Ricken

    MCITP Database Administrator 2005
    MCITP Database Administrator 2008
    MCITP Microsoft SQL Server 2008, Database Development

    db Berater GmbH
    http://www-db-berater.de
    Donnerstag, 26. Januar 2012 16:01
  •  aber wo befindet sich das Dataset nach dem Bereitstellen (Deployen) ? In einer Datenbank? Verspeichert als Datei auf dem SQL Server? oder beides?

    Und wie verhält es sich mit im Report verspeicherten Datasets? Wo sind die den verspeichert?

    Hallo Peter,

    "verspeichert" ist mir ein neuer Begriff, den kannte ich noch gar nicht und konnte auch noch keine Definition dazu finden. Ist das so was ähnliches wie "verwählen"?  ... nur ein kleiner Joke.

    Wie die Datasource + Report etc Definitionen werden die Shared Datasets in der ReportServer Datenbank als eigenständiges Objekt gespeichert und wie Uwe rate ich nur davon ab, diese direkt ändern zu wollen. Die Datasets von Reports werden innerhalb der Report-Definition gespeichert.

    Was spricht den gegen ein neues Deployment, das läuft doch nur ein paar Sekunden?

    Ansonsten gibt es nur den offiziellen Weg über die ReportService SOAP Schnittstelle die Möglichkeit, die Statements der Shared Datasets zu ändern.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Donnerstag, 26. Januar 2012 16:26
  • Hallo Uwe

     

    Danke für deine Antwort. Obwohl sie mir noch nicht ganz klar ist. Anforderung ist, das man ein SQL Statement eines Datasets ändern kann, ohne den Report zu öffnen und bereitstellen zu müssen. Das mit der "generischen" Prozedur leuchtet mir noch ein, aber wie binde ich diese in den Report ein? Als Stored Procedure?

    Vielen Danke

    Peter


    Sql Server 2008 R2 Business Inteligence Development Studio Viasul Basic 2010 Express Excel 2010
    Freitag, 27. Januar 2012 07:03
  • Hallo Olaf

     

    Danke für deine Antwort. Nein "verspeichert" ist nicht so was ähnliches wie "verwählen" sondern eher sowas wie "Versace" (auch nur ein kleiner Joke ;-)

    Was deinen Tip angeht, ich hab mich schon ein wenig mit der ReportService SOAP Schnittstelle beschäftigt. Aber leider noch nicht tiefgreifend. Hast du einen Beispielcode, wie ich die Datasets auslesen und manipulieren kann? Würde mir sehr helfen.

     

    Vielen Dank

    Peter

     


    Sql Server 2008 R2 Business Inteligence Development Studio Viasul Basic 2010 Express Excel 2010
    Freitag, 27. Januar 2012 07:07
  • Hallo Peter,
    gehen wir doch mal eine Ebene tiefer und vereinfachen den Ansatz von Uwe!

    Der Report sollte seine Daten aus einer Prozedur beziehen. Diesen Aufruf gibst Du in der Abfrage an und der Report bestimmt sich aus dem ersten Select der Prozedur die Feldliste. Falls Du vorher noch was anderes dort tust, ist es unter Umständen eine gute Idee, zumindest schon mal ein Select-Statement dort zu codieren, was nie aufgerufen wird, nur um die Feldliste bereit zu stellen.

    Declare @Test int = 1;
    If @Test = 0
         Select ... ;

    Ansonsten solltest Du dann am Ende der Prozedur ein Select stehen haben, dessen Daten dann im Report verarbeitet werden.

    Ein Austausch der Prozedur kann dann jederzeit geschehen, solange die Feldliste identisch bleibt.

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    www.insidesql.org/blogs/cmu

    Freitag, 27. Januar 2012 08:48
    Beantworter
  • Servus Peter,

    machen wir es doch einfach mal an einem Beispiel fest... Der nachfolgende Code legt die Tabelle mit den Konfigurationen an. Die zwei Views sollen nur als Beispiele dienen, die als Report-Dataset verwendet werden.

    USE tempdb
    GO
    
    -- Erstellung der RecordSource-Tabelle
    IF EXISTS (SELECT * FROM sys.sysobjects WHERE id = OBJECT_ID('dbo.tbl_ReportSources', 'U'))
    	DROP TABLE dbo.tbl_ReportSources
    	GO
    
    CREATE TABLE dbo.tbl_ReportSources
    (
    	ReportName		nvarchar(255)		NOT NULL	PRIMARY KEY,
    	SQLStatement	nvarchar(4000)		NOT NULL
    )
    GO
    
    -- Eintragen von ein paar Daten (ich nehme Views für die bessere Sichtbarkeit!)
    IF EXISTS (SELECT * FROM sys.sysobjects WHERE id = OBJECT_ID('dbo.view_rpt_Source1', 'V'))
    	DROP VIEW dbo.view_rpt_Source1
    	GO
    
    CREATE VIEW dbo.view_rpt_Source1
    AS
    	-- Ist nur ein Beispiel für "GLEICHE ATTRIBUTNAMEN!"
    	SELECT	principal_id				AS	Column1,
    			name						AS	Column2
    	FROM	sys.server_principals
    	WHERE	type = 'R'
    GO
    
    IF EXISTS (SELECT * FROM sys.sysobjects WHERE id = OBJECT_ID('dbo.view_rpt_Source2', 'V'))
    	DROP VIEW dbo.view_rpt_Source2
    	GO
    
    CREATE VIEW dbo.view_rpt_Source2
    AS
    	-- Ist nur ein Beispiel für "GLEICHE ATTRIBUTNAMEN!"
    	SELECT	principal_id				AS	Column1,
    			name						AS	Column2
    	FROM	sys.server_principals
    	WHERE	type = 'S'
    GO
    
    -- Eintragen der Werte in SQL-Tabelle
    INSERT INTO dbo.tbl_ReportSources
    (ReportName, SQLStatement)
    VALUES
    ('MeinBericht1', 'SELECT * FROM dbo.view_rpt_Source1'),
    ('MeinBericht2', 'SELECT * FROM dbo.view_rpt_Source2')
    
    SELECT * FROM dbo.tbl_ReportSources
    


    Wenn Du den Code ausführen läßt, wirst Du in der Tabelle für zwei Berichte jeweils eigenen DataSources haben. Wie Du aus der Konstruktion der Views erkennen kannst, hat jedes Attribut der Relation einen dedizierten Attributnamen für die Ausgabe - siehe dazu auch den Hinweis von Christoph.

    Wenn Du nun für den Bericht "MeinBericht1" eine andere Source verwenden möchtest (z. B. auch die View2) dann einfach das [SQLStatement für "MEinReport1" auf "SELECT * FROM dbo.view_rpt_View2" aktuallisieren.


    Uwe Ricken

    MCITP Database Administrator 2005
    MCITP Database Administrator 2008
    MCITP Microsoft SQL Server 2008, Database Development

    db Berater GmbH
    http://www-db-berater.de
    • Als Antwort markiert Peter01 Freitag, 27. Januar 2012 13:44
    Freitag, 27. Januar 2012 13:16
  • Hallo Uwe

     

    Vielen Dank für Deine Antwort. Ich bin schon dabei das alles zu prüfen und umzusetzen. Im ersten Schritt hab ich noch keine Views verwendet, sondern im Report einen Parameter gemacht mit dem SQL Statement. Hat auch gut geklappt. (ausser das bei der WHERE - Bedingung die Zuweisung (WHERE BERICHT = VBVBB091) einen Fehler gebracht hat. (unknown Column VBVBB091 oder so ähnlich)

    Weiters werde ich das mit den Views dazubauen. Also nochmal vielen Dank an Dich, Christoph und Olaf.


    Sql Server 2008 R2 Business Inteligence Development Studio Viasul Basic 2010 Express Excel 2010
    Freitag, 27. Januar 2012 13:44