Als Entwickler mit Delphi-Background habe ich die ganzen Jahre schon im Punkt Report-Generatoren etwas neidisch auf die Konkurrenz geschaut. Crystal Reports ist mit über vier Millionen verkauften Lizenzen das Report-Tool schlechthin, wobei man hier bei exakter Betrachtung zwischen den Einsatzfällen Endanwendung und Entwickler unterscheiden müsste. Bereits beim Setup - vorausgesetzt, Sie wählen die Custom Installation-Option - wird deutlich, dass Crystal Reports nicht nur auf die Microsoft-Entwicklungsumgebungen fixiert ist. Immer dann, wenn zum Beispiel auch Borland Delphi in Version 2 bis 7 vorgefunden wird, bietet das Setup von Crystal Reports 9 Advanced Edition die Installation der entsprechenden Programmierschnittstellen an. Zwar unterstützt Crystal Reports 9 offiziell nur die Delphi-Versionen 2 bis 6, aber die im Sourcecode vorliegenden VCL-Komponenten lassen sich nach einer kleinen Anpassung (siehe Kommentarzeilen im Beispielprojekt D7CRPEDemo.dpr auf der CD) auch in Delphi 7 installieren.
- Microsoft Visual Studio .NET
- Crystal Reports 9
- Crystal Enterprise Report Application Server (oder mindestens das RAS-SDK)
Ich hatte schon darauf hingewiesen, dass Crystal Reports sehr gut die Evolution in unserer Branche demonstriert. Diese betrifft zwei unterschiedliche Bereiche: Zum einen die Anwendungs-Architektur selbst, da die verschiedenen Modelle 1-Tier (alles in einer Anwendung), 2-Tier (alias Client/Server) und 3-Tier (alias Three-Tier) gleichermaßen unterstützt werden. Selbstverständlich darf auch das Thema Web Service nicht fehlen - der nun unterstütze Report Web Service dient als Reportquelle sowohl für Windows- als auch für Webanwendungen. Aber auch in Bezug auf die Programmierschnittstellen ist die Evolution deutlich erkennbar, nachdem man sich erst einmal einen Überblick verschafft hat. Abpictureung 2 zeigt, welche Optionen zur Wahl stehen. Dieses komplexe Gepicturee kann man in drei Teile untergliedern: COM, Java und .NET.
Damit das für Sie nicht nur leere Worthülsen bleiben, demonstriert jeweils ein kleines Beispiel die ver-schiedenen Zugriffswege. Dabei greife ich für CRPE und RDC auf Borland Delphi 7 zurück und für die .NET-Fassung auf Microsoft Visual Studio .NET. Bei dieser Gelegenheit gehe ich auch auf die erstaunliche Flexibilität von Crystal Reports 9 in Bezug auf die Datenquelle ein.
VCL-Komponente für die CRPE
Wenn das vom Crystal Reports 9-Setup abgelegte Package in Delphi installiert wird, steht die VCL-Komponente TCrpe zur Verfügung. Das folgende Beispiel demonstriert, dass eine Handvoll Programmzeilen ausreichen, um die Report-Vorschau im eigenen Programmfenster anzuzeigen. Nachdem eine TPanel-Instanz als Eltern-Fenster sowie die Report-Datei zugewiesen wurden, legt die DatabaseName-Eigenschaft die auszulesende Datenbankdatei fest. Wird dann die Methode Execute aufgerufen, kann der angezeigte Report entweder aus-gedruckt oder in den Formaten PDF, DOC, XLS, HTML oder XML (um nur einige zu nennen) exportiert werden:Crpe1.WindowStyle.BorderStyle := bsNone;Crpe1.WindowParent := Panel1;Crpe1.ReportName := sAppPath + 'OSD7CR9.rpt';Crpe1.Connect.DatabaseName := sAppPath + 'OSCR9DEMO.mdb';Crpe1.Execute;
RDC und ActiveX-Viewer
Der neue Zugriffsweg führt Sie direkt in das Objektmodell von RDC, sodass der erste Schritt darin besteht, die Typbibliothek von Report Designer Component 9 (RDC) zu importieren. Da nun die Report-Vorschau über ein separates ActiveX-Control läuft, muss als zweiter Schritt auch das Crystal Reports Viewer Control 9 (Version 9.2) installiert werden. Über die dabei von Delphi angelegten Unit-Dateien CRVIEWER9Lib_TLB.pas und CRAXDDRT_TLB.pas greift das nächste Beispiel direkt auf die COM-Objekte zu (siehe Listing 1). Nachdem eine Instanz des Application-Objekts von RDC angefordert wurde, öffnet die OpenReport-Methode die Report-Datei. Allerdings greift mein zweites Beispiel nicht direkt auf die Datenbank zu, sondern nutzt ein bereits gefülltes Recordset-Objekt von ADO als Datenquelle. Da man ein Recordset völlig unabhängig von einer Datenbank direkt im Programm neu definieren und mit Daten füllen kann, steht so ein verblüffend einfacher Weg zur Verfügung, um beliebige Daten an den Report zu übergeben. Außerdem hat der Zugriff über das Recordset den Vorteil, dass man völlig unabhängig von den Datenbank-Treibern von Crystal Reports ist und an dieser Stelle nichts dazulernen muss:Listing 1
varaCRApp : IApplication;aCRRpt : IReport;aCRDB : IDatabase;beginaCRApp := CoApplication.Create;aCRRpt := aCRApp.OpenReport(sPath, 0);aCRDB := aCRRpt.Database;// bereits gefülltes Recordset-Objekt als Datenquelle nutzenaCRDB.SetDataSource(FRecordSet, 3, 1);CRViewer91.ReportSource := aCRRpt;CRViewer91.ViewReport;end;
Crystal Reports 9 und .NET
Ein kurzer Blick auf Abpictureung 4 macht deutlich, wie Crystal Reports die Integration in .NET intern umsetzt. Für die Vorschau greifen sowohl die Web Forms (ASP.NET) als auch die Windows Forms auf die selbe Quelle zu. Die Trennung zwischen der Report-Quelle und dem Managed Wrapper der Engine macht Sinn, da sich zwischen diesen beiden Schichten auch eine Rechnergrenze befinden darf - wobei in diesem Fall die Daten über HTTP transportiert werden. Der Wrapper selbst stellt in der .NET-Welt das Objektmodell für die Crystal Reports Print Engine (CRPE) zur Verfügung, die auch in .NET der Hauptbestandteil des Ganzen bleibt.
- Neues Projekt einer Windows Application
- Neuen Crystal Reports hinzufügen (Solution Explorer | Add New Item)
- Standard Report Creation Wizard konfigurieren
- CrystalReportViewer-Komponente von der Toolbox auf dem Formular ablegen
Private Sub Form1_Load(ByVal sender As Object, _<br></br> ByVal e As System.EventArgs) Handles MyBase.LoadCrystalReportViewer1.ReportSource = New OSCustomerDemo1()End Sub
Listing 2
Private Sub Form1_Load(ByVal sender As Object, _ <br></br> ByVal e As System.EventArgs) Handles MyBase.Load' Step 1: Login-Daten übergebenDim aCREngTbl As CrystalDecisions.CrystalReports.Engine.TableDim aCRTLOI As CrystalDecisions.Shared.TableLogOnInfoFor Each aCREngTbl In osLoginDemo21.Database.TablesaCRTLOI = aCREngTbl.LogOnInfoWith aCRTLOI.ConnectionInfo.ServerName = "(local)".UserID = "sa".Password = "sa".DatabaseName = "Northwind"End WithaCREngTbl.ApplyLogOnInfo(aCRTLOI)Next aCREngTbl' Step 2: ReportSource verbindenCrystalReportViewer1.ReportSource = osLoginDemo21End Sub
Gibt es aber auch ein vergleichbares Gegenstück zu meinem Recordset-Beispiel für RDC? Selbstverständlich - wie das nächste Beispiel zeigt. Nachdem das DataSet OsDatasetReport1 mit dem Ergebnis der SELECT-Abfrage aus der Datenbank gefüllt wurde, füge ich zur Demonstration im Programm zwei neue Datensätze hinzu, wobei als Land jeweils die Zeichenkette S&S eingetragen wird. Die ReportDocument-Komponente wird auch hier dazu genutzt, die Datenquelle festzulegen. Beim Aufruf der Methode SetDataSource übergebe ich den Namen der gefüllten DataSet-Instanz, sodass der Viewer auch die beiden neu hinzugefügten Datensätze anzeigt (siehe Abb. 5). Außerdem demonstriert dieses Beispiel, wie das Ergebnis auch als PDF-Datei direkt aus dem Programm heraus exportiert werden kann (siehe Listing 3).
Listing 3
Private Sub Form1_Load(ByVal sender As Object, _<br></br> ByVal e As System.EventArgs) Handles MyBase.LoadSqlDataAdapter1.Fill(OsDatasetReport1)' Zum Test 2 neue Datensätze dem DataSet hinzufügenOsDatasetReport1.Customers.AddCustomersRow("KOSCH", "OssiSoft", "Andreas Kosch", _"Entwickler", "Irgendwo", "Überall", "Thüringen", "99869", "S&S", "leer", "leer")OsDatasetReport1.Customers.AddCustomersRow("DYNDS", "DataRow:", "Dynamisch generiert", _"Laufzeit", " ", " ", " ", " ", "S&S", " ", " ")' Erweitertes DataSet als Datenquelle für den Report zuweisenosCustomerDemo11.SetDataSource(OsDatasetReport1)CrystalReportViewer1.ReportSource = osCustomerDemo11' Report als PDF-Datei exportierenMessageBox.Show("Export als PDF-Datei wird gestartet...", "Crystal Report 9")Dim aCRDFDO As New CrystalDecisions.Shared.DiskFileDestinationOptions()Dim sFileName As String = "C:\Temp\DataSetReport.pdf"aCRDFDO.DiskFileName = sFileNameWith osCustomerDemo11.ExportOptions.ExportDestinationType = _CrystalDecisions.Shared.ExportDestinationType.DiskFile.ExportOptions.ExportFormatType = _CrystalDecisions.Shared.ExportFormatType.PortableDocFormat.ExportOptions.DestinationOptions = aCRDFDO.Export()End WithMessageBox.Show("...Export als PDF-Datei ist fertig!", "Crystal Report 9")End Sub
Report Web Services (RWS)
Den Abschluss pictureet ein Beispielprojekt für einen Report Web Service, auf den sowohl eine ASP.NET-Anwendung (Web Forms) als auch eine Windows-Anwendung zugreifen, um das Ergebnis im Report Viewer anzuzeigen. Mit diesem Satz ist auch die Katze aus dem Sack: Ein RWS muss immer an den Crystal Reports Viewer gebunden werden. Dafür wird er aber kinderleicht zusammengebaut. Es reicht aus, sofort nach dem Anlegen eines neuen ASP.NET Web Service-Projekts eine bereits vorhandene RPT-Datei über den Solution Explorer hinzuzufügen und über die rechte Maustaste als Web Service zu veröffentlichen (Menüpunkt Publish as Web Service). Sowohl bei einem Web Form als auch bei einem Windows Form stellt die Toolbox die Komponente CrystalReportViewer zur Verfügung, sodass über deren Eigenschaft ReportSource entweder direkt die URL des Web Services als Zeichenkette übergeben wird oder aber über die über New angeforderte Instanz der Proxy-Klasse, welche VS .NET beim Import des Web Services automatisch generiert hat. Abpictureung 6 zeigt das Ergebnis - sowohl die vom Report Web Service verwendete RPT-Vorlage als auch die vom Report ausgewertete Datenbank stammt aus einem Beispielprojekt für den Report Application Server (RAS).
Was gibt's Neues in Crystal Reports 9?
Mit Version 9 von Crystal Reports erhebt Crystal Decisions den Anspruch, jedem Benutzer überall und zur jeden Zeit über ein beliebiges Gerät die Darstellung und Analyse von Daten zu erlauben. Je nach der Produktversion (Standard, Professional, Developer oder Advanced Edition) stehen dazu verschiedene Optionen und Werkzeuge bereit. Über eine Repository-Datenbank werden zum Beispiel Vorlagen und Funktionen effektiv wiederverwendet und auch die Smart Tags von Microsoft Office werden unterstützt. Für eine vollständige Auflistung aller Neuheiten und die Unterschiede zur bereits in VS .NET integrierten Version reicht der Platz nicht aus - auf den Webseiten von Crystal Decisions (siehe [1]) können Sie Ihren Informationshunger jederzeit stillen.Auf der CD-ROM finden Sie zwei Beispielprojekte für Delphi und 7 Beispielprojekte für VS .NET vor. Selbst dann, wenn Ihnen Crystal Reports 9 nicht zur Verfügung steht, lässt sich die Hälfte der .NET-Beispiele auch mit der standardmäßig in VS .NET integrierten Crystal Reports-Version nachvollziehen.


