<< | Inhaltsverzeichnis | Suchen | >> |
Die Erstellung und der grobe Ablauf eines mit dem EBUS-GENERATOR-C erstellten Programmes ist in Kapitel Programm-Verwaltung beschrieben. Hier erfolgt eine genauere Beschreibung des Ablaufs der EBUS-Programme.
Programmstart
Das Programm wird auf Betriebssystemebene durch Eingabe des Programm-Namens gestartet. Befindet sich das zu startende Programm nicht im aktuellen Verzeichnis (directory), so muß zusätzlich der Pfadname angegeben werden.
|
|
|
|
|
|
MS-DOS: kundverw bzw. c:\progs\kundverw |
Allgemeiner
Ablauf eines EBUS-Programms
Nach dem Start werden zuerst automatisch alle Variablen des Programms initialisiert. numerische Hilfs- und Indexdatei-Variablen werden mit Null, alphanumerische Hilfsvariable mit dem Leerstring und alphanumerische Indexdatei-Variable mit Leerzeichen entsprechend der Feldlänge initialisiert.
Unter WINDOWS wird die INI-Datei <HAUPTPROGRAMM-NAME>.INI gelesen (unter Java hat die INI-Datei den Namen <HAUPTPROGRAMM-NAME>.JNI). In dieser Datei werden jeweils am Programmende die aktuellen Programmparameter (Main-Windowgröße, Main-Windowposition, Schrift, usw.) abgespeichert. Die Einträge dieser Datei können mit CALL __GETPROFILESTRING gelesen und mit CALL __WRITEPROFILESTRING verändert werden. Die INI-Datei wird nicht gelesen und geschrieben, wenn im Programm die Compileranweisung #GR_NOINI angegeben wurde. Mit der Compileranweisung #GR_INI_FILENAME kann ein anderer Name für die INI-Datei festgelegt werden.
Über die Environmentvariable EBUSINI wird gesteuert, in welchem Verzeichnis die INI-Datei angelegt wird. Ist diese Variable nicht gesetzt, so wird geprüft, ob im WINDOWS-Verzeichnis eine Datei ebusini.ini mit der Section [ebus] und dem Eintrag path existiert. Falls ja, wird der Pfad der INI-Datei aus dem Eintrag path gelesen. Falls nein, gilt als Pfad das aktuelle Arbeitsverzeichnis.
|
/* Datei ebusini.ini im
WINDOWS-Verzeichnis |
|
SET EBUSINI=C:\USER\2 |
Anschließend wird, falls vorhanden, der Init-Macro vor Index-Open ausgeführt. In diesem Macro können z.B. die Pfadnamen, die physikalischen Namen und der Open-Modus der Indexdateien noch geändert werden. Ein Sprung zu einem Maskenfeld (GOTO #...) hat in diesem Macro keine Wirkung. Masken und Unterprogramme können dort nur mit CALL #... aufgerufen werden.
Danach werden die Indexdateien geöffnet. Dabei wird überprüft, ob Indexdateien defekt sind. Ist dies der Fall, so erscheint für jede defekte Indexdatei die Meldung:
Datei
... ist defekt.
Soll sie reorganisiert werden ? (J/N)
Wird mit <N> geantwortet, so wird das Programm mit Fehlermeldung beendet, andernfalls wird die Indexdatei reorganisiert.
Nach dem erfolgreichen Öffnen der Indexdateien wird, falls vorhanden, der Init-Macro nach Index-Open ausgeführt. Erfolgt in diesem Macro ein Sprung zu einem Maskenfeld (GOTO #...), wird sofort zu der entsprechenden Maske verzweigt. Andernfalls wird nach der Ausführung des Macros die Maske mit der niedrigsten Masken-Nummer angesprungen.
Beim Ansprung einer neuen Maske wird die gesamte Maske am Bildschirm ausgegeben. Die Ausgabe einer Maske läuft folgendermaßen ab: Zuerst wird der Bildschirmhintergrund bzw. Rand und die Maskenüberschrift ausgegeben. Danach wird, falls vorhanden, der Macro vor Maskenausgabe ausgeführt. In diesem Macro kann z.B. das Maskenlayout mit PRINT-Anweisungen geändert oder die Funktion FIELDLOAD aufgerufen werden, die nur in diesem Macro sinnvoll ist. Anschließend werden zuerst die konstanten Maskentexte, und dann die Maskenfelder angezeigt. Danach wird der Macro nach Maskenausgabe ausgeführt. In diesem Macro konnen z.B. Controls oder Maskenfelder gesperrt werden (DISABLE_FIELD, DISABLE_BUTTON).
Für jede Maske wurde bei der Programmerstellung eine bestimmte Feldreihenfolge festgelegt. In dieser Reihenfolge werden die Felder abgearbeitet. Wird eine Eingabe in einem Maskenfeld durch den Benutzer mit <RETURN> oder <¯> beendet, so wird als nächstes zu dem Maskenfeld gesprungen, das die nächsthöhere Reihenfolgenummer besitzt. Existiert kein derartiges Maskenfeld, so wird bei DISABLE ROTATE zum ersten Feld der Maske mit der nächsthöheren Masken-Nummer gesprungen. Existiert keine solche Maske, so wird zum ersten Feld der Maske mit der niedrigsten Masken-Nummer gesprungen. Bei ENABLE ROTATE wird am Ende der Maske wieder zum ersten Feld der aktuellen Maske gesprungen. Betätigt der Benutzer in einem Maskenfeld die Taste <>, so wird zu dem Maskenfeld mit der nächstniedrigeren Reihenfolgenummer gesprungen. Existiert auf der aktuellen Maske kein derartiges Feld, so ertönt ein Alarmton und dasselbe Feld wird wieder angesprungen.
Beim Ansprung eines Feldes wird immer, falls vorhanden, zuerst der zugehörige Macro-vorher ausgeführt. Wird in diesem Macro ein Datensatz einer Indexdatei gelesen (z.B. mit READ, START, READS, READ-NEXT usw.), so werden unmittelbar nach der Ausführung des Macros alle Maskenfelder der aktuellen Maske neu angezeigt, es sei denn, daß dies durch die Anweisung NODISPLAY unterdrückt wurde oder der Schalter AUTODISPLAY auf DISABLE steht. Erfolgt im Macro-vorher kein Sprung zu einem anderen Maskenfeld (GOTO #...) oder zu einem anderen Programm (CHAIN, RUN), so wird nach der Ausführung des Macros das aktuelle Maskenfeld neu angezeigt, d.h. der Wert der mit dem Maskenfeld verknüpften Variablen wird am Bildschirm ausgegeben. Man beachte, daß das aktuelle Maskenfeld nicht neu angezeigt wird, wenn im Macro-vorher ein Sprung zu einem anderen Maskenfeld erfolgt (Ausnahme: ein Datensatz einer Indexdatei wurde gelesen). Wurde in dem Macro der Wert der mit dem Maskenfeld verknüpften Variablen geändert, und soll der neue Wert am Bildschirm auch erscheinen, obwohl zu einem anderen Maskenfeld gesprungen wird, so muß in diesem Fall eine DISPLAY-Anweisung ausgeführt werden.
Bei nicht änderbaren Maskenfeldern wird nach der Ausführung des Macro-vorher und der Anzeige des Maskenfeldes zum (in der Feldreihenfolge) nächsten Maskenfeld gesprungen. Dort wird als erstes dann wieder der zugehörige Macro-vorher ausgeführt.
Bei änderbaren Maskenfeldern erwartet das Programm nach der Ausführung des Macro-vorher (falls dort kein Sprung zu einem anderen Maskenfeld erfolgte) die Eingabe des Benutzers. Wird die Eingabe nicht mit <ESC> oder <> abgeschlossen, so wird anschließend, falls vorhanden, der Macro-nachher ausgeführt. Wird in diesem Macro ein Datensatz einer Indexdatei gelesen (z.B. mit READ, START, READS, READ-NEXT usw.), so werden wie beim Macro-vorher unmittelbar nach der Ausführung des Macros alle Maskenfelder der aktuellen Maske neu angezeigt, falls dies nicht durch die Anweisung NODISPLAY unterdrückt wurde und ENABLE AUTODISPLAY gesetzt ist. Erfolgt im Macro-nachher kein Sprung zu einem anderen Maskenfeld, so wird nach der Ausführung des Macros das (in der Feldreihenfolge) nächste Maskenfeld angesprungen. In jedem Fall wird nach der Eingabe der am Bildschirm angezeigte Wert der mit dem Maskenfeld verknüpften Variablen zugewiesen.
|
|
Achtung: Wird in einem Maskenfeld die Taste <> oder <ESC> betätigt, so wird die aktuelle Eingabe übernommen, der Macro-nachher aber nicht ausgeführt. |
|
|
|
Besitzt eine Maske keine Maskenfelder, so wird nach dem Ansprung und der Anzeige der Maske der Macro für Maskenverarbeitung ausgeführt.
Wird in einem Maskenfeld die Taste <ESC> betätigt, so wird das Programm beendet, falls die aktuelle Maske die Maske mit der niedrigsten Masken-Nummer ist und kein SAA-Menue (GR_STARTMENUE) aktiv ist, andernfalls wird entweder in das SAA-Menue zurückgesprungen oder das erste Feld der Maske mit der niedrigsten Masken-Nummer wird angesprungen.
Wird ein Hauptprogramm mit der Taste <ESC> oder durch die Anweisung ENDPROG in einem Macro beendet, so werden nach der Ausführung des ON EXIT MACRO alle Indexdateien geschlossen. Wenn bei dem Hauptprogramm ein Folgeprogramm bei Programmende definiert ist, so wird anschließend dieses Folgeprogramm geladen. Andernfalls wird zum Betriebssystem zurückgekehrt.
Wird ein Unterprogramm mit der Taste <ESC> oder durch die Anweisung ENDPROG beendet, so wird in das Hauptprogramm hinter die Anweisung CALL <PROGRAMM-NAME>, die das Unterprogramm aufrief, zurückgesprungen. Dabei ist zu beachten, daß dadurch nicht automatisch die aktuelle Maske des Hauptprogramms wieder am Bildschirm erscheint. Ist dies gewünscht, so muß unmittelbar nach der Anweisung CALL <PROGRAMM-NAME> die Anweisung DISPLAY FORM (mit der die aktuelle Maske des Hauptprogramms wieder angezeigt wird) oder die Anweisung WCLOSE, die ein im Unterprogramm eröffnetes Window wieder schließt, folgen.
Mausbedienung
Bei DOS-Programmen ist die Maus nur bei ENABLE MOUSE verfügbar. Bei UNIX wird derzeit keine Mausbedienung unterstützt. Bei WINDOWS ist die Maus immer verfügbar, auch bei DISABLE MOUSE. Ist kein ON RMOUSE MACRO definiert, so hat die rechte Maustaste dieselbe Wirkung wie <ESC>.
Blättern in Indexdateien
Ist das aktuell bearbeitete Maskenfeld mit einer Indexdatei-Variablen verknüpft, so kann in diesem Maskenfeld mit <F3> bzw. <CTRL/+> oder <F4> bzw. <CTRL/-> in der zugehörigen Indexdatei vorwärts oder rückwärts geblättert werden. Geblättert wird dabei in dem Schlüssel, der durch das Attribut Schlüssel-Nr. bei den Maskenfeldattributen festgelegt wurde. Beim erstmaligen Betätigen der Tasten <F3>, <CTRL/+>, <F4>, <CTRL/-> im aktuellen Maskenfeld wird intern eine START- bzw. STARTS-Anweisung ausgeführt: Ausgehend vom aktuellen Inhalt der zu dem entsprechenden Schlüssel gehörenden Dateifeld-Variablen wird der Datensatz mit dem nächst höheren bzw. nächst niedrigeren Schlüsselwert gelesen. Beim weiteren Betätigen der Tasten <F3>, <CTRL/+>, <F4>, <CTRL/-> im selben Maskenfeld wird intern eine READ(S)-NEXT- bzw. READ(S)-PREVIOUS-Anweisung ausgeführt. Das heißt, die in der Sortierreihenfolge des Schlüssel nächsten bzw. vorhergehenden Datensätze werden gelesen. Nach jedem erfolgreichen Indexdatei-Lesezugriff werden alle Maskenfelder neu angezeigt.
Mit Hilfe dieses Blätter-Mechanismus kann auch nach bestimmten Daten gesucht werden. Soll z.B. die erste Adresse gesucht werden, deren Name mit "Hub" beginnt, so ist im entsprechenden Maskenfeld <Hub> einzugeben. Die Eingabe muß mit <RETURN> beendet werden, damit der eingegebene Wert auch der zugehörigen Variablen zugewiesen wird. Dies ist deshalb nötig, da beim Blättern immer vom Inhalt der Variablen ausgegangen wird. Mit <> wird anschließend in das Maskenfeld, in dem jetzt "Hub" steht, zurückgesprungen. Wird jetzt <F3> betätigt, so wird intern eine START(S)-Anweisung ausgeführt und damit der erste Datensatz angezeigt, dessen Name größer gleich "Hub" ist. (Voraussetzung dafür ist natürlich, daß in der Indexdatei ein Schlüssel mit dem Namensfeld vorhanden ist.)
Stammdaten-Masken
Bei Eingaben auf Stammdaten-Masken wird nach dem letzten Schlüsselfeld des Haupt-Schlüssels versucht, den durch diesen Schlüssel spezifizierten Datensatz zu lesen. Falls dieser Datensatz gelesen werden konnte, wird im Modus ERFASSEN der Fehler
Datensatz
bereits vorhanden
gemeldet. In allen anderen Modi (ÄNDERN, LÖSCHEN und ANZEIGEN) wird der Datensatz angezeigt.
Falls der Datensatz nicht gelesen werden konnte, wird im Modus ERFASSEN der neue Datensatz erfaßt. In allen anderen Modi (ÄNDERN, LÖSCHEN und ANZEIGEN) wird als Fehler gemeldet:
Datensatz
nicht gefunden
Da der Lesezugriff erst nach dem letzten Schlüsselfeld erfolgt, ist es unbedingt notwendig, daß alle Felder des Haupt-Schlüssels auf der Maske vorhanden sind. Andernfalls arbeitet die Stammdaten-Verwaltung nicht korrekt.
Auch sollten alle Schlüsselfelder am Anfang der Maske definiert werden (bezogen auf die Feldreihenfolge und nicht unbedingt auf die Position am Bildschirm). Andernfalls können die in der Reihenfolge vor den Schlüsselfeldern liegenden Maskenfelder nicht geändert werden, da im Modus ÄNDERN nach dem letzten Schlüsselfeld der gewünschte Datensatz gelesen wird und damit die bereits getätigten Eingaben in den vorhergehenden Feldern durch den gelesenen Datensatz wieder überschrieben werden. Abhilfe könnte in diesem Fall dann nur dadurch geschaffen werden, daß diese vorhergehenden Maskenfelder später mit GOTO #... angesprungen werden.
Bei Stammdaten-Masken wird nach dem letzten Maskenfeld nicht – wie sonst üblich – zur nächsten Maske gesprungen, sondern es erscheint die Frage, ob der Datensatz gespeichert bzw. gelöscht werden soll.
Wird <J> eingegeben, so wird der aktuell am Bildschirm angezeigte Datensatz gespeichert, geändert bzw. gelöscht (je nach Modus).
Ist ein ON OK MACRO definiert, so wird dieser Macro nach der Eingabe von <J> oder <N> aufgerufen. Die Variable EBUS_OK$ enthält das eingegebene Zeichen <J> oder <N>.
Anschließend wird wieder zum ersten Feld der aktuellen Maske gesprungen.
Standard-Report-Masken
In den Maskenfeldern Von ... Bis ... wird der niedrigste und höchste Schlüsselwert für die Datensätze angegeben, die ausgedruckt werden sollen. Erfolgt bei Ausgabe in Datei eine leere Eingabe, wird der Report auf den Standard-Drucker prn ausgegeben. Andernfalls erfolgt die Ausgabe in die angegebene Datei. Diese kann später ausgedruckt werden (MS-DOS: PRINT <dateiname>, UNIX: lp <dateiname>).
Folgeprogramme
Folgeprogramme werden durch die Anweisungen CHAIN und RUN aufgerufen. Mit CHAIN können nur EBUS-Programme gestartet werden, bei RUN kann es sich um beliebige Programme handeln. In beiden Fällen wird der ON EXIT MACRO ausgeführt, die Indexdateien werden geschlossen und das Folgeprogramm wird gestartet.