Freigeben über


Benutzerdefinierter Code und Assemblyverweise in Ausdrücken in einem paginierten Bericht im Berichts-Designer (SSRS)

Gilt für: Berichts-Designer in SQL Server Data Tools ❌ Power BI Report Builder ❌ Microsoft Report Builder (SSRS)

Sie können in einem Bericht eingebettetem, benutzerdefiniertem Code oder benutzerdefinierten Assemblys, die Sie erstellen und auf dem Computer speichern und auf dem Berichtsserver bereitstellen. Verwenden Sie eingebetteten Code für benutzerdefinierte Konstanten, komplexe Funktionen oder für Funktionen, die mehrfach in demselben Bericht verwendet werden. Verwenden Sie benutzerdefinierte Codeassemblys, um Code an einer einzelnen Stelle zu verwalten und ihn zur Verwendung in mehreren Berichten freizugeben. In benutzerdefiniertem Code können neue benutzerdefinierte Konstanten, Variablen, Funktionen oder Unterroutinen eingeschlossen werden. Sie können schreibgeschützte Verweise in integrierte Auflistungen, wie die Parameter-Auflistung, einbeziehen. An benutzerdefinierte Funktionen können jedoch keine Sätze von Berichtsdatenwerten übergeben werden, insbesondere werden keine benutzerdefinierten Aggregate unterstützt.

Wichtig

Für zeitempfindliche Berechnungen, die einmal zur Laufzeit ausgewertet werden und während der Berichtsverarbeitung denselben Wert behalten sollen, bietet sich eventuell die Verwendung einer Berichts- oder Gruppenvariablen an. Weitere Informationen finden Sie unter Verweise auf Berichts- und Gruppenvariablenauflistungen (Berichts-Generator und SSRS).

Berichts-Designer ist die bevorzugte Erstellungsumgebung für das Hinzufügen von benutzerdefiniertem Code zu einem Bericht. Berichts-Generator unterstützt das Verarbeiten von Berichten, die über gültige Ausdrücke verfügen, oder die Verweise auf benutzerdefinierte Assemblys auf einem Berichtsserver einschließen. Berichts-Generator bietet keine Möglichkeit, einen Verweis auf eine benutzerdefinierte Assembly hinzuzufügen.

Hinweis

Während des Upgrades eines Berichtsservers erfordern Berichte, die von benutzerdefinierten Assemblys abhängig sind, unter Umständen weitere Schritte zum Abschließen des Upgrades.

Hinweis

Sie können paginierte Berichtsdefinitionsdateien (.rdl) im Berichts-Generator von Microsoft, im Power BI Report Builder und im Berichts-Designer in SQL Server-Datentools erstellen und ändern.

Arbeiten mit benutzerdefiniertem Code in Berichts-Generator

In Berichts-Generator können Sie einen Bericht von einem Berichtsserver öffnen, der Verweise auf benutzerdefinierte Assemblys einschließt. Sie können z. B. Berichte bearbeiten, die mit dem Berichts-Designer in SQL Server Data Tools erstellt und bereitgestellt werden. Die benutzerdefinierten Assemblys müssen auf dem Berichtsserver bereitgestellt werden.

Sie können nicht die folgenden Schritte ausführen:

  1. Hinzufügen von Verweisen oder Klassenmemberinstanzen zu einem Bericht.

  2. Anzeigen eines Berichts in der Vorschau mit Verweisen auf benutzerdefinierte Assemblys im lokalen Modus.

Einschließen von Verweisen auf häufig verwendete Funktionen

Im Dialogfeld Ausdruck können Sie eine kategorisierte Liste allgemeiner im Berichts-Generator integrierter Funktionen anzuzeigen. Wenn Sie Allgemeine Funktionen erweitern und auf eine Kategorie klicken, wird im Bereich Element die Liste der Funktionen angezeigt, die Sie in einen Ausdruck einschließen. Die allgemeinen Funktionen umfassen Klassen aus den .NET Framework-Namespaces Math und Convert sowie Funktionen der Visual Basic-Laufzeitbibliothek. Die gängigsten Funktionen sind im Dialogfeld Ausdruck nach Kategorie sortiert aufgeführt: Text, Datum und Uhrzeit, Mathematische Funktionen, Qualitätskontrolle, Programmfluss, Aggregat, Finanzen, Konvertierung und Sonstiges. Weniger häufig verwendete Funktionen werden nicht in der Liste angezeigt, können jedoch auch in einem Ausdruck verwendet werden.

