Berichte mit Unterbericht
Wenn ein Bericht für jeden Datensatz eine Tabelle mit Unterzeilen enthält, nennt man das einen Unterbericht. Ein einfaches Beispiel hierfür ist eine Rechnung. Sie ist ein Formular, das nicht nur Daten aus dem Rechnungs-Datensatz wie z.B. Rechnungsnummer, Empfänger, Datum, etc. enthält. Sie enthält darüber hinaus auch eine Tabelle mit Rechnungszeilen. Diese Tabelle ist der Unterbericht.
Dieser Artikel hier soll eine möglichst einfache Einführung in das Thema sein. Schwierigere Themen stehen auf der Seite über komplexe Berichte. Dieser Artikel behandelt ausschließlich die Arbeit mit dem internen Berichtsgenerator. Die Vorgehensweise mit JasperReports soll hier nicht Thema sein.
Dieser Artikel ist von Thomas Bayen. Meine Artikel sind grundsätzlich nie "fertig", sondern immer eine Einladung, sie zu verbessern. Ich lade jeden gerne jederzeit ein, Verbesserungen hier direkt einzupflegen. Wer möchte, kann mich auch gerne kontaktieren.
Reihenfolge des Vorgehens
Druckformat für Unterbericht anlegen
Am besten legt man als erstes den Unterbericht als Druckformat an. Dieser ist im Grunde ein ganz normales Druckformat wie jedes andere auch. Man sollte sehen, das das Papierformat dem des späteren Hauptberichts entspricht. Dann erzeugt man eine hübsche Tabelle.
Den Bericht legt man normalerweise in einem Fenster (bzw. Register) an, das die entsprechenden Zeilen anzeigt. Dort klickt man auf "Berichte" in der Toolbar und erhält einen vorgefertigten Standard-Bericht. Diesen kann man dann kopieren und anpassen.
Hat man kein solches Fenster (weil man z.B. mit einem Datenbankview arbeiten möchte), kannn man den Bericht auch direkt im Fenster "Druckformat" erstellen, allerdings kann man ihn dann nicht ausprobieren. Die einzige Möglichkeit, diemir dazu eingefallen ist, war, einen Bericht als Menüpunkt anzulegen, der mir dann ein "Testfenster" für die Daten bereitstellte.
Druckformat für Hauptbericht anlegen
Nun legt man den Hauptbericht an. Unterberichte kann man nur in Formularen verwenden (soweit ich das bisher verstanden habe). Also macht man einen Haken bei "Formular". Dann erstellt man ein Formular aus allen gewünschten Feldern. Dieses sollte man zuerst einmal testen und anzeigen, damit man ein Gefühl für das Formular bekommt.
Man ist bei der Erstellung eines Berichts als Formular übrigens weitgehend gezwungen, alle Felder manuell zu positionieren, was ein wenig Mühe bedeutet. Die Positionsangaben sind in "pt", was 1/72 Zoll bedeutet. Das ist die gleiche Einheit, die auch Zeichensätze verwenden, was bedeutet, das eine 11-er Schrift 11 Punkte hoch ist. Eine DIN A4-Seite hat übrigens umgerechnet 595 x 841 Punkte.
Druckformate der beiden Berichte verknüpfen
Ist man soweit, fügt man ein weiteres Formatelement hinzu. Dieses kann als Namen "Unterliste", "Rechnungszeilen", etc. bekommen. Als "Art des Formats" wählt man "Druckformat". Man muss nun eine Spalte sowie ein Druckformat angeben. Das Druckformat ist - wie unschwer zu erraten - unser Unterberichts-Druckformat.
Schlüsselspalte
Die angegebene Spalte ist die Schlüsselspalte. Das Auswahlfeld erlaubt einem, eine Spalte aus der für das Haupt-Druckformat angegebenen Tabelle auszuwählen. Der Unterbericht muss nun eine Spalte mit genau demselben Namen haben - sonst funktioniert das Ganze nicht.
Es wird also später beim Erzeugen des Berichts jeweils ein Datensatz des Hauptberichts gelesen und dieser entsprechend des Hauptberichts-Formulars ausgegeben. Dann wird die Schlüsselspalte aus diesem Datensatz genommen und eine Abfrage auf die im Unterbericht angegebene Tabelle gestartet, die alle Zeilen herausliest, die im gleichnamigen Schlüsselfeld den gleichen Wert haben. Diese Datensätze kommen dann in den Unterbericht. Danach wird das ganze Verfahren für den nächsten Haupt-Datensatz wiederholt.
Druckformat benutzen
Man kann das erstellte Druckformat nun auf verschiedene Arten benutzen:
- Ist man in einem Register, das die gleiche Tabelle anzeigt wie unser Hauptbericht, so kann man mit einem Klick auf das "Berichte"-Symbol in der Toolbar aus einer Liste der möglichen Druckformate auswählen. Hier ist unser neuer Bericht aufgeführt.
- Man kann im Systemmandanten im Fenster "Prozeß & Bericht" einen festen Bericht definieren.
- Diesen kann man man dann in das Hauptmenü einbinden
- Diesen kann man auch in der Registerdefinition (in "Fenster, Register & Felder") als "Prozeß" angeben. Dann wird unser Bericht zum Ausdruck verwendet. In diesem Falle wird der Bericht automatisch auf einen einzelnen Datensatz (nämlich den angezeigten) gefiltert (natürlich nur der Hauptbericht).
- Man kann in der Definition einer Tabelle eine Spalte vom Typ "Button" definieren. Hieraus kann ein Button in der Datensatzansicht eines Registers oder in der Toolbar entstehen, über den man dann den Bericht anzeigen kann.
Was nicht geht
Ein Unterbericht ist eine abgeschlossene Einheit. Er wird für jeden Datensatz der Haupttabelle durch das gemeinsame Schlüsselfeld aus seiner Basistabelle herausselektiert. Dabei wird jeder Unterbericht für sich ganz alleine erzeugt. Das bedeutet, das man im Hauptbericht keine Daten aus dem Unterbericht hat. Man kann also keine Summe der Rechnungszeilen angeben und auch keine Gesamtsumme aller Rechnungen am Ende des Berichts ausgeben oder so etwas.
Die Summe von Rechnungszeilen ist z.B. in der normalen Rechung in einem eigenen Feld abgelegt, das immer aktualisiert wird. Man kann hier natürlich auch eine Art virtuelles Feld mit einer Summenformel, z.B. in einem Datenbankview (neues View für Berichte anzeigen) erzeugen. Siehe hierzu auch komplexe Berichte.
Wer Gesamtsummen benötigt, sollte überlegen, ob nicht ein tabellarischer Bericht mit Gruppierungen das Richtige für ihn ist.