Session D-FIRE

Customizing FoxFire!

Michael Lackner
ProLib Software GmbH


Inhalt

Das Abfrage- und Reporttool Foxfire! ist in den USA das am meisten eingesetzte Reportwerkzeug für Foxpro. Seitdem Foxfire! auch in deutsch verfügbar ist, gewinnt dieses Tool auch in Deutschland immer mehr Anhänger. Dieser Vortrag soll einen Einblick geben, wie man Foxfire einsetzen kann. Foxfire! bietet dem Entwickler eine Unzahl von Möglichkeiten, Foxfire! einzusetzen und an die Anforderungen der eigenen Applikationen und Anwender anzupassen. Nachfolgend sollen die wesentlichen Aspekte beim Einsatz von Foxfire! näher betrachtet werden.

Der Setup-Assistent

Mit dem Setup-Assistenten ist ein schneller Einstieg in Foxfire! möglich.

In vier Schritten erstellen Sie ein Datadictionary über die Tabellen Ihrer Anwendung und können sofort beginnen, mit Foxfire! zu arbeiten.

FOXFIRE!-Ansichten und Subfiles

In einigen Fällen reicht es nicht aus, im Datadictionary nur die Tabellen mit Ihren Relationen zu hinterlegen. (z.B. zwischen Dateien mehrere Beziehungen bestehen). Hier bietet Foxfire! zwei Ansatzpunkte solche Problematiken zu lösen:

Foxfire!-Views

Die Idee hinter Foxfire!-Views ist, Datenfelder und Relationen zu unterdrücken, die in ein und derselben Abfrage inkonsistent sind oder zyklische Beziehungen verursachen würden. Verwechseln sie Foxfire!-Views nicht mit lokalen oder Remote-Views in Foxpro.

Wenn Sie zwei oder mehr Beziehungen zwischen zwei Entitäten haben, können Sie Ansichten erstellen. Letztendlich unterdrücken Ansichten eine oder mehrere Beziehungen zwischen den Dateien. Wenn Sie Foxfire!-Views verwenden, müssen Sie mindestens zwei Ansichten definieren. Wenn Foxfire! geladen wird, wird überprüft, ob Views vorhanden sind. Sind Views in dem verwendeten Datadictionary definiert, werden in den Auswahllisten der Datenfelder nur die Felder angezeigt, die nicht von dieser Ansicht ausgeschlossen sind. Auch Relationen (Join-Conditions) werden nur verwendet, wenn Sie für diese View zugelassen sind.

Um Ansichten in Foxfire! korrekt implementieren zu können, müssen Sie die gewünschten oder bestehenden Relationen zwischen Ihren Dateien genau kennen. Danach gehen Sie wie folgt vor:

Sub-Files

Manchmal sind Ihre Daten so aufgebaut, daß unterschiedliche Datensatzgruppen mit ähnlicher Struktur in einer Tabelle abgelegt sind z.B. wird in einem Feld ein Statuscode abgelegt, der bestimmt, um was es sich bei diesem Datensatz handelt: Eine Tabelle (Nachfolgend FAKTURA genannt), die Kopfinformationen für Rechnungen und Gutschriften enthält. Die Informationen sind meist gleich, unterschieden wird durch ein Characterfeld, "R" für Rechnung, "G" für Gutschrift. Jetzt möchten Sie wissen, welcher Kunden Rechnungen und Gutschriften erhalten hat.

Die Filterbedingungen würden dann wie folgt aussehen:

FAKTURA TYP IST "G"
FAKTURA TYP IST "R"

Das dazugehörige SQL-Statement könnte wie folgt aussehen:

SELECT KUNDEN.KDNR FROM KUNDEN, FAKTURA ;
   WHERE KUNDEN.KDNR=FAKTURA.KDNR ;
      AND FAKTURA.TYP="G" ;
      AND FAKTURA.TYP="R"

Daß dieses SQL-Statement kein Ergebnis bringt, liegt auf der Hand. Kein Datensatz in der Faktura-Tabelle kann gleichzeitig Rechnung und Gutschrift sein. Wie ist dies nun zu lösen, daß unsere Abfrage trotzdem die gewünschten Ergebnisse bringt?

