2008-11-06 10 views
6

In Reporting Services möchte ich einen Parameter hinzufügen, der Daten aus einem benutzerdefinierten Codeblock enthält. Im Idealfall würde ich in der Lage sein, den folgenden Code (dies ist ein einfaches Testen Beispiel) auszuführen:Benutzerdefinierter Code im Reporting Services-Bericht

Function GetPeriods() As String() 
Dim values As System.Collections.ArrayList = 
    New System.Collections.ArrayList() 
For i as integer = 1 to 24 
    values.Add(i) 
Next 
Return values.ToArray() 
End Function 

und die folgenden in dem „Textfeld“ der Parameters setzen:

=Code.GetPeriods() 

jedoch Wenn ich den Bericht ausführe, ist der Parameter, auf den ich ihn anwende, deaktiviert und leer. Gibt es eine andere Technik, die verwendet werden sollte? Oder mache ich etwas falsch?

Antwort

0

Alles, was ich gesehen habe, erfordert, dass Parameter und ihre jeweiligen Einstellungen Teil des RDL sind.

Wenn Sie die Werte "fest codieren", könnten Sie ein Dataset nur für den Bericht erstellen, vielleicht in XML, oder wenn es programmgesteuert sein soll, tun Sie es in einem Webdienst.

2

Wenn Sie SQL 2008 Reporting Services verwenden, können Sie sich die Datei this page ansehen, die das Konzept der Verwendung benutzerdefinierter Assemblys einführt. Wenn Sie SQL 2005 Reporting Services verwenden, ist this link die gewünschte Lösung.

Es ist eine meist triviale Sache, kompilieren Sie einfach Ihren Code in eine Klassenbibliothek und folgen Sie den Anweisungen, damit Ihr Bericht darauf verweisen kann.

1

Sie können dieselbe gespeicherte Prozedur auf SQL Server erstellen und Parameterwerte von dieser Prozedur laden.

2

Sie geben ein Array-Element (ein Array von Strings) in ein Textfeld zurück. Versuchen Sie stattdessen, eine einfache Zeichenfolge zurückzugeben. Das sollte funktionieren. Wenn Sie dennoch eine Array-Liste zurückgeben möchten, müssen Sie diese im Grunde an ein Listensteuerelement in Ihrer RDL binden. Das können Sie definitiv mit Dataset-Erweiterungen tun. Ich bin mir jedoch nicht sicher, ob es einen anderen einfachen Weg gibt. Überprüfen Sie die Eigenschaften des Listensteuerelements, und prüfen Sie, ob Sie direkt an eine Array-Liste binden können.

1

Ich habe Ihren Code überprüft. Das einzige, was falsch ist, ist Ihre Funktion String() zurückgibt. Als ich Ihre Methodensignatur änderte, um Array zurückzugeben, funktionierte es gut, in meinem Bericht.

Ändern Sie die Signatur Function GetPeriods() As Array

1

Um Ihre Mitglieder/Funktionen in benutzerdefinierten implementiert Zugangscode von SSRS melden Sie den Zugriffsmodifizierer auf „Public“ setzen soll

Public Function GetPeriods() As String 
... 

Artikel siehe Writing Custom Code in SQL Server Reporting Services

+0

*** http: //blogs.sqlxml.org/bryantlikes/articles/824.aspx*** nicht gefunden _404 error_ – Kiquenet

1

Ich habe versucht, das gleiche zu tun, eine einfache Liste von Parameterwerten aus Berichtscode. Keiner der Links in einer dieser Antworten zeigt, wie dies zu tun ist und nach einigem Hin und Her, glaube ich nicht, dass es überhaupt möglich ist. Ja, es ist möglich, die Werte von einer Datenbankabfrage, von einem Webservice oder von einer benutzerdefinierten Assembly abzurufen, aber jeder von diesen erzeugt viel Overhead, verglichen mit dem Abrufen der Liste von einem einfachen Funktionsaufruf wie = Code.GetValues ​​() , wobei die Funktion eine For-Schleife verwendet, um die Werte zu erstellen.

msvcyc weist darauf hin, dass der Parameter einen String-Wert erwartet, aber die Funktion ein Array zurückgibt.Ich habe den Rückgabetyp wie von Prashant Sable vorgeschlagen zu Array geändert, aber die Auswahlliste ist immer noch ausgegraut, es funktioniert nicht. Und es stimmt, dass coldice sagt, dass der Zugriffsmodifikator öffentlich sein sollte.

In meinem Graben habe ich an article by James Kovac von 2005 gefunden, wies darauf hin, warum das nicht möglich ist. Die Klasse Parameters hat eine get-Methode, aber keine set-Methode. Im Objektobrowser von VS 2008 für SSRS 2008 wurde der Objektname geändert, enthält aber immer noch keine set-Methode (siehe Microsoft.ReportingServices.Interfaces.IParameter.Name oder .Value).

Meine aktuelle Problemumgehung besteht darin, nur die Werteliste hart zu codieren, aber wenn Ihre Werteliste dynamisch sein muss, sind Datenbankabfragen, Webdienste oder benutzerdefinierte Assemblys die einzigen Optionen. Ich denke, die einfachste Problemumgehung dieser drei ist das Abrufen der Werte von der Datenbank-Engine, wie von oleksiy.t vorgeschlagen, solange Sie eine Abfrage schreiben können, um die gewünschte Werteliste zurückzugeben. Ihre Liste von Ganzzahlen oder meine Liste von Zeitintervallen wäre beides einfache Abfragen zu schreiben. Andernfalls müssen Sie eine der beiden anderen Problemumgehungen verwenden.

Verwandte Themen