M4-Macropaket zur halbautomatischen Generierung von
Stammdatenpflegeprogrammen für relationale Datenbanken
Es gibt eine Version für ADABAS (1998) und eine für Postgres.
Grundidee und Ziel
Mich ärgert es, immer wieder das selbe zu Programmieren zu müssen. Die
Datenpflegeprogramme sehen immer gleich aus.
Aus den Metadaten einer Datenbank kann man automatisch so ein
Datenpflegeprogramm generieren.
Dies geschieht in zwei Schritten
- Die Metadaten werden aus der Datenbank geholt und daraus eine
einfache Maskenbeschreibung (M4-Macroaufrufe) generiert
- Die Maskenbeschreibung wird mit M4 expandiert
Der Programmierer kann die Maskenbeschreibung noch mit Hinweisen
versehen, damit die Maske gleich viel schöner wird.
Abgrenzung von generischen Programmen
Für selten genutzte Relationen empfiehlt sich auch die Nutzung von generischen Programmen, bei denen man direkt SQL-Befehle eingeben kann.
Bei m4ober werden Programme generiert, die als Teil einer Anwendung gedacht sind, und die der Endnutzer verwenden soll. m4ober liefert diese Teile, die man dann erweitern kann, d.h. es kann eine zusätzliche Logik integriert werden,
die nicht direkt aus den Metadaten ableitbar sind.
Modifikationen sind z.B:
- die andere Anordnung von Feldern
- Einbau von Sprungfunktionen aus anderen Relationen
Aufruf der Programme
- genmaske Tablename
- Auf der Standardausgabe erscheint die Maskenbeschreibung
- genober Maskenbeschreibung
- auf der Standardausgabe erscheint das Datenpflege-Tcl/Tk-Script
Merkmale der generierten Programme
Bedienszenario:
- Der Nutzer gibt den Schlüssel ein und drückt auf den Druckknopf
"Suchen"
- Ist der Satz vorhanden, wird er in den Feldern angezeigt
- In jedem Fall kann der Satz durch ausfüllen der Felder geändert
bzw. erst geschaffen werden
- Falls der Satz gefunden wurde, wird eine UPDATE-Anweisung
generiert und ausgeführt, wenn der "speichern"-Knopf betätigt wird
- Falls der Satz nicht gefunden wurde wird eine INSERT-Anweisung
generiert und abgesetzt, wenn der "speichern"-Knopf betätigt
wird
Freie Suche:
Werden nicht-Schlüsselfelder ausgefüllt oder mit Datenbanksuchmuster
gefüllt,so wird eine entsprechende SELECT-Anweisung generiert und
ausgeführt. Die Suchergebnisse werden in einer Auswahlliste einem
POP-Up-Fenster dargestellt. Durch Doppelklick wird ein Satz in der
Suchmaske eingestellt.
Sprungfunktion:
Kann der Inhalt eines Feldes aus einer anderen Relation übernommen
werden, so wird die Beschriftung für dieses Feld als Button
ausgeführt.
Beim Betätigen des Buttons wird ein Auswahlfenster aufgeblendet, wo
der Nutzer ein Eintrag auswählen kann.
Realisierungssprachen und Systeme
Als Zielsprache wurde Tcl/TK gewählt, da
- man in dieser hoch abstrakten Sprache schell schöne Oberflächen
bauen kann
- weil es eine ADABAS-D-Einbindung gibt
Prinzipell könnte man aber auch beliebige andere Sprachen nehmen.
Genauso sind auch andere Datenbanksysteme denkbar.
m4 ein Präprozessor, mit dem man komplizierte Macros ersetzen kann.
Beschreibung der Macros
- BEGINMASKE(Relationsname)
- hiermit beginnt eine Maske. Der Relationsname wird als
Titel-Label oben in die Make geschreiben.
- ENDEMASKE
- hiermit endet die Maske
- KEY(Feldname)
- Hiermit wird das Schüsselfeld für die Datenbankrelation
bekanntgemacht
- SUCHFELDER(Feldliste)
- Setzt Feldliste bei SELECT_anweisung bei freier Suche. Am anfang
muß ein Schlüsselfeld stehen.
- FELD(feldname,Typ,Laenge[,Dezimalstellen])
- Deklaration eines Feldes
- VERARB_FELD(Typ,Laenge[,Dezimalstellen])
- wie Feld, nur daß kein Feld auf der Maske erzeugt
wird.
Ein Einsatzfall ist, wenn man mehrere Relationen hat und die
Feldernamen sich überlappen.
- SPRUNG(Feldname,SQL-Anweisung)
- dieses wird vor dem FELD angegeben. Der Label wird als
Button ausgeführt. Es erscheint ein Auswahlfenster, das mit
SQL-Anweisung gefüllt wird. Bei der Auswahl wird dann
Feld gesetzt.
- POPUP(Feldname{,Auswahl})
- es wird für Feld Feldname ein Menubutton erzeugt. Beim
Betätigen dieses erscheint ein Menü mit den
Auswahl-Feldern.
Es wird ein Änderungstrace auf die Feldvarible gesetzt, so daß beim
ändern immer die Anzeige der aktuellen Wahl auf dem Menubutton
aktualisiert wird.
- POPUP2(Feldname{,Auswahl,Anzeige})
- wie POPUP, nur daß auf dem Button sowie im Menu die
Anzeige gesetzt wird, während dei Variable auf
Auswahl gesetzt wird
- AENDLOG(Zeitfeld,Nutzerfeld)
- setzt beim Speichern Zeitstempel und UNIX-Nutzer in Relation
- nonl
- Gewöhnlich wird jedes Feld mit Label in einem Frame
gepackt. Diese Frames werden untereinander angeordnet.
Folgt nach dem FELD nonl so wird das Das
Folge-Feld mit den diesem Frame gepackt und erscheint in der selben
Zeile
- EXTRAFENSTER(ueberschrift)
- Die folgenden Felder werden in einem Extra-Fenster dargestellt
In der Hauptmaske erscheinen für jedes Extrafenster Buttons, bei
dessen beträtigung das Extrafenster aufgeblendet wird.
- ENDEEXTRAFENSTER
- Ende des Extrafensters
Möchte man mehrere Relationen in der Maske bearbeiten, kann man eine
Forsetzungsmaske generieren:
- FORTSETZUNGSMASKE(Framenr,Relationsname)
- ähnlich BEGINMASKE, erzeugt Maskenfragment ab Framenr
- ENDEFORTSETZUNG
- Ende der Fortsetzungsmaske
Hier ist gedacht, daß der Programmierer das Datenpflegeprogramm für
eine Relation generiert. Für die anderen Relationen werden
Fortsetzungsmasken generiert. Dann werden die Programmfragmente manual
zusammengebaut.
weitere Ideen
- Aus den Metadaten wird auch noch herausgezogen, ob ein Feld
optional ist oder nicht. Entsprechend müssen die Macros erweitert
werden.
- Voreinstellungswerte sollten spezifiziert werden.
- Codefragmente für das Abspeichern, Plausibilitätsprüfungen
sollten mitspezifiziert werden können
Autor: Rudolf Weber
Copyright 1999
Download m4ober-0.1.tgz
Kaufmännisches: Je Aufruf spart dieses Produkt mindestens ein bis zwei
Stundenarbeit. Daher wird je generierter Maske und je Endkunden 100
Deutsche Mark fällig, die mit dem Verweis M4-TCLTK-Oberflaeche an
Konto Nr. des Informatik-und Netzwerkvereins Ravensburg e.V. fällig.
Haftung: es wird keinerlei Haftung übernommen