Wir lösen die Abfrage, in dem wir annehmen, es würde eine Tabelle für Kunden mit Gutschrift und eine Tabelle für Kunden mit Rechnungen geben. Das Ergebnis der Abfrage sind dann die Kunden, die in beiden Tabellen vorkommen. Dieser Ansatz wird  in Foxfire! als Sub-File-Support bezeichnet. Foxfire! unterstützt zwei verschiedene Arten von Sub-File-Support:

Statischer Sub-File-Support

Wenn die Anzahl der benötigten Sub-Files einer Datei überschaubar ist, können Sie in Foxfire! weitere Beziehungen zwischen KUNDEN und FAKLTURA anlegen, so daß diese von Foxfire! wie eigene Dateien für Rechnungen und Gutschriften betrachtet werden.

In den Infos zu Dateirelationen werden zwei weitere Relationen festgelegt:
 

Datei 1

Datei 2

Dateiname

KUNDEN

FAKTURA

Alias Name

KUNDEN

RECHNUNG

Join-Bedingung

KUNDEN.KDNR=RECHNUNG.KDNR and FAKTURA.TYP= "R"

Datei 1

Datei 2

Dateiname

KUNDEN

FAKTURA

Alias Name

KUNDEN

GUTSCHRIFT

Join-Bedingung

KUNDEN.KDNR=GUTSCHRIFT.KDNR and FAKTURA.TYP = "G"

Diese beiden zusätzlichen Join-Bedingungen müssen zusätzlich zur ursprünglichen Join-Bedingung angegeben werden. Der Benutzer kann nun mit diesen beiden virtuellen Tabellen arbeiten, als ob es eigenständige Tabellen wären.

Ein Nachteil dieser Methode: Datenfelder müssen für jedes Subfile extra angelegt werden.

Dynamischer Sub-File-Support

Foxfire! unterstützt auch dynamische Subfiles. Dies kann dann nützlich sein, wenn Sie nicht wissen oder kontrollieren können, wie viele Subfiles für eine physikalische Datei benötigt werden.

Wird in den erweiterten Optionen des  Datenfeld-Editors die Checkbox "Erneut verwenden" markiert, erstellt Foxfire! automatisch einen neuen Alias für jedes Vorkommen des Datenfelds in der Abfrage, wenn das SQL-Statement gebildet wird.

Obiges SQL-Statement würde dann wie folgt aussehen:

SELECT KUNDEN.KDNR FROM ;
   KUNDEN,;
   FAKTURA ;
   FAKTURA FAKTURA_A,;
   FAKTURA FAKTURA_B,;
   WHERE KUNDEN.KDNR=FAKTURA.KDNR AND;
   KUNDEN.KDNR=FAKTURA_A.KDNR AND;
   KUNDEN.KDNR=FAKTURA_B.KDNR AND;
      (AND FAKTURA_A.TYP="G" ;
      AND FAKTURA_B.TYP="R")

Ein logisches Problem tritt auf, wenn man den ODER-Operarator in komplexen Filterbedingungen mit Subfiles verwendet. Wenn Sie eine Abfrage erstellen, in der Sie die Kunden mit (Rechnungen, Lieferschein und Gutschriften ) ODER (Angebote und Auftragsbestätigungen) ermitteln wollen, werden drei Instanzen der Datei für den ersten Teil (Rechnungen, Lieferschein und Gutschriften ) geöffnet. Für den zweiten Teil werden nur zwei Instanzen der Datei geöffnet. Dadurch wird das ODER des dritten Teils nicht abgeschlossen und alle Datensätze werden zurückgegeben.

Um dieses Problem kontrollierbar zu machen, erzwingt Foxfire! die gleiche Anzahl von Instanzen auf jeder Seite der ODER-Bedingung, wenn Sie Sub-File-Abfragen erstellen. Foxfire! gestattet es dem Benutzer nicht, Klammern in dieser Art von Abfragen zu setzen. Statt dessen setzt Foxfire! die Klammern automatisch um die Filterbedingungen. Das führt dazu, daß die ODER-Klausel vorrangig vor der UND-Klausel behandelt wird.

BATCH-Operationen

