Geschrieben von: Rudolf Ball
Kategorie: ADO.NET
This printed page brought to you by AlphaSierraPapa
DataSets bieten sich als Quelle für den Inhalt eines Reports an, da sie von der Datenbank disconnected sind. Doch es ist ein wenig knifflig, dieses DataSet hinter den Report zu schieben. Wie man einen solchen Report erstellen kann, lernen Sie heute im zweiten Teil dieser Artikelserie.
Für einen Systemüberblick lesen Sie bitte den ersten Teil dieser Artikelserie.
Die Erstellung des Reports geschieht über einen Wizard. Wenn wir einen neuen Report hinzufügen ("Add new Item" -> "Crystal Report") müssen wir uns zuerst entscheiden, ob wir den Report Expert oder eine leeren Report erzeugen wollen. Der Einfachheit halber entscheiden wir uns für den Expert.
Nun, da wir in weiterer Folge keine Datenbank zu Grunde liegen haben, sondern ein DataSet, müssen wir dem Report dessen Struktur mitteilen. Da wir dem Report aber nicht sagen können "Nimm DataSet XY!" (da wir dieses noch nicht einmal erzeugt haben - dies geschieht erst zur Laufzeit), müssen wir uns eines Abbildes der Struktur des DataSets bedienen: einem XML Schema. XML Schemas (Extension .xsd) beschreiben die Struktur von XML Files und somit auch von DataSets.
Da wir dieses XML Schema File nur genau einmal zur Definition der Datenstruktur unseres DataSets im Report benötigen bieten sich zwei Möglichkeiten an, das File zu erzeugen. Einerseits zur Laufzeit mittels einer "File.Exists" Abfrage, welche nur beim ersten Mal feuert. Wir benötigen das XML Schema jedoch zur Designzeit. Daher ist es nützlich, eine kleine und schnelle Applikation zu schreiben, welche uns vom gewünschten DataSet ein XML Schema erzeuget, und wir nach Erzeugung dessen ungestört mit dem Design fortfahren könnten. Der Code für diese Konsolenapplikation folgt.
In die Konsolenapplikation DataSet2XSD müssen wir die Datenklasse DataSet4Report kopieren, um das gleiche DataSet zu erhalten. Die Main Methode sieht wie folgt aus.
static void Main(string[] args) { try { DataSet4Report myDS4R = new DataSet4Report(); DataSet myDS = myDS4R.Kochrezept(1); myDS.WriteXmlSchema("C:/inetpub/wwwroot/DataSet4Report/Kochrezept.xsd"); } catch (Exception ex) { Console.WriteLine(ex.Message); Console.ReadLine(); } }
Als erstes erzeugen wir eine Instanz unserer Klasse DataSet4Report und füllen ein DataSet mit Hilfe der Methode Kochrezept. Der Export als XML Schema ist trivial und erfolgt über die Methode WriteXmlSchema. Der Eingabeparameter ist in diesem Fall unser lokaler Pfad am Webserver. Nun können wir mit dem Design unseres Reports fortsetzen.
Über "More Data Sources" gelangen wir in den Menüpunkt "ADO.NET (XML)".
Hier hilft uns ein Dateidialog, das soeben erzeugte XML Schema zu finden.
Nach Auswahl der Datei Kochrezept.xsd werden uns die Tabellen des DataSets präsentiert.
Hier müssen wir die Tabellen "Rezept" und "Zutaten" markieren und mittels "Insert Table" hinzufügen. Nach dem Klick auf "Next" gelangen wir auf folgende Seite.
Hier wird uns die Struktur der Tabellen und vor allem deren Relationen angezeigt. Sollten wir noch kein Relationsobjekt erstellt haben hätten wir hier die Möglichkeit, dies manuell nachzuholen.
Im nächsten Schritt müssen wir die Felder definieren, die wir am Report anzeigen wollen. Mittels "Add" wählen wir aus der Tabelle Rezept "Rezeptname" und "Zubereitungszeit" und aus der Tabelle Zutaten "Zutat" und "Kosten". Somit haben wir alles Wichtige angegeben und können uns auf das Design des Reports konzentrieren. Hierzu müssen wir einen "Detail" Bereich einfügen und Zutat und Kosten in selbigen einfügen. Dies geht entweder durch Verschieben oder durch "Drag and Drop" vom Field Explorer auf der linken Seite. Sollten Sie links keine Field Explorer sehen, verzweifeln Sie nicht: Sie können ihn über View -> Other Windows -> Document Outline bzw. Ctr + Alt + T aktivieren. Eine Lösung hierfür würde wie folgt aussehen.
Somit haben wir alle Schritte ausgeführt, welche zum Erreichen des Ergebnisses von Nöten sind. Mit dieser Formatierung würde der Report wie der folgende Beispielreport aussehen.
Sie können das Rezept natürlich nachkochen, dafür übernehme ich jedoch keine Verantwortung...
Natürlich bietet es sich nicht in jedem Fall an, ein DataSet als Quelle für den Report zu verwenden. Vielmehr ist bei der Anzeige von nicht hierarchischen Daten eine direkte Anzeige der Datenbanktabelle bzw. Query einfacher. Auch ist die Anzeige in Crystal Reports nicht immer die optimale Lösung, Konkurrenzprodukte sind meist mächtiger und besser handzuhaben. Natürlich ist der Export von Crystal Reports ins Word- oder PDF Format eine gelungene Alternative.
Ein DataSet hinter Crystal Reports zu schieben ist eine gute Alternative zur Direktverbindung mit der Datenbank. Es ist zwar ein wenig aufwendiger, aber es lohnt sich vor allem dann, wenn Sie mehrere Reports anzeigen wollen oder hierarchische Daten einfach und sicher angezeigt bekommen möchten. Auch die Manipulation der Daten vor dem Anzeigen ist ein Punkt, der Ihnen womöglich schon Kopfzerbrechen bereitet hat.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20030403.zip
Crystal Reports mit DataSets befüllen - Teil 1
http:/www.aspheute.com/artikel/20030402.htm
Datenbankzugriff mittels ADO.NET
http:/www.aspheute.com/artikel/20001102.htm
Was sind XML Schemas?
http:/www.aspheute.com/artikel/20010514.htm
Creating Professional Reports using Crystal Report for Visual Studio.NET
http://www.aspalliance.com/articles/cr1.aspx
Crystal Report 9 – The Visual Studio .NET Reporting Standard
http://www.crystaldecisions.com/products/crystalreports/net/
Crystal Report for Visual Studio .NET
http://www.aspfree.com/authors/jitajay/crystalreport.aspx
Loading a DataSet with Data from Multiple Tables
http://www.dotnetjunkies.com/tutorials.aspx?tutorialid=465
XML Schemas vs. DTDs
http://www.fawcette.com/xmlmag/2002_04/online/online_eprods/xml_dwahlin04_22/default.asp
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.