Guten Morgen @ all,
meine letzten beiden Wochen habe ich nun angebrochen und so langsam aber sicher geht mein Praktikum zu Ende. Echt schade …. Aber was solls ….
Dreizehnte Woche == Unglückszahl ??? Bei mir jedenfalls nicht. ;-) Diese Woche hatte es in sich gehabt. Eigentlich könnte ich dieser Woche eine Überschrift gegeben, die wie folgt lautet:
Crystal Report und Images (von einem MapServer)
Dies war meine Aufgabe. Ich sollte mich belesen, ob es nicht möglich wäre Bilder von einem MapServer in einem Report darstellen zu lassen. Gesagt, getan. Nein, so einfach war es auch wieder nicht. Ich habe mich erst mal damit befasst, wie man denn ein (statisches) Bild in einem Report Dokument anzeigen lassen kann. Im Internet habe ich dazu auch viele Beispiele gefunden, doch leider bezogen sich diese immer auf eine Datenbank (Access). Somit half mir das kein bisschen weiter. Nach etlichen Seiten, habe ich dann ein passendes Beispiel für mich gefunden. Doch dieses war so kompliziert beschrieben und setze ein Grundwissen voraus, dass ich das Dokument noch dreimal lesen musste, ehe ich es verstanden habe. Denn sie schrieben auch von DataTable und der gleichen. Und ich war immer der Meinung, dass sie ebenfalls eine Datenbank verwenden. Dies war aber falsch. Denn das Objekt Datatable wird für den Crystal Report verwendet und ist eine Art Tabelle. Auf alle fälle, habe ich das Beispiel hinbekommen und Crystal Report zeigt mir nun ein Bild an. Das wie folgt abläuft:
- Zuerst legt man sich ein neues DataTable an, was im Allgemeinen ein XSD-Dokument ist (wenn man es ohne DB machen will). In diesen beschreibt man, welche Daten im Crystal Report angezeigt werden sollen. Wichtig ist nur, wenn man ein Bild darstellen will, dass man System.Byte[] als Spaltendeklaration selektieren muss!
- Dann fügt man ein neues Report Dokument zu seinem Projekt hinzu und selektiert das XSD-Dokument als Datenquelle. Somit weiß Crystal Report, welche Spalten für das Dokument benötigt werden.
- Hinzufügen des Crystal Reports Viewer zu seinem Windows Form und wählt als Report Dokument, was man eben angelegt hat.
Dann musste man nur noch angeben, wo das Bild liegt und das wars. Ist nicht ganz richtig, denn das Bild musste als Byte-Stream umgewandelt werden. Aber das war dann keine so große Schwierigkeit.
Damit habe ich meine erste Teilaufgabe erledigt. Dadurch, habe ich das Prinzip verstanden, wie es nun möglich ist, ein Bild in Crystal Report zu bringen. Nun kommen wir zu eigentlichen Aufgabe; wie kann ich dieses mit dem MapServer machen. Nach kurzem studieren der Dokumentation, hatte ich schnell den dreh raus, wie man eine URL zu dem Bild erhält, was sich in einem temporären Ordner befindet. Dies erinnerte mich stark an die alten Zeit des UMN-MapServer. Jedenfalls hatte ich den Verweis zu meinem Bild und habe dieses, nach dem gleichen Prinzip wie oben, in meinem Crystal Report dargestellt. Was mich auch erfreute und viel Spass gemacht hatte.
Das Ergebnis meiner Arbeit habe ich meinem Arbeitskollegen gezeigt und er war mächtig beeindruckt, dass das auch geht. Denn er selber hatte auch keine Ahnung von Crystal. Aber das war noch nicht alles. Er hatte gemeint, dass ich versuchen solle, meinen eigenen ADO.NET Data Provider schreiben solle, der von dem MapServer her automatisch das Bild generieren solle. Im Endeffekt, soll damit die XSD-Datei wegfallen.
Okay, habe ich mir gedacht, warum nicht? Ich habe auch soviel Ahnung von C# und ADO.Net Data Providern. Ganz zu schweigen von Crystal Report. Also habe ich wieder ein bisschen gegoogelt und versucht zu verstehen, wie man seinen eigenen ADO.NET Data Provider programmieren kann. Diesmal half mir das Internet nicht und ich musste auf die MSDN-Hilfe zurückgreifen, die einen eigenen .NET Data Provider programmiert haben. So ganz geheuer war mir dies nicht, denn die haben mehrere Klassen geschrieben, die „nur“ Interface Klassen von anderen Klassen waren und mussten all die Methoden in ihrer Klasse überschreiben. Es waren mehr get- und set-Methoden enthalten als alles andere. Zum Glück hatten sie auch ein Beispiel Klasse gehabt, wie man die anderen Klassen aufgerufen kann. Doch dies Beispiel bezog sich wieder auf eine Datenbank, was mir nicht richtig weitergeholfen hatte. Somit habe ich dann ein bisschen herumexperimentiert und herausgefunden, dass ich die Methode IDataReader verwenden kann. Denn Crystal Report hatte diese Methode als ADO.Net-Schnittstelle erkannt. Komischerweise gingen die anderen Methoden nicht, sondern nur diese. Jedenfalls habe ich diese Methode so erweitert, dass ich mein eigenes DataTable erzeugt habe und darin dann all meine Tabellen, mit den zugehörigen Parametern gefüllt habe. Sprich, mit dem Ergebnis von dem MapServer. Diesmal brauchte ich das Bild nicht in ein Byte umwandeln, denn ich hatte in der Dokumentation gelesen, dass das auch der MapServer machen kann. Dadurch habe ich mir eine Methode gespart! ;-)
Das testen ist auch erfolgreich gelaufen und ich bin zufrieden und glücklich in mein verdientes Wochenende gestartet.
In diesem Sinne,
Hagen
Keine Kommentare:
Kommentar veröffentlichen