Foxfire! kann auch parametergesteuert bzw. im Batch-Modus betrieben werden. Sie können so gezielt einzelnen Foxfire!-Funktionen aufrufen, ohne die gesamte Anwendung zu starten. Dies ist vor allem dann sinnvoll, wenn Sie nur einen Teil der Foxfire!-Funktionen in Ihrer Applikation nützen wollen oder wenn Sie Ihren Anwendern z.B. aus Sicherheitsgründen nicht den Zugriff auf die gesamte Foxfire!-Applikation ermöglichen wollen. Foxfire! im Batch-Modus zu betreiben, läßt sich meist mit wenigen Programmzeilen realisieren:

SELECT 0
USE MYBATCH ALIAS FF_BATCH
APPEND BLANK
REPLACE ACTION WITH "RUN“,;
      CONFIG WITH "FFCONFIG.PRG",;
      REQUEST WITH "SAMPLE2
DO FOXFIRE.APP

Die Datei ffbatch.dbf hat folgende Struktur:
 
Feldname Typ Länge Benötigt Beschreibung

REQUEST

C

8

Ja

Abfrage, auf die in ACTION festgelegt Aktion angewendet wird

ACTION

C

40

Ja

Aktion, die ausgeführt werden so

USER_ID

C

4

Nein

Benutzer-ID

USER_DEPT

C

10

Nein

Abteilung

CONFIG

M

10

Nein

Name des Konfigurationsprogramms, das eigenen Programmcode enthalten kann. Wenn dieses Feld leer ist, werden Aufrufe des Konfigurationsprogramms unterdrückt.

TIMEOUT

N

4

Nein

Timeout in Sekunden für Warnungen und Dialoge. Kann bei Stapelabarbeitung von mehreren Abfragen verwendet werden. Die Voreinstellung für Dialoge ist 0 (kein Timeout). Nur der erste Timeout-Wert in einer Batch-Tabelle mit mehreren Datensätzen wird ausgewertet.

MACROOK

L

1

NEIN

Normalerweise entfernt Foxfire! alle benutzerdefinierten Tastatur-Makros während einer Foxfire!-Sitzung. Wenn Sie dieses Feld auf .T. setzen, bleiben die Makros erhalten. In jedem Fall speichert Foxfire! die Makros und stellt sie beim Verlassen von Foxfire! wieder her.

NOPRTPRMPT

L

1

NEIN

Wenn dieses Feld  auf –T. gesetzt wird, wird zur Laufzeit kein Druckerdialog angezeigt und die Windowsvoreinstellungen werden verwendet.

FLTSTRALS

M

10

NEIN

Legt fest, welche Tabelle verwendet wird, die auszuführende Aktion "FILTER STRING" ist. Wenn dieses Feld leer ist und die auszuführende Aktion "FILTER STRING" ist, werden nur die Datenfelder des Alias verwendet, der gerade aktiv ist, wenn Foxfire! aufgerufen wird.

FLTTITLE

M

10

NEIN

Titel für den Filtereditor zur Laufzeit

FLTARRAYS

M

10

NEIN

Speichert Array-Speichervariablen für Filterbedingungen. Wenn die Aktion "FILTER STRING UPDATE" ist, werden die resultierenden Filterarrays in dieses Memofeld zurückgegeben. Wenn dieses Feld bereits Filterarrays enthält, werden diese überschrieben.

FLTDISPLAY

M

10

NEIN

SENDTO

C

10

NEIN

Legt fest, wohin die Abfrageergebnisse ausgegeben werden: Drucker, Bildschirm oder Datei.

OUTPUTFILE

M

10

NEIN

Dateiname, wenn die Ausgabe in eine Datei erfolgt.

DOSPRTR

M

10

NEIN

DOS-Druckerdefinition für zeichenorientierte Abfragen in DOS oder Windows

WINPRTR1

M

10

NEIN

Erster Teil der Druckerstruktur unter Windows. Entspricht dem Feld TAG in einer FRX-Datei.

WINPRTR2

M

10

NEIN

Zweiter Teil der Druckerstruktur unter Windows. Entspricht dem Feld TAG2 in einer FRX-Datei.

MACPRTR

M

10

NEIN

Druckerstruktur auf dem Macintosh

ASKATRUN

M

10

NEIN

In diesem Feld werden Werte für Abfragen zur Laufzeit abgelegt

HEADING

M

10

NEIN

