[ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] Session D-REPOReports in VFP - was sie alles
|
![]() |
![]() |
Nur sehr wenig Spielraum gib es in VFP für Reports, bei denen listen- und formularartige Darstellungen horizontal (also nebeneinander) angeordnet werden sollen (z.B. eine Rechnung mit rechts daneben positioniertem Überweisungsträger):
![]() |
![]() |
Die Erstellung der in VFP möglichen kombinierten Reports wird weiter unten detaillierter besprochen.
Die Bedienung des Reportdesigners ist etwas gewöhnungsbedürftig:
Am verstecktesten liegt der Menüpunkt "Page Setup" im Menü "File". Hier kann man man z.B. die Papier-Ausrichtung, die Spaltenanzahl sowie diverse weitere Einstellungen vornehmen.
Arbeitet man mit dem Reportdesigner, dann tauchen auch im Menü "View" einige spezielle Menüpunkte auf: "Design", "Preview", "DataEnvironment..." sowie diverse weitere Einträge.
Im Gegensatz zum sonstigen Inhalt des Menüs "Format" befinden sich hier völlig reportdesigner-spezifische Menüpunkte zur Anordnung und Formatierung von Report-Elementen.
Das Menü "Report" enthält ausschließlich reportdesigner-spezifische Punkte.
Auf der Arbeitsfläche des Reportdesigners kann man bestimmte Bereiche mit einem RightClick anwählen und bekommt dann ein Kontextmenü.
Bei anderen Bereichen hat der DoubleClick die Bedeutung, eine Spezifikationsmaske zu öffnen.
Datenfelder können per Drag&Drop aus dem DataEnvironment oder aus dem Databasedesigner auf die Arbeitsfläche des Reports gezogen werden.
Die Höhe der verschiedenen Report Bands kann man durch vertikales Verschieben des zugehörigen Separator Bars erreichen.
Definitionen von Reports werden in Visual FoxPro in Datei-Paaren mit der Endung .FRX/.FRT gespeichert. Technisch gesehen verbirgt sich dahinter eine DBF-Tabelle mit einer Memodatei - und diese Tabelle kann ganz normal mit USE geöffnet und mit BROWSE angezeigt werden.
TIP: Bzgl. Manipulationen in den Berichtsdefinitionsdateien sollte man sich solange zurückhalten, bis man die inneren Zusammenhänge dieser Dateien hinreichend gut durchschaut.
Eine minimale Dokumentation der Interna dieser Datei findet man in dem Verzeichnis FILESPEC innerhalb des Installationsverzeichnisses von Visual FoxPro. Weiterführende Informationen sind z.B. dem Artikel "Demystifying Visual FoxPro Report Files" von John S. Koziol aus dem FoxTalk von August 2000 zu entnehmen.
Das Abarbeiten von Reports erfolgt über den "REPORT FORM"-Befehl:
[ENVIRONMENT]
[Scope] [FOR lExpression1] [WHILE lExpression2]
[HEADING cHeadingText]
[NOCONSOLE]
[NOOPTIMIZE]
[PLAIN]
[RANGE nStartPage [, nEndPage]]
[Preview [[IN] WINDOW WindowName | IN SCREEN]
[NOWAIT]]
[TO PRINTER [PROMPT] | TO FILE FileName2 [ASCII]]
[NAME ObjectName]
[SUMMARY]
Einige dieser Optionen bergen ungeahnte Möglichkeiten in sich, wie weiter unten erläutert wird. Deshalb lohnt es sich in jedem Fall, alle Möglichkeiten des REPORT-Befehls genauestens zu studieren.
Die Hauptbestandteile einer Report-Definition sind:
Im DataEnvironment kann man die am Report beteiligten Datenquellen festlegen (muß man aber nicht, ein Report kann auch auf Daten zugreifen, die im Vorfeld durch die vorgelagerte Programmlogik bereitgestellt wurden).
Auf der Arbeitsfläche werden die Ausgabefelder sowie optische Elemente wie Linien und Rahmen gestaltet und den einzelnen Report Bands zugeordnet.
Gruppierungen, Berichtsvariablen und Expressions sind Mittel zur report-internen Datenaufbereitung, können aber auch für weitreichende effektvolle Tricks eingesetzt werden (siehe weiter unten).
Besondere Beachtung verdienen die Stellen der Report-Definition, wo man sogenannte Expressions einsetzen kann. Mit Expression ist ein nach FoxPro-Konventionen gültiger Berechnungsausdruck gemeint, der eine fast beliebige Komplexität haben kann.
Im einfachsten Fall besteht eine solche Expression aus einem einzelnen Feldnamen aus der Tabelle, über die der Report erstellt wird, z.B. Customer.PostalCode.
Eben so gut können aber auch Verknüpfungen von Feldern (Customer.PostalCode + " " + Customer.City) gebildet oder VFP-Funktionen einbezogen werden ( ALLTRIM(Customer.PostalCode) ).
Natürlich ist auch der Zugriff auf Speichervariablen oder Eigenschaften von Objekten möglich, wenn gesichert ist, daß diese zum Zeitpunkt der Abarbeitung des Reports zur Verfügung stehen.
Bei all diesen Varianten muß lediglich beachtet werden, daß das Ergebnis der Expression vom Datentyp her paßfähig zum Verwendungszweck ist.
An diese Stelle sei darauf hingewiesen, daß in Expressions natürlich auch Aufrufe von User Defined Functions (UDF) möglich sind. Daraus ergeben sich zwei sehr weitreichende Möglichkeiten:
In einer solchen UDF kann man beliebig komplexe Berechnungsalgorithmen unterbringen, die in einer einzelnen Expression ggf. nicht abzubilden sind.
UDFs innerhalb von Expressions werden quasi als Event bei jedem Auswerten der Expression gefeuert und können damit Aufgaben übernehmen, die von dem eigentlichen Zweck der Expression u.U. sehr weit entfernt sind. Allerdings muß man in diesem Zusammenhang folgendes beachten:
Dies ist solange relativ unkritisch, wie man UDFs zur Speicherung etwas komplexerer Berechnungsalgorithmen verwendet.
Werden in einer UDF allerdings kumulative Berechnungen ausgeführt (x=x+1) oder sogar völlig REPORT-fremde Aktivitäten ausgelöst, dann ist es u.U. unerwünscht, daß die Abarbeitung je Report-Item unbeeinflußbar mehrfach abläuft.
Die ungewollte Mehrfachabarbeitung von UDFs kann man verhindern, indem man als zusätzlichen Parameter eine Kennung mitgibt, anhand derer die UDF erkennen kann, ob dies ein erstmaliger oder ein ungewollt zusätzlicher Aufruf ist.
Ruft man z.B. aus dem Seitenfuß eine UDF auf, die eine Seitensumme auf eine andere Variable kumulieren soll, dann kann man diese UDF mit der zusätzliche Übergabe der Seitennummer absichern:
Die bei solchen Konstrukten verwendeten Variablen müssen vor dem Starten des Berichtes als PRIVATE-Variablen definiert und ggf. initialisiert werden. Noch besser eignen sich allerdings Properties eines zu diesem Zweck vor der Berichtsabarbeitung instanzierten Objektes.
Trotzdem kann es beim Einsatz von UDFs zu Problemen kommen, wenn mit der Seitenansicht gearbeitet wird, da dort die freie Vor- und insbesondere die Rückwärtsnavigation zu unerwarteten Effekten führen kann.
Im einfachsten Fall kann man diesem Problem dadurch begegnen, wenn man die Anzeige der problematischen Controls davon abhängig macht, ob der Bericht im Modus Seitenansicht angezeigt wird.
Dies erreicht man durch eine Abprüfung von WEXIST("Printing...") in der englischen bzw. von WEXIST("Drucken...") in der deutschen Version. Wenn diese Expression .T. liefert, dann ist das kleine Fensterchen mit der Nummer der gerade gedruckten Seite sichtbar, welches nur beim wirklichen Ausdrucken angezeigt wird!
Das ist der Teil der Report-Definition, in dem man die Bezüge zu den im Report zu verwendenden Datenquellen hinterlegen kann (ähnlich der Datenumgebung einer VFP-Maske).