Report Document Type
Report Document Types stellen die Verbindung zwischen den Components und den Reports dar. Sie definieren, was für Daten in welchem Report ausgegeben werden. Ein Report Document Type enthält eine Angabe, welche Components ausgedruckt werden sollen und welche Reports dafür zur Verfügung stehen. Diese Report Document Types können später in Forms verwendet werden.
Report-Document Types sind an dem – Icon zu erkennen.
Erstellen, bearbeiten und löschen von Report Document Types
Sie erstellen einen neuen Report Document Type, indem Sie in der Registerkarte Namespaces den Namespace auswählen, in dem der Report Document Type abgelegt werden soll.
Mit dem Button (New) und dem Eintrag ReportDocuemtType aus dem Menü wird im markierten Namespace ein neuer Report Document Type angelegt. Dieser wird auch gleich geöffnet. Direkt nach dem Anlegen des Report Document Types steht der Cursor in dem sich öffnenden Designer auf dem Feld Name, wo Sie gleich den Namen eingeben können.
Es wird empfohlen, den Namen mit rpt zu beginnen.
Löschen können Sie einen Report Document Type mit dem Button (Delete). Sie müssen dazu den gewünschten Report Document Type im Namespace-Baum markiert haben. Es gibt auch im Kontext-Menü den Eintrag Delete. Der Löschvorgang wird erst im Repository wirksam, wenn Sie den Button (Save All) drücken.
DataSource
Unter Datasource werden die Components angegeben, die in einem Report ausgegeben werden sollen. Es ist möglich, mehrere Components (Collections) aus unterschiedlichen Namespaces einzubinden.
Jede Component wiederum kann für mehrere Reports als Datasource angegeben werden.
Report Document Type – Registerkarte DataSource:
Mit dem Button Add wird ein neuer Eintrag in der Liste erstellt. In der Combobox Datatype können Sie angeben, welche Component / Collection verwendet werden soll. Im Feld Name können Sie dem Eintrag einen Namen geben. Dieser wird anhand des ausgewählten Datentyps mit einem Standard-Namen vorbelegt.
Diese Einträge sind sozusagen die Properties des Reports. Diese Properties müssen später beim Druck mit Werten gefüllt werden.
Wenn Sie Components oder Collections eingebunden haben, können Sie die Properties aufklappen und die Properties der Component / Collection werden angeboten. Sind dies wiederum Components, können diese wiederum aufgeklappt werden.
In diesem Baum können Sie angeben, welche Properties an den Report übergeben werden sollen. Dazu müssen Sie die Checkbox an dem entsprechenden Eintrag setzen.
Aus diesen Daten wird eine XSD-Datei (XML-Definition) erstellt. Diese XSD-Datei kann einem Crystal-Report zugewiesen werden. So versteht der Report die Daten, die ihm übergeben werden. Mit jedem Klick im Baum wird die XSD-Datei neu erzeugt. Sie wird im Report-Pfad der aktuellen Applikation abgelegt. Und bekommt folgenden Namen: Namespaces.rptXXX.xsd.
Zum Einstellen des Pfades siehe Kapitel Code-Builder / Applications (Application).
Beim Druck werden die kompletten Components / Collections an den ReportDocmentType übergeben. Es werden aber nur die ausgewählten Daten weitergegeben. Umso größer die Listen, desto wichtiger ist es, dass nur die Daten übergeben werden, die wirklich benötigt werden.
Aus den Daten wird XML erzeugt. Dieses wird dann Crystal Reports übergeben, wo die Daten entsprechend aufbereitet und ausgegeben werden.
Crystal Reports
Auf der Registerkarte Crystal Reports können dem Report Document Type mehrere Reports zugewiesen werden.
Report Document Type – Crystal Reports:
Einen neuen Report fügen Sie beispielsweise über das Kontextmenü der Tabelle hinzu, in der die Reports angezeigt werden.
Mit der Checkbox Include Base Reports legen Sie fest, ob vererbte, nicht geänderte Basisreports später in der Applikation zur Auswahl stehen sollen.
Die folgenden Einstellungen beziehen sich auf den in der Tabelle ausgewählten Report:
Im Feld Name kann dem Report ein Name gegeben werden.
Warning
Dieser Name darf keine Leer- und Sonderzeichen enthalten, weil dieser später im Code zum Einsatz kommt.
Im Feld File kann ein vorhandener Report geöffnet und eingebunden werden. Dieser Report muss als Datenquelle das erzeugte XSD-File besitzen.
Mit dem Button Edit Report wird der Report über ein externes Tool bearbeitet.
Warning
Zum Erstellen und Editieren von Reports benötigen Sie Crystal Reports oder Visual Studio.
Mit dem Button New Report wird ein neuer Report zugewiesen.
Der Button Choose Report öffnet einen Dateiauswahl Dialog, in dem Sie einen neuen, bereits existierenden Report zuweisen können.
Caption
Im Report Document Type können Sie für Crystal Reports lokalisierte Bezeichnungen (Captions) hinterlegen, also die Bezeichnung mehrsprachig pflegen. Diese Captions können zur Laufzeit ausgewertet werden, um z.B. im Druck-Dialog bei der Auswahl der unterschiedlichen Report-Varianten einen sprechenden Text auszugeben.
Crystal Report mit Visual Studio erstellen
Öffnen Sie Visual Studio.
Legen Sie jetzt ein neues Projekt an (Visual C# Project / leeres Projekt oder empty Project) oder öffnen Sie ein bereits vorhandenes Projekt.
Es empfiehlt sich, ein Projekt zur Erstellung und Pflege von Reports anzulegen und dieses immer wieder zu verwenden.
Crystal Report auswählen und Open drücken.
Es öffnet sich ein Wizard zum Erstellen eines Crystal Reports.
Crystal Report Gallery:
Auf OK drücken.
Standard Report Expert Registerkarte Data:
In diesem Fenster wählen Sie den Eintrag Database Files aus. Es öffnet sich ein Datei-Auswahl-Dialog. Hier wählen Sie die von Framework Studio generierte XSD-Datei aus. Diese Datei befindet sich in dem Report Directory, der in Applications angegeben wurde.
Unter Database Files wird die XSD-Datei und darunter die darin enthaltenen Tabellen angezeigt. Jede im Report Document Type eingebundene Component wird als eine Tabelle angeboten und bekommt den Namen, den Sie angegeben haben. Ist in einer Component eine andere Component enthalten und wurde diese ebenfalls ausgewählt, wird diese als eigenständige Tabelle angeboten.
Sie können nun die gewünschten Tabellen mit einem Doppelklick auswählen. Sie werden dann in die rechte Listbox eingetragen.
Mit Next öffnet sich die Registerkarte, in dem Sie die Felder auswählen können, die der Report anzeigen soll.
Wählen Sie die gewünschten Felder mit Doppelklick oder Add aus. Mit den Pfeilen über der Liste, mit den ausgewählten Feldern, können Sie noch die Reihenfolge der Felder ändern.
Mit Next öffnen sich weitere Fenster, in denen Sie Gruppierungen, Summen, Layouts und weitere Einstellungen vornehmen können.
Mit Finish wird der Report erzeugt.
Crystal Report mit Visual Studio aktualisieren
Wenn Sie in DataSource Components oder Properties hinzufügen oder entfernen, ändert sich die Schnittstelle zum Report und somit auch die XSD-Datei. Dann ist es notwendig, dass diese Änderung dem Report mitgeteilt wird.
Dazu öffnen Sie wieder Visual Studio, legen ein leeres Projekt an oder öffnen Ihr Crystal-Reports-Projekt. Am besten fügen Sie zum Projekt den Report aus dem Report-Verzeichnis von Framework Studio hinzu. (Menu Project / Add Existing Item)
Warning
Achtung: als Dateityp geben Sie Crystal Reports an.
Rufen Sie im Field-Explorer bei Database Fields Verify Database auf.
Project2 – Microsoft Visual C#.NET [design] – Customer1.rpt*
Wenn die XSD-Dateien nicht gefunden werden, fragt Visual Studio nach, wo diese zu finden sind.
Es werden jetzt die neuen Felder hinzugefügt und die entfernten Felder gelöscht. Das Löschen kann ggf. zu Fehlermeldungen führen.
Wenn Sie neue Components eingebunden haben, können diese mit dem Befehl Add/Remove Database manuell hinzugefügt werden.
Die Klasse ReportDocument
Diese Klasse ist die Basis-Klasse aller Reports, die mit Framework-Studio entwickelt werden.
Es folgt eine Beschreibung der allgemeinen Properties und Methoden, die jeder Report besitzt.
Properties
Reports (static)
Eine Klasse, die alle, im Report-Document-Type definierten Crystal Reports, als Properties beinhaltet.
Verwenden dieser Klasse:
bei der Instanziierung des Reports
rptReport myRptReport = new rptReport( this.Global, rptReport.Reports.SpecialReport1, ExportFormat.PDF );
nachträglich setzen
myRptReport.SelectedReport = rptReport.Reports.SpecialReport2;
Auslesen der Informationen, um diese zum Beispiel in einer Auswahl anzubieten. Das erfolgt mithilfe von Reflection:
System.Type T = rptDocumentP.GetType().GetNestedType "Reports");
System.Reflection.FieldInfo [] Fields = T.GetFields
(System.Reflection.BindingFlags.Static |System.Reflection.BindingFlags.Public);
foreach (System.Reflection.FieldInfo F in Fields)
{
// den Namen auslesen
String sName = F.Name;
// Das object auslesen, um es später dem SelectedReport-Property zuzuweisen.
Object oReportType = F.GetValue (null) as
FrameworkSystems.FrameworkBase.Reporting.ReportEnum;
}
Siehe auch: Crystal Reports
UseOldLogic {get; set} (static)
Dieses boolsche Property aktiviert eine alte Logik, bei der die Reports komplett im Print-Server oder in der ReportGenerator.aspx verarbeitet werden.
Mit der neuen Logik werden mehr Verarbeitungs-Schritte direkt in der Broker-Logik durchgeführt. So werden die Daten nicht mehr als separates XML verarbeitet, sondern direkt in die Report-Datei hineingegeben und bei der Anzeige von Reports generiert der Broker schon das fertige PDF. Falls es dadurch zu Komplikationen kommt, können Sie mit diesem Schalter auf alte Logik umschalten.
Dieses Property ist statisch. Eine Änderung wirkt sich somit auf den kompletten Broker aus.
SelectedReport
Der aktuell ausgewählte Report. Die vorhandenen Reports können über das Statische Property Reports ermittelt werden.
Siehe Properties
ExportFormat
Das Format, in dem der Report ausgegeben werden soll.
Diese Einstellung wird ignoriert, wenn der Report auf einem Drucker ausgegeben werden soll.
Es gibt folgende Typen:
- RichText
- Word
- Excel
- Html32
- Html40
Verwenden des Properties:
bei der Instanziierung des Reports
rptReport myRptReport =
new rptReport( this.Global, rptReport.Reports.SpecialReport1, ExportFormat.PDF );
nachträglich setzen
myRptReport.ExportFormat = ExportFormat.Html40;
XSDFileName
Gibt den Namen der XSD-Datei zurück, die verwendet wird.
ReportDir
Gibt den Namen des Dateiordners zurück, in dem die Crystal Reports abgelegt sind.
CacheCrystalReport {get; set}
Dieses boolsche Property gibt an, ob der CrystalReport zwischengespeichert werden soll, der mit der Methode ExportReport erzeugt wird.
Wenn ein Report mehrfach verarbeitet werden soll, dann erhöht dieser Schalter die Performance, da der Report nur einmal geladen und mit Daten befüllt werden muss. Die Methoden Print und PrintToPrinter rufen intern ebenfalls die Methode ExportReport auf. Wenn man also einen Report anzeigt oder druckt und zugleich ein PDF erzeugen möchte, dann handelt es sich um eine mehrfache Verarbeitung.
Der Schalter muss vor der ersten Verarbeitung aktiviert werden.
Nach der letzten Verarbeitung muss die Methode UncacheCrystalReports aufgerufen werden. Ansonsten kann es zu Speicher-Lecks und ggf. auch zu Exceptions führen.
Ein Report sollte nicht über einen Request hinaus zwischengespeichert werden.
Beispiel-Code:
ReportDocument rd = new ReportDocument(….)
[…]
rd.CacheCrystalReport = true;
rd.PrintToPrinter(….);
btye[] bytesPDF = rd.ExportReport( ExportFormat.PDF );
rd.UncacheCrystalReport();
Methoden
List GetReportEnums()
Damit kann man aus dem ReportDocument die Liste der ReportEnums (Klasse ReportEnum) ermitteln. Diese beinhaltet je nach Angabe im ReportDocument ggf. auch die Basis-Reports.
String SetDatasource(String dsName, Object value)
Mit dieser Methode können die Datasources dynamisch gesetzt werden.
ReportEnum ConvertFileNameToReportsEnum(filename)
Diese Methode kann verwendet werden, um einen Report mit einem bestimmten Datei-Namen zu finden.
byte[] ExportReport(ExportFormat format)
Exportiert den Report in das gewünschte Format. Dabei wird der SelectedReport verwendet.
Wird diese Funktion mehrfach hintereinander aufgerufen, dann kann die Performance mit dem Property CacheCrystalReports gesteigert werden.
void UncacheCrystalReport()
Räumt den zwischengespeicherten CrystalReport auf. siehe CacheCrystalReports.
Klasse ReportEnum
Diese Klasse repräsentiert einen Crystal Report.
Properties
Orientation
Landscape, Portrait, Default (Wird bei der Code-Generierung aus der Crystal Report-Datei ermittelt.)
String Name
Der interne Name des Reports.
String ReportFileName
Der Dateiname des Reports (ohne Pfad)
IMLString MLCaption
Mehrsprachige Bezeichnung des Reports. (Siehe auch String GetCaption(IFSGlobalObject globalObj)).
Methoden
String GetCaption(IFSGlobalObject globalObj)
Gibt die Bezeichnung des Reports (Caption) für die aktuelle Sprache im GlobalObj zurück. Da der ReportEnum aus einer statischen Struktur kommt, kennt er selber kein GlobalObject. Deshalb muss dieses übergeben werden, um die Caption in der richtigen Sprache zu ermitteln.
Beispiel für die Verwendung von ReportEnum:
foreach( ReportEnum oReportEnum in rptDocumentP.GetReportEnums() )
{
cPrintReportName oPrintReportName = new cPrintReportName(this.Global);
oPrintReportName.sReportName = oReportEnum.ReportName;
oPrintReportName.sReportCaption = oReportEnum.GetCaption( this.Global );
oPrintReportName.sReportFileName = rptDocumentP.ReportDir + "\\"
+ oReportEnum.ReportFileName;
oPrintReportName.oReportName = oReportEnum;
oPrintReportName.intPaperOrientaion = (int)oReportEnum.Orientation;
this.Add(oPrintReportName);
}
Klasse PrintServer
Diese Klasse dient zum einen dazu die bestehenden Print-Server zu ermitteln und zum anderen um Transaktionen an einem Print-Server zu steuern.
Methode GetPrintServers()
public static IList<PrintServer> GetPrintServers(IGlobalObjects global)
Liefert eine Liste der an der Runtime-Datenbank registrierten Print-Server zurück.
IList<PrintServer> PSList = PrintServer.GetPrintServers(this.Global);
foreach (PrintServer PS in PSList)
{
// PS
}
Methode GetPrinters( )
public IList<Printer> GetPrinters( );
IList<PrintServer> PSList = PrintServer.GetPrintServers(this.Global);
foreach (PrintServer PS in PSList)
{
IList<Printer> Plist = PS.GetPrinters( );
}
public static IList<Printer> GetPrinters( IGlobalObjects global, guid printServerId )
IList<PrintServer> PSList = PrintServer.GetPrintServers(this.Global);
foreach (PrintServer PS in PSList)
{
IList<Printer> Plist = PrintServer.GetPrinters( this.Global, PS.PrintServerId);
}
Klasse PrintQueue
Diese Klasse bietet Methoden an, mit denen die Print-Queue ausgewertet und bearbeitet werden kann.
Methode GetState( )
public static int GetState( IGlobalObjects global, guid printJobId )
Diese Methode liefert den Status des Druckauftrags mit der übergebenen PrintJobID zurück. Dabei wird der Status der den Druckauftrag umklammernden Transaktion zurückgegeben.
- Transaktion ist offen. Es können weitere Druckaufträge zur Transaktion hinzugefügt werden.
- Transaktion ist bereit zu drucken. Alle Druckaufträge sind hinzugefügt und der Printserver kann mit dem Druck beginnen.
- Der Druck läuft gerade.
- Druckauftrag ist abgeschlossen.
- Der Druckauftrag wurde mit einem Fehler beendet.
int Status = PrintQueue.GetState( this.Global, new guid( sPrintJobID ) );
Methode GetDocumentOut( )
public static byte[] GetDocumentOut( IGlobalObjects global, guid printJobId )
Diese Methode liefert das herausgeschriebene Dokument.
Dazu muss der Druck mit dem Kommando Out ausgeführt worden sein und der Status des Druck-Jobs muss 3 sein.
byte[] PdfBytes = PrintQueue.GetDocumentOut( this.Global, new guid( sPrintJobID ) );
Method Delete( )
public static void Delete( IGlobalObjects global, guid printJobId )
Diese Methode löscht den Datensatz aus der Print-Queue. Handelt es sich dabei um den letzten Eintrag für eine Transaktion wird diese ebenfalls mit gelöscht.
if (PrintQueue.GetStatus( this.Global, guid( sPrintJobID) ) == 3 )
{
PrintQueue.Delete( this.Global, new guid( sPrintJobID) );
}