Flexible Datenbank-Eingabe in Deplate

Während wir scheinbar Fließtext schreiben, füttern wir unsere Datenbank.

Wir schreiben jetzt via Deplate mit selbstdefinierbaren Notationen Daten in beliebige Tabellen einer im Hintergrund laufenden SQL-Datenbank.

Man kann jetzt von Deplate aus mit selbstdefinierbaren Notationen Daten in beliebige Tabellen schreiben. Das leistet unser frei verfügbares Makropaket a2e.rb.

Je nach Schalter können wir einen Quelltext entweder als Befehlsserie für die Dateneingabe oder als Web-Dokument interpretieren. Wie die Daten im Web erscheinen, geben wir auch vor. Wir können die gleichen Eingabebefehle beliebig oft ausführen, ohne dass etwas mehrfach eingetragen wird.

1 Makro DBTAB: eine Relation definieren

Mit dem Deplate-Makro dbtab definiert man eine Relation. Mit db ruft man diese Relation auf und schreibt mit ihr einen Eintrag. Je nach dem ob die Deplate-Variable dbput wahr (1) oder falsch (0) ist, wird in die Datenbank geschrieben. In ein Ausgabedokument wird immer außerdem ein Eintrag geschrieben, der durch Einsetzen der übergebenen Feldwerte in eine Schreibschablone erzeugt wird.

Es werden zunächst Datenstrukturen definiert:

 - {dbtab keys="mail uid ref" vals="user host rem" 
 rem=mailrem ref=mailref user=mailuser 
 host=mailhost text=rem:Person {arg:mail_uid} ist 
 unter {arg:mail_user} bei {arg:mail_host} 
 erreichbar.}
 - {dbtab keys="tadok ta" vals="dok rem ktg" 
 rem=tarem ktg=taktg text=rem: Vorgang 
 {arg:tadok_ta} gehört zu {arg:tadok_ktg}; merke: 
 {arg:tadok_rem}}
 - {dbtab keys="person person" vals="nom des lok 
 rol typ mail" nom=persnom typ=perstyp des=persdes 
 text=des:Zu Person {arg:person_person} wird 
 einiges angegeben.}
 - {dbtab keys="perstyp prs" vals="typ" 
 perstyp=person prs=person typ=perstyp: Person 
 {arg:perstyp_prs} ist von Typ {arg:perstyp_typ}.}
 - {dbtab keys="persnom prs" vals="nom" 
 persnom=person prs=person nom=persnom: Person 
 {arg:persnom_prs} heißt {arg:persnom_nom}.}
 - {dbtab keys="spev spev" vals="spez dat typ rem" 
 spev=spzeven dat=spevdat typ=spevtyp rem=spevrem 
 text=rem:Am Tage {arg:spev_dat} trug sich 
 Ereignis {arg:spev_spev} des Typs {arg:spev_typ} 
 zur Akte {spev_spez} mit Notiz {arg:spev_rem} 
 hinzu.}
 - {dbtab keys="spez spez" vals="nom des mon odat 
 fdat de rkod ust rem fin" text=rem nom=speznom 
 des=spezdes mon=spezmon odat=spzodat fdat=spzfdat 
 de=spezde rem=spezrem fin=spzfinp rkod=spzrkod 
 ust=ustvat:Akte {arg:spez_spez}}
 - {dbtab keys="sskm spev" vals="spez ta dat typ 
 rem delta" sskm=spzsskm spev=spzeven dat=spevdat 
 typ=spevtyp rem=spevrem text=rem:In unserer Bank 
 trug sich {arg:sskm_spev} zu.}

Das Attribut keys gibt eine Liste aus

  • Relation (Tabellenkürzel) und
  • mindestens 1 Schlüsselfeld, über das man eine Dateneintrag eineutig identifizieren kann

vor. Diese können wie etwa in “person person” beide gleich lauten.

Das Attribut vals gibt mindestens 1 Wertfeld an, d.h. ein Feld, mit dem über den identifizierten Eintrag etwas ausgesagt wird.

Die übrigen Attribute sind Paare aus einem zuvor definierten Kürzel (Relation, Schlüsselfeld oder Wertfeld) und einem ihm entsprechenden Namen in der Datenbank (Tabellenname oder Spaltenname).

Eine Sonderstellung nimmt das Attribut text ein. Es verweist auf eines der definierten Wertfeldkürzel und sorgt dafür, dass die diesem Kürzel entsprechende Spalte mit den Inhalten gefüllt wird, die im Argument des Deplate-Makros (also nach dem Doppelpunkt) stehen. Typischerweise ist diese Spalte eine Kommentarspalte des SQL-Feldtyps text (beliebig langer Text).

Das Argument des Makros dbtab gibt an, wie ein Aufruf der definierten Relation mittels db in einem Dokument aussieht. Dabei kann man mit dem Makro arg auf die in den Argumenten definierten Felder zugreifen, indem man ihm als Argument einen Variablennamen übergibt, der aus einem an das Relationskürzel per Unterstrich angehängten Feldkürzel besteht.

2 Makro DB: Eintrag in die Relation schreiben

Die mit dem Deplate-Makro dbtab definierten Notationen verwendet man dann mit dem Deplate-Makro db, um Daten in Tabellen zu schreiben (oder, eben um diese gemäß der Schablone darzustellen).