Um eine integrierte Funktion zu verwenden, doppelklicken Sie auf den Funktionsnamen im Bereich Element. Im Bereich Beschreibung wird eine Beschreibung der Funktion angezeigt, und ein Beispiel des Funktionsaufrufs finden Sie im Bereich Beispiel. Wenn Sie im Codebereich den Funktionsnamen und anschließend eine linke Klammer ( eingeben, zeigt die IntelliSense-Hilfe jede gültige Syntax für diesen Funktionsaufruf an. Zur Berechnung des Höchstwerts für ein Feld mit dem Namen Quantity in einer Tabelle fügen Sie dem Codebereich beispielsweise den einfachen Ausdruck =Max( hinzu und zeigen mithilfe der Smarttags alle gültigen Syntaxmöglichkeiten für den Funktionsaufruf an. Um dieses Beispiel zu vervollständigen, geben Sie =Max(Fields!Quantity.Value)ein.

Weitere Informationen zu den einzelnen Funktionen finden Sie unter Math, Convertund Member der Visual Basic-Laufzeitbibliothek bei MSDN.

Einschließen von Verweisen auf weniger häufig verwendete Funktionen

Um einen Verweis auf andere, weniger häufig verwendete CLR-Namespaces (Common Language Runtime) einzuschließen, verwenden Sie einen vollqualifizierten Verweis, z.B. StringBuilder. IntelliSense wird für die seltener verwendeten Funktionen im Codebereich des Dialogfelds Ausdruck nicht unterstützt.

Weitere Informationen finden Sie unter Member der Visual Basic-Laufzeitbibliothek bei MSDN.

Einschließen von Verweisen auf externe Assemblys

Sie müssen die Assembly identifizieren, damit der Berichtsprozessor einen Verweis auf eine Klasse in eine externe Assembly einschließt. Geben Sie den vollqualifizierten Namen der Assembly, die dem Bericht hinzugefügt werden soll, auf der Seite Verweise des Dialogfelds Berichtseigenschaften an. Im Ausdruck müssen Sie den vollqualifizierten Namen für die Klasse in der Assembly verwenden. Klassen in einer externen Assembly werden nicht im Dialogfeld Ausdruck angezeigt. Geben Sie für diese Klassen den entsprechenden Namen an. Ein vollqualifizierter Name umfasst den Namespace, den Klassennamen und den Elementnamen.

Einschließen von eingebettetem Code

Auf der Registerkarte Code des Dialogfelds Berichtseigenschaften können Sie einem Bericht eingebetteten Code hinzufügen. Der erstellte Codeblock kann mehrere Methoden enthalten. Methoden in eingebettetem Code müssen in Microsoft Visual Basic geschrieben sein und instanzbasiert sein. Vom Berichtsprozessor werden automatisch Verweise für den System.Convert-Namespace und den System.Math-Namespace hinzugefügt. Fügen Sie zusätzliche Assemblyverweise auf der Seite Verweise des Dialogfelds Berichtseigenschaften hinzu. Weitere Informationen finden Sie unter Hinzufügen eines Assemblyverweises zu einem Bericht (SSRS).

Die Methoden im eingebetteten Code stehen über ein global definiertes Code -Element zur Verfügung. Zum Zugriff auf die Methoden verweisen Sie auf das Code -Element und den Methodennamen. Im folgenden Beispiel wird die Methode ToUSDaufgerufen, die den Wert des StandardCost -Felds in einen Dollarwert konvertiert:

=Code.ToUSD(Fields!StandardCost.Value)  

Um in Ihrem benutzerdefinierten Code auf integrierte Sammlungen verweisen zu können, müssen Sie einen Verweis auf das integrierte Berichts -Objekt hinzufügen:

=Report.Parameters!Param1.Value  

In den folgenden Beispielen wird veranschaulicht, wie einige benutzerdefinierte Konstanten und Variablen definiert werden können.

Public Const MyNote = "Authored by Bob"  
Public Const NCopies As Int32 = 2  
Public Dim  MyVersion As String = "123.456"  
Public Dim MyDoubleVersion As Double = 123.456  

Obwohl benutzerdefinierte Konstanten nicht in der Konstanten -Kategorie des Dialogfelds Ausdruck angezeigt werden (in der nur integrierte Konstanten angezeigt werden), können Sie Verweise darauf über einen beliebigen Ausdruck hinzufügen (wie in den folgenden Beispielen veranschaulicht). In einem Ausdruck wird eine benutzerdefinierte Konstante als Variantbehandelt.

=Code.MyNote  
=Code.NCopies  
=Code.MyVersion  
=Code.MyDoubleVersion  

In den folgenden Beispielen sind sowohl der Codeverweis als auch die Codeimplementierung der Funktion FixSpellingenthalten, mit der der Text "Bicycle" für alle Vorkommen des Texts „Bike“ im SubCategory -Feld ersetzt wird.

=Code.FixSpelling(Fields!SubCategory.Value)

Mit dem folgenden Code wird eine Implementierung der FixSpelling -Methode veranschaulicht, wenn er in den Codeblock einer Berichtsdefinition eingebettet ist. In diesem Beispiel wird gezeigt, wie Sie einen vollqualifizierten Verweis auf die StringBuilder-Klasse von Microsoft .NET Framework anwenden.

Public Function FixSpelling(ByVal s As String) As String  
   Dim strBuilder As New System.Text.StringBuilder(s)  
   If s.Contains("Bike") Then  
      strBuilder.Replace("Bike", "Bicycle")  
      Return strBuilder.ToString()  
      Else : Return s  
   End If  
End Function  

Weitere Informationen zu integrierten Objektsammlungen und die Initialisierung finden Sie unter Integrierte globale Werte und Benutzerverweise (Berichts-Generator und SSRS) und Initialisieren von Objekten benutzerdefinierter Assemblys.

Einschließen von Verweisen auf Parameter von Code

Sie können auf die globale Parameters-Auflistung per benutzerdefinierten Code über einen Codeblock der Berichtsdefinition oder über eine von Ihnen bereitgestellte benutzerdefinierte Assembly verweisen. Die Parameters-Auflistung ist schreibgeschützt und verfügt über keine öffentlichen Iteratoren. Sie können kein For Each-Konstrukt von Visual Basic verwenden, um die Sammlung zu durchlaufen. Sie benötigen den in der Berichtsdefinition definierten Namen des Parameters, um in Ihrem Code auf ihn verweisen zu können. Allerdings ist es möglich, alle Werte eines mehrwertigen Parameters zu durchlaufen.

Die folgende Tabelle enthält Beispiele für Verweise auf die integrierte Parameters -Sammlung von benutzerdefiniertem Code:

**Übergeben einer vollständigen globalen Parameterauflistung an benutzerdefinierten Code.**Diese Funktion gibt den Wert eines bestimmten Berichtsparameters MyParameter zurück.

Verweis in Ausdruck =Code.DisplayAParameterValue(Parameters)

Benutzerdefinierte Codedefinition

Public Function DisplayAParameterValue(ByVal parameters as Parameters) as Object  
Return parameters("MyParameter").Value  
End Function  

Übergeben eines einzelnen Parameters an benutzerdefinierten Code.

Verweis in Ausdruck =Code.ShowParametersValues(Parameters!DayOfTheWeek)

In diesem Beispiel wird der Wert des übergebenen Parameters zurückgegeben. Entspricht der Parameter einem mehrwertigen Parameter, ist die Rückgabezeichenfolge eine Verkettung aller Werte.

Benutzerdefinierte Codedefinition

Public Function ShowParameterValues(ByVal parameter as Parameter)  
 as String  
   Dim s as String   
   If parameter.IsMultiValue then  
      s = "Multivalue: "   
      For i as integer = 0 to parameter.Count-1  
         s = s + CStr(parameter.Value(i)) + " "   
      Next  
   Else  
      s = "Single value: " + CStr(parameter.Value)  
   End If  
   Return s  
End Function  

Einschließen von Verweisen auf Code von benutzerdefinierten Assemblys

Wenn Sie in einem Bericht benutzerdefinierte Assemblys verwenden möchten, müssen Sie zunächst die Assembly erstellen und für den Berichts-Designer zur Verfügung stellen. Anschließend fügen Sie im Bericht einen Verweis auf die Assembly hinzu und verwenden dann im Bericht einen Ausdruck, der auf die Methoden in dieser Assembly verweist. Beim Bereitstellen des Berichts auf dem Berichtsserver müssen Sie dort auch die benutzerdefinierte Assembly bereitstellen.

Informationen zum Erstellen einer benutzerdefinierten Assembly und zu ihrer Verwendung im Berichts-Generator finden Sie unter Verwenden benutzerdefinierter Assemblys mit Berichten.

Wenn Sie in einem Ausdruck auf benutzerdefinierten Code verweisen möchten, müssen Sie das Klassenelement in der Assembly aufrufen. Die Vorgehensweise hängt davon ab, ob es sich um eine statische oder um eine instanzbasierte Methode handelt. Statische Methoden in einer benutzerdefinierten Assembly stehen global im Bericht zur Verfügung. Auf statische Methoden können Sie in Ausdrücken durch Angeben des Namespace, der Klasse und des Methodennamens zugreifen. Im folgenden Beispiel wird die ToGBP-Methode aufgerufen, die den Wert des StandardCost -Felds von Dollar in Pfund Sterling konvertiert:

=CurrencyConversion.DollarCurrencyConversion.ToGBP(Fields!StandardCost.Value)  

Instanzbasierte Methoden sind über ein global definiertes Code -Element verfügbar. Zum Zugriff auf die Methoden verweisen Sie auf das Code -Element und anschließend auf die Instanz und den Methodennamen. Im folgenden Beispiel wird die ToEUR-Instanzmethode aufgerufen, die den Wert des StandardCost -Felds von Dollar in Euro konvertiert:

=Code.m_myDollarCoversion.ToEUR(Fields!StandardCost.Value)  

Hinweis

Im Berichts-Designer wird eine benutzerdefinierte Assembly einmal geladen und erst beim Schließen von Visual Studio entladen. Wenn Sie einen Bericht in der Vorschau anzeigen, dann Änderungen an einer im Bericht verwendeten benutzerdefinierten Assembly vornehmen und anschließend die Vorschau des Berichts erneut anzeigen, werden diese Änderungen in der zweiten Vorschau nicht angezeigt. Um die Assembly neu zu laden, müssen Sie Visual Studio schließen und neu öffnen und dann die Vorschau des Berichts anzeigen.

Weitere Informationen zum Zugreifen auf Ihren Code finden Sie unter Accessing Custom Assemblies Through Expressions.

Übergeben von integrierten Auflistungen in benutzerdefinierte Assemblys

Um integrierte Sammlungen wie die Globals - oder Parameters -Sammlung zur Verarbeitung an eine benutzerdefinierte Assembly zu übergeben, fügen Sie einen Assemblyverweis im Codeprojekt der Assembly hinzu, die die integrierten Auflistungen definiert, und greifen Sie auf den korrekten Namespace zu. Abhängig davon, ob Sie die benutzerdefinierte Assembly für einen auf einem Berichtsserver ausgeführten Bericht (Serverbericht) oder einen in einer .NET-Anwendung lokal ausgeführten Bericht (lokaler Bericht) entwickeln, unterscheidet sich jeweils die zu referenzierende Assembly. Weitere Informationen siehe unten.

  • Namespace: Microsoft.ReportingServices.ReportProcessing.ReportObjectModel

  • Assembly (lokaler Bericht): Microsoft.ReportingServices.ProcessingObjectModel.dll

  • Assembly (Serverbericht): Microsoft.ReportViewer.ProcessingObjectModel.dll

Da sich der Inhalt der Fields - und ReportItems -Sammlung zur Laufzeit dynamisch ändern kann, sollten Sie über die Aufrufe in der benutzerdefinierten Assembly hinaus nicht daran festhalten (z.B. in einer Elementvariablen). Die gleiche Empfehlung gilt im Allgemeinen für alle integrierten Auflistungen.