Reportüberschrift

FF_FILTER

M

10

NEIN

Wenn die auszuführende Aktion "FILTER STRING" ist, wird der resultierende Filterstring in diesem Memofeld zurückgegeben.

FF_FRXNAME

M

10

NEIN

Name der Report- oder Etikettendatei, die von Foxfire! erzeugt wurde.

FF_SQL

M

10

NEIN

SQL-Statement, das von Foxfire! generiert wurde

FF_COUNT

N

9

NEIN

SQL Count-Ergebnis

SYSTEM

M

10

NEIN

reserviert für interne Benutzung

 

Folgende Aktionen können durch den entsprechenden Eintrag in das Feld ACTION der FFBATCH.DBF angesteuert und ausgeführt werden.

ACTION Beschreibung

REQUEST MANAGER

Startet Foxfire! und aktiviert den Abfragemanager,

edit data items

Startet Foxfire! und aktiviert den Datenfeld-Editor

utilities

Startet Foxfire! und aktiviert das Uitilities-Menü.

run

Die im Feld REQUEST angegebene Abfrage wird ausgeführt und Foxfire! sofort wieder beendet.

edit

Startet Foxfire! und aktiviert den Abfrage-Editor. EDIT kann optional auch mit einem beliebigem Zeichen(Strichpunkt, Doppelpunkt, Leerzeichen, etc.) gefolgt mit einem der Unterbefehle angegeben werden, um den entsprechenden Dialog direkt anzusprechen.

EDIT:DATA ITEM

EDIT SORT OPTIONS

EDIT-FILTER OPTIONS

EDIT;SORT

EDIT,OUTPUT

EDIT:SAVE AS

new

Startet Foxfire! und aktiviert den Dialog "neue Abfrage- Typ und Stil". Ein vorgegebener Name für die Abfrage kann im REQUEST Memofeld gespeichert werden. In jedem Fall wird der Name der Abfrage im Memofeld Request zurückgegeben.

sql-show

Das SQL-Statement der im Feld REQUEST abgegeben Abfrage wird generiert und am Bildschirm angezeigt. SQL wird nicht ausgeführt.

sql-return

Das SQL-Statement der im Feld REQUEST abgegeben Abfrage wird generiert und in das Memofeld FF_SQL zurückgegeben. SQL wird nicht ausgeführt.

filter string

Foxfire! wird gestartet und der Filtereditor aktiviert. Der Filter wird auf Datenfelder des Alias, der in FLTSTRALS angegeben ist, beschränkt(Ist kein Eintrag in FLTSTRALS, werden die Datenfelder des aktuellen Alias angezeigt). Wenn im REQUEST-Feld eine Abfrage angegeben ist, wird der Filtereditor mit den Filterbedingungen der Abfrage geladen (ohne die Abfrage zu verändern). Nachdem der Benutzer den Filter abschließt, wird der resultierende Filterstring im Memofeld FF_FILTER zurückgegeben.

filter string update

Foxfire! wird gestartet und der Filtereditor aktiviert. Die Filter werden aus dem Memofeld FLTARRAYS von FFBATCH geladen. Wenn FLTARRAYS leer ist, werden die Filterbedingungen der im Feld REQUEST angegebenen Abfrage geladen. Wenn der Benutzer seine Filterbedingungen fertiggestellt hat, wird der resultierende Filter-String in das Memofeld FLTARRAY zurückgegeben. Der Benutzer kann so wiederholt Filterdefinitionen bearbeiten. der resultierende Filterstring kann an Ihre Applikation übergeben werden.

filter string nodialog

Foxfire! wird gestartet, der Benutzer bekommt den Filterdialog nicht angezeigt und ein Filterstring, der auf den Filterbedingungen der Abfrage in REQUEST basiert wird zurückgegeben.

batch builder

Startet Foxfire! und aktiviert den Stapeldateigenerator.

PREVIEW

Foxfire! wird gestartet, die im Feld REQUEST angegebene Abfrage wird ausgeführt und das Abfrageergebnis wird am Bildschirm ausgegeben.

count-show

Foxfire! wird gestartet, die im Feld REQUEST angegebene Abfrage wird ausgeführt und die Anzahl der gefundenen Datensätze wird angezeigt.

count-return

Foxfire! wird gestartet, die im Feld REQUEST angegebene Abfrage wird ausgeführt und die Anzahl der gefundenen Datensätze wird in das Feld FF_COUNT zurückgegeben.

setup wizard

Startet Foxfire! und aktiviert den Setup-Assistenten, um einen neuen Preferenceset zu erstellen

Mit Hilfe des Batch-Interfaces lassen sich Teile von Foxfire! explizit ansteuern, ohne die gesamt Applikation zu laden. Auf diese Weise kann man z.B. Foxfire! komplett in die eigene Anwendung integrieren. Eine weitere Anwendung des Batch-Interfaces ist der Filtereditor, der auch extern verwendet werden kann.

Externer Einsatz des Filter-Builders

Eine weitere Einsatzmöglichkeit des Batch-Interfaces ist, Foxfire! als Filtergenerator für Ihre Applikation einzusetzen. Dies kann wie folgt aussehen:

SELECT 0
USE FF_BATCH
DELETE ALL        &&keine anderen Aktionen
APPEND BLANK
REPLACE ACTION WITH 'FILTER STRING' ,;
   CONFIG WITH 'FFCONFIG.ORG'
SELECT KUNDEN     &&Tabelle, die gefiltert werden soll
DO FOXFIRE.APP
lcTempExpr = FF_BATCH.FF_FILTER
SET FILTER TO &lcTempExpr
GO TOP
USE IN FF_BATCH

Der Foxfire!-Filtereditor wird aufgerufen und der Benutzer sieht die Datenfelder der KUNDEN-Tabelle. In der einfachsten Konfiguration zeigt Foxfire! die Datenfelder des Alias im gerade aktiven Arbeitsbereich an. Wenn der Benutzer mit einem anderen Alias arbeiten soll, können Sie diesen im Feld FLFSTRALS angeben. Wenn der Benutzer den Filtereditor beendet, wird der resultierende Filterstring im Memofeld FF_FILTER abgelegt. Wen Sie für den Filtereditor einen eigenen Titel verwenden wollen, so können sie diesen im Memofeld FLFTITLE von FF_BATCH angeben.

Das obere Beispiel zeigt, wie Foxfire! den leeren Filtereditor aufruft und dem Benutzer so die Möglichkeit gibt, eine oder mehrere Filterbedingungen auf beliebige Datenfelder zu erstellen. Was aber, wenn der Benutzer nur auf vordefinierte Fragestellungen reagieren soll?

Wenn Sie eine Abfrage mit Filterbedingungen anlegen und den Namen der Abfrage im Batch-Cursor angeben, startet Foxfire! den Filtereditor mit den vordefinierten Filterbedingungen der Abfrage. Die Benutzerangaben werden nur zur Laufzeit für diese eine Abfrage verwendet, die Abfrage wird nicht geändert.

SELECT 0
USE FF_BATCH
DELETE ALL        &&keine anderen Aktionen
APPEND BLANK
REPLACE ACTION WITH 'FILTER STRING' ,;
   CONFIG WITH 'FFCONFIG.PRG',;
   FLTSTRALS WITH ‘KUNDEN’,;
   REQUEST WITH ‘MAILING’
DO FOXFIRE.APP
SELECT KUNDEN     &&Tabelle, die gefiltert werden soll
lcTempExpr = FF_BATCH.FF_FILTER
SET FILTER TO &lcTempExpr
GO TOP
USE IN FF_BATCH

Mit vordefinierten Abfragen können Sie dem Benutzer so viel oder wenig Freiraum und Flexibilität beim Erstellen oder Ändern von Filterbedingungen geben, wie es die aktuelle Programmsituation erfordert. Wenn Sie einen bestimmten Filterstring benötigen, der mit einer Abfrage definiert wurde, können Sie die Option FILTER STRING NODIALOG im Feld ACTION VON FF_BATCH angeben. Außerdem können Sie Werte für Rückfragen zur Laufzeit prorammatisch festlegen.

DIMENSION Askvalues[4]
Askvalues[1]=<Filterbedingung 2 Wert>
Askvalues[2]= <Filterbedingung 4 Wert>
Askvalues[3]= “*IGNORE*“
Askvalues[4]= <Filterbedingung 8 Wert>
SAVE TO MEMO AskatRun ALL LIKE Ask*

Weitere Möglichkeiten der Verwendung des Filterbuilders können Sie obiger Tabelle entnehmen.

HOOK-Points

Foxfire! bietet außerdem die Möglichkeit, an definierten Einspringpunkten (Hooks), eigenen Code einzufügen. Folgende Hooks stehen zur Verfügung

PARAMETER tcPhase DO CASE
CASE tcPhase = "STARTUP"
CASE tcPhase = "PREFERENCE FILE SETUP"
CASE tcPhase = "GLOBAL SETUP"
CASE tcPhase = "REQUEST SETUP"
CASE tcPhase = "BEFORE FRX GENERATION"
CASE tcPhase = "AFTER FRX GENERATION"
CASE tcPhase = "BEFORE SQL-GENERATION"
CASE tcPhase = "AFTER SQL-GENERATION"
CASE tcPhase = "BEFORE SELECT"
CASE tcPhase = "AFTER SELECT"
CASE tcPhase = "BEFORE REPORT"
CASE tcPhase = "AFTER OUTPUT"
CASE tcPhase = "CLEANUP"
CASE tcPhase = "BATCH BUILDER ADD"
CASE tcPhase = "BATCH BUILDER RUN"
ENDCASE RETURN

Außerdem können Sie für jede einzelne Abfrage unter Sonderverarbeitung festlegen, ob zusätzliche Programme oder Funktionen während der Verarbeitung einer Abfrage ausgeführt werden sollen.

Folgende Hooks sind vorgesehen:

"Nach Abfrage ausführen" eignet sich z.B. gut, um eine ausgegebene DBF- oder ASCII-Datei programmatisch weiterzu bearbeiten und in ein benötigtes Ausgabeformat zu bringen.

FOXFIRE! Visual Toolkit

Das Visual Toolkit von Andrew Ross MacNeill ist eine Sammlung von Klassen und Formularen, mit denen Sie Foxfire! einfach in Ihre VFP-Applikationen integrieren können. Diese Komponenten-Sammlung verbindet die Foxfire!-Funktionalitäten mit dem Look and Feel der Windows95 Oberfläche. Das Visual ersetzt Foxfire! nicht. Es ist im wesentlichen ein Object-Wrapper um das Foxfire!-Hauptprogramm (Foxfire.app).

FOXFIRE! for MS SQL Server

Mit der SQL-Version von Foxfire! können Sie Abfragen direkt von SQL-Server-Tabellen ausführen. Das Benutzerinterface ist das gleiche wie bei der aktuellen Foxfire!-Version. Weitere Versionen für Sybase, Oracle und andere SQL-Datenbanken sowie für die JET-Database Engine (MDB-Files) sind bereits angekündigt.

FOXFIRE! Report Server

Mit dem Foxfire! Report Server werden die Abfragen nicht mehr auf dem Anwender-PC, sondern auf einem dedizierten Report-Server ausgeführt. Der Arbeitsplatz-PC wird dadurch entlastet. Der Request-Server ist eine dedizierte Workstation, auf der die Foxfire!-Serverversion installiert ist. Die Abfragen werden vom Arbeitsplatz in eine Warteschlange auf dem Request-Server weitergegeben, wo Sie abgearbeitet werden.

FOXFIRE! WEB Publisher

Mit dem Foxfire! Web Publisher können Foxfire!-Abfragen im Internet ausgeführt und dargestellt werden. Filterwerteingaben zur Laufzeit über das Internet werden unterstützt. Für den Foxfire! Web Publisher werden Foxfire!, die West Wind Web Connection und ein Internetserver, der ISAPI unterstützt benötigt.

FOXFIRE! Exporter

Mit dem Foxfire!-Exporter können Sie Foxfire!-Abfragen und damit verbundene Datadictionaries  zwischen verschiedenen Foxfire!-Installationen auf verschiedenen Orten austauschen. Wenn Sie Anwender haben, für die Sie Auswertungen erstellen müssen, oder wenn Sie Auswertungen an mehrere Anwender verteilen wollen, können Sie die Abfrage auf Ihrem System erstellen. Danach erstellt der Exporter die benötigten Exportdateien, die dann auf dem Zielsystem importiert werden können.