Im folgenden findet man db im Einsatz:

 - {db rek="person dornach" 
 nom="Rechtsanwaltskanzlei Dornach" typ=frm 
 lok=muc rol=adr mail="dornach@t-online.de"}
 - {db rek="person MohrMB" nom="Benno MOHR" 
 lok=mohrfra rol=papr typ=hom 
 mail="mohr@mohr.com":GF der Fa Mohr Weichwaren 
 GmbH}
 - {db rek="ssskm kdbxfinpI59" spez=kdbxJ3 
 dat="2006-05-09" typ=p ta=a2e0605094:es geht doch}
 - {db rek="spez kdbxJ3" fin=t}
 - {db rek="sskm abfjK1070605" spez=abfjK1 
 ta=a2e0706052 delta=0: noch so ein Eintrag}
 - {db rek="person MohrStu" typ=frm nom="Mohr 
 Stuttgart": Filiale}
 - {db rek="person mohr" nom="Mohr Weichwaren 
 GmbH" mail="info@mohr.com"}

Wie man sieht werden hier im Attribut rek das Relationskürzel und die Werte der Schlüsselfelder aneinandergereiht. Dadurch wird der Dateneintrag identifiziert, über den dann im übrigen mithilfe von Paaren aus Wertfeldkürzeln und den zugehörigen Werten Aussagen getroffen werden. Dort, wo ein Text-Wertfeld definiert wurde, findet man dessen Inhalt im Deplate-Argument hinter dem Doppelpunkt.

Damit dieses System funktioniert, muss es immer mindestens ein Schlüsselfeld in der Tabelle geben. Es funktioniert nicht bei Tabellen eines populären Typs, wie man ihn von Ruby on Rails her kennt, bei denen das Schlüsselfeld implizit durch Inkrementierung erzeugt und nie von Menschen verwendet wird.

3 Verwendung mit mehreren Datenbanken

In welche Datenbank geschrieben wird, kann über die Variable dbnom festgelegt werden. In Prinzip können es beliebig viele sein, und innerhalb eines Dokuments kann gewechselt werden, aber man kann in einem Abschnitt immer nur auf eine Datenbank gleichzeitig zugreifen.

Achtung: Wird die Datenbank gewechselt, so funktioniert eventuell einiges nicht mehr so wie in den anderen Abschnitten des Dokumentes. Z.B. kann man in einem Abschnitt, in dem in eine fremde Datenbank eingegeben wird, u.U. keine Verweise auf Dokumente verwenden, die mit DOK-Zeichen aus der eigenen Datenbank identifiziert werden.

Ein Anwendungsbeispiel für das Schreiben in eine Fremddatenbank findet sich im folgenden (suche dbnom=ffii).

4 Verwendung mit ‘make’

Im Zusammenhang mit unserem Hypertext-Dateisystem haben wir uns ein paar Befehle zurechtgelegt, mit denen wir normalerweise die Dateneingabe durchführen.

Wenn wir

$ make dbput

sagen, wird die Dateneintragung aktiviert und nebenbei wird eine schlichte Textdatei erzeugt.

Bei allen anderen make-Befehlen, die deplate aufrufen, werden keine Daten eingetragen.

Man kann die Daten ruhig immer wieder schreiben, denn dank der eindeutigen Identifizierung der Einträge durch Schlüsselfelder kann kaum etwas schief gehen.

Allerdings wäre solche wiederholte Einschreibung eine Verschwendung von Rechenzeit. Deshalb unterlassen wir das normalerweise.

Auch wenn wir make dbput aufrufen, werden nur in den Teilen des Dokuments, in denen die Variable dbput eingeschaltet ist, Daten geschrieben. Am besten schaltet man dbput am Anfang eines Abschnitts ein und beginnt man einen neuen Abschnitt, bevor man dbput wieder ausschaltet.

* Meine Definitionen

Diese folgenden Definitionen sind im Dokument 
unsichtbar und werden in keine Datenbank 
geschrieben.

{dbtab keys="person person" vals="nom des lok rol 
typ mail" nom=persnom typ=perstyp des=persdes 
text=des:Angaben zu Person {arg:person_person}}

* Meine Daten
#VAR: dbput=1
#VAR: dbnom=ffii

Was jetzt kommt, ist im Dokument sichbar und wird 
immer dann in die FFII-Datenbank geschrieben, wenn 
als Ausgabeformat in Deplate {code:plain} gewählt 
ist.

 - {db rek="person mohr" nom="Mohr Weichwaren 
 GmbH" mail="info@mohr.com"}

* Sonstige Texte
#VAR: dbput=0 
#VAR: dbnom=a2e

Ab hier wird nicht mehr in die Datenbank 
geschrieben.
Auch nicht, wenn hier {code:db}-Makros stehen.
Sofern auf eine Datenbank zugegriffen wird, ist es 
nunmehr die a2e-Datenbank.

5 Resourcen

  • Finanzen 2008-02 – erste Gehversuche mit der neuen Syntax
  • Deplate-Module – die Funktionalität wird mit unserem Modul a2e.rb umgesetzt
  • FFII-Datenbankschema – die hier beschriebenen Grundprinzipien müssen eingehalten werden, damit die hier beschriebene flexible Eingabe via Deplate funktioniert

6 Vergangenheit

  • dat: 2008-02-07; prs: phm: PILCH Hartmut richtet dieses Verzeichnis ein.
[ ADV | 2008 | Februar | Was War | 錄音筆 | Deplate ]
Gültiges XHTML 1.0! Gültiges CSS! deplate
http://a2e.de/adv/08/02/dbtab
© 2008-02-07 Hartmut PILCH