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

  1. Die Metadaten werden aus der Datenbank geholt und daraus eine einfache Maskenbeschreibung (M4-Macroaufrufe) generiert
  2. 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:

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:
  1. Der Nutzer gibt den Schlüssel ein und drückt auf den Druckknopf "Suchen"
  2. Ist der Satz vorhanden, wird er in den Feldern angezeigt
  3. In jedem Fall kann der Satz durch ausfüllen der Felder geändert bzw. erst geschaffen werden
  4. Falls der Satz gefunden wurde, wird eine UPDATE-Anweisung generiert und ausgeführt, wenn der "speichern"-Knopf betätigt wird
  5. 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 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


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