Anmelden

Allgemeines

Die kostenlose (?) CR-Java-Umgebung ist ein Java-basierte vollwertige plattformunabhängige Reportingumgebung, d.h. einschließlich Entwurfs- und Laufzeituntertützung. 

Die Reportingumgebung ist hinsichtlich des Report-Formates (*.rpt) kompatibel mit den professionellen nativen Windows-Umgebungen. Im Vergleich zu den professionellen Umgebungen ist aber der Support (Dokumentation, Online-Beiträge) hinsichtlich Reportentwurf, Installation und Programmentwicklung eher unbefriedigend.

Folgende Links haben uns weitergeholfen:

Informationen zu spez. Problemen

Tutorials

http://scn.sap.com/docs/DOC-31247?source=email-g-bi-newsletter-20120914

Hinweise für Designer

Report in Eclipse erstellen

Mit Erstellung eines Reports wird die Datenbankverbindung (i.d.R. der Entwicklungsumgebung) im Report hinterlegt. Dies ist sinnvoll, da in dieser Phase die verfügbren Tabellen/Sichten und Datenfelder ermittelt werden müssen und der Report direkt in der Entwicklungsumgebung getestet wird, d.h. keine programmtechnische Versorgung von Einstellungen (Datenbankverbindung, Filterkriterien) erfolgt.

Erstellung und Parametrisierung von SQL-Abfragen

Zunächst erstellt man im Data Source Explorer eine Datenquelle. Dann erstellt man aus einem SQL-File eine Sicht oder Abfrage. Das SQL-File (oder das SQL Scrapbook) ist erforderlich im SQL-Statement im Report zu hinterlegen. Die Tabelle oder Sicht taucht danach im Field Explorer auf, aus dem dann die Felder in der Report übernommen werden. Anschließend kann man die SQL-Abfrage bearbeiten und die Datenquelle aktualisieren (hinzufügen von Feldern).

Die Arbeitsschritte in Eclipse sind:

  • Erstellen der SQL-Abfrage, Testen und Einsetzen in den Report
  • Erstellen von Parametern im Field Explorer
  • Erstellen eines Record Filter, bestehende Parameter werden bei der Werteauswahl angeboten.

SQL-File/ Record Filter

Parameter und Record Filter werden für die Datenselektion benötigt. Allerdings wird der über diesen Weg erstellte Filter nicht per SQL serverseitig sondern im Code ausgeführt. Bei großen Datenmengen ist das ein echtes Problem, weil per SQL die ungefilterte Datenmenge abgefragt wird.

Direktbindung

Wenn man degegen den Report direkt an eine Tabelle oder View bindet (ohne SQL-Abfrage, Field Explorer > Set Datasource Location...), dann wird zur Laufzeit ein SQL-Befehl mit Record-Filter erzeugt (betrifft Haupt- und Unterberichte). Damit ist das Performance-Problem gelöst. Man hat aber nicht mehr den Komfort, im Report SQL zu schreiben, muss also alle Abfragen über spezielle Views erstellen. Es dadurch nicht mehr möglich, beliebige SQL-Ersetzungen vorzunehmen. 

Eine weitere Besonderheit ist, dass bei den Bindungen über Set Datasource Location das Datenbankschema (PostgreSQL) in den Report eingebaut wird (public.myview), was möglicherweise auch abhängig vom DB-Treiber ist. Im zutreffenden Fall ist der Report nicht auf einem System mit anderslautendem Datenbankschema ausführbar.

SQL-Manipulation per API

Ein anderer Weg führt über die API-technische Änderung der SQL-Befehle im Bericht vor oder zur Laufzeit. Diese Variante ist insofern problematisch, das die Berichstvorschau davon nicht tangiert wird.

CR-Designer JDBC-Unterstützung

Außerdem könnte es möglich sein, mit dem kommerziellen CR Designer (welcher eine SQL-Parametrisierung unterstützt) und der JDBC-Unterstützung (die notwendig ist, wenn der Datenquellenpfad im Report festgelegt werden muss) zu arbeiten. Eventuell kann man auch ohne JDBC-Unterstützung zur Entwurfszeit auskommen und den Datenquellenpfad API-technisch zur Laufzeit einsetzen.

Report Design

Pro Report (Hauptreport oder Unterreport) kann immer nur eine Datenquelle deklariert werden. Durch Unterreports ist es möglich, in eine Report mehrere Datenquellen /Tabellen oder Sichten) abzurufen.

Subreport hinzufügen (Eclipse)

  • Sektion erzeugen und Supreport erzeugen, formatieren (Ränder, Position), umbenennen
  • SQL-File erstellen,
    • Abfrage eingeben
    • Verbindung auswählen (Type, Name, Database)
    • Abfrage testen,
    • Abfrage in Subreport einsetzen/ersetzen
  • Subreport mit Feldern bestücken
  • Subreport Link erstellen: Auswählen der Felder im Haoutreport und Subreport

Hiweise:

  • Titel für Subreport links neben Daten setzen:
    • Variante 1: den Body mit einem statischen Textfeld versehen und Suppress if Duplicated auf True setzen. Damit wird das Textfeld nur für den ersten Datensatz ausgegeben.
    • Variante 2: Sektionen überlagern, Titel in eine Sektion davor setzen und diese Sektion der feolgenden unterlagern mit Underlay Followin Sections

Hinweise für Entwickler

Reportabruf mit einem Java-Projekt

Das Java-Pogramm ist notwendig, um den Reportabruf programmtechnisch in ein Applikatonen einzubinden, die nicht auf Java basiert (PHP, NET). Hierbei wird ein Java-ausführbares Programm erzeugt, welches von der Hauptapplikation per Systemaufruf ausgeführt wird (alternativ sind Java-Webapplikationen denkbar, welche z.B. per Webservices aufgerufen werden können).

Dem Java-Pogramm wird die Vorlagedatei (*.rpt) sowie Einstellungen (Datenbankverbindung, Filterkriterien, Ausgabewerte) übergeben. Das Java-Programm erzeugt den PDF-Report und liefert diesen im Dateisystem oder den Output-Stream ab. Zweiteres ist für webbasierten Reportabruf geeignet, ohne im Server PDF-Dateien zwischenspeichern zu müssen.

Erstellung des Java-Projektes

Projektvorlage CR Java Project. oder leeres Java Projekt

Dynamische Versorgung der Datenbankverbindung (Server, Datenbank, Nutzerkonto)

Die dynamische Versorgung der Datenbankverbindung ist aber erforderlich, weil Entwicklungsplattform und Laufzeitplattform häufig getrennt sind und verschieden konfiguriert sind. 

Dynamische Versorgung der Datenbankverbindung (Servername, port, Datenbankname) ist aktuell noch nicht geklärt. Laut Dokumentation kann die ConnectionInfo mittels setUsername(), setPassword(), setAttributes() verändert werden, wirkt sich nicht aus. Dafür sollte es aber eine Lösung geben, jedoch ist die nicht erkennbar, weil es zu diesem Problem kaum Entwicklererfahrung gibt und außerdem das Framework unübersichtlich und schlecht dokumentiert ist. Ein Workarround besteht zumindest bei gleichem Datenbankname durch IP-Aliase (hosts-Datei).

Die Dynamische Versorgung von Nutzername und Kennwort ist aber wie folgt möglich:

reportClientDocument.getDatabaseController().logon("postgres", "postgres");

siehe auch Links oben. Eventuell kann man auch mit JNDI oder ODBC operieren, wobei die Konfiguration außerhalb des Reports gespeichert wird. gibt es einen plattformunabhängige JDBC-ODBC-Bridge (sun.jdbc.odbc.JdbcOdbcDriver)?

Datenselektion durch dynamische Parameterübergabe

Zur Laufzeit können die Parameterwerte relativ einfach programmtechnisch gesetzt werden über folgeden Ausruf, wenn man es erstmal geschaft hat die Parameter und Filter in den Report einzubauen (siehe oben):

reportClientDocument.getDataDefController().getParameterFieldController().setCurrentValue("", "ID", 1);

Direkte Datenausgabe

Häufig bietet es sich an, mit direkt auszugebende Daten (welche ausschließlich programmtechnisch, nicht per SQL bereitgesellt werden können oder dies zu aufwendig wäre) zu operieren: Ausgabedatum, Stand der Daten, Pfad der Vorlagedatei, Kopfbild, Datenselektion.

Ausführen des Java-Projekt über Kommandozeile

Aufruf eines Java-Programmes erfolgt über:

java [-classpath ...] {Klassenname} [{Parameter}]

Der Klassenname wird ohne Erweiterung (*.class) angegeben. Die Class-Datei muss sich im lokalen Pfas oder Klassenpfad befinden. Im Klassenpfad müssen alle Verzeichnisse oder Archive (*.jar) angegeben werden. Dazu gehören die des JRE und des CR-Java-Runtime. Möglicherweise lassen sich diese bzw. häufig benötigte auch als Umgebungsvariable CLASSPATH ablegen. Die Liste der benötigten Verzeichnisse oder Archive ist aber nicht feststehend und teilweise ziemlich lang.

Die java-VM muss sich im Programmpfad befinden (PATH Variable). Das Erkennt man daran, dass man auf der Kommandozeile bei Aufruf von java Hilfeinformationen erhält. Desweiteren ist zu beachten:

  • java -cp . {ClassName} (cp muss vor ClassName stehen)
  • unter Linux Pfade in -cp oder CLASSPATH mit : trennen anstelle ;
  • -cp überschreibt CLASSPATH, es kann also nur ein Angabe genutzt werden
  • relative Verzeichnisangabe im CLASSPATH oder -cp möglich
  • die Java-eignene Packages müssen nicht angeggeben werden.
  • die ungepackten Applikationsklassen müssen sich in einer dem Package entsprechenden Ordnerstruktur im lokalen Verzeichnis befinden

Beispiel mit CLASSPATH (keine Zeilenumbrüche nach : )

export CLASSPATH=.:
../crjava-runtime_12.2.217/com.azalea.ufl.barcode.1.0.jar:
../crjava-runtime_12.2.217/commons-collections-3.1.jar:
../crjava-runtime_12.2.217/commons-configuration-1.2.jar:
../crjava-runtime_12.2.217/commons-lang-2.1.jar:
../crjava-runtime_12.2.217/commons-logging.jar:
../crjava-runtime_12.2.217/CrystalCommon2.jar:
../crjava-runtime_12.2.217/CrystalReportsRuntime.jar:
../crjava-runtime_12.2.217/cvom.jar:
../crjava-runtime_12.2.217/DatabaseConnectors.jar:
../crjava-runtime_12.2.217/icu4j.jar:
../crjava-runtime_12.2.217/jai_imageio.jar:
../crjava-runtime_12.2.217/JDBInterface.jar:
../crjava-runtime_12.2.217/jrcerom.jar:
../crjava-runtime_12.2.217/keycodeDecoder.jar:
../crjava-runtime_12.2.217/log4j.jar:
../crjava-runtime_12.2.217/logging.jar:
../crjava-runtime_12.2.217/pfjgraphics.jar:
../crjava-runtime_12.2.217/QueryBuilder.jar:
../crjava-runtime_12.2.217/XMLConnector.jar:
../rjava-runtime_12.2.217/xpp3.jar:
../postgresql-8.3-607.jdbc2.jar
java de.nsoft.cr.CLI
   
Top

Wir arbeiten mit Software von http://www.campus21.de.

Verantwortlich für angezeigte Daten ist der Webdomain-Eigentümer laut Impressum.

Suche