Datenbank Party-Service unter Adimens, Teil 3

Im letzten Teil hatten wir die Datenbank angelegt, in EXEC aufgerufen und einige Datensätze eingegeben. Heute wollen wir mit der praktischen Arbeit fortfahren.

Abb. 1: Der Party-Desktop

Zunächst richten wir unseren eigenen Desktop ein (Abb. 1). Hierzu werden die Sinnbilder einfach mit der Maus an die gewünschte Stelle gezogen. Am meisten werden wir mit der Datei KUNDE arbeiten, deshalb kommt sie nach links oben. Mit KUNDE werden durch Mischen die Importdateien für EINKAUF und OP, aber auch die Auftragsbestätigung, Einkaufsliste und Rechnung erzeugt, darum schieben wir das Mischen-Symbol unter KUNDE.

Aus KUNDE werden nur einige Datensätze benötigt. Dann arbeitet man schneller über das Klemmbrett, also setzen wir es neben KUNDE.

Nach dem Mischen müssen für EINKAUF und OP Importdateien erzeugt werden. Hierzu ist das Symbol Mischen auf die Diskette zu ziehen. Dieses Symbol gehört also unter das Mischen-Icon.

Listen und Schreiben sind auszudrucken, weshalb das Drucker-Symbol unter das der Diskette gehört.

EINKAUF und OP werden per Import gespeist. Wir ordnen daher die Symbole für diese beiden Dateien rechts und links von der Im/Export-Schublade am oberen Bildrand an.

Mit den Dateien BUFFET, REZEPT und ZUTATEN wird nur relativ selten gearbeitet und von einer anderen Person, dem Koch. Also schieben wir diese Dateien nach rechts unter die Schalttafel.

Jetzt bleiben nur der Papierkorb und das Sortierbrett übrig. Der Papierkorb muß in die linke untere Ecke, um ihn auch bei geöffnetem Fenster bedienen zu können.

Bei verschiedenen Eingaben und Importen muß gerechnet werden. Die Rechnungen sind so definiert, daß sie entweder unschädlich doppelt ausgeführt werden dürfen oder per SYSMODE auf bestimmte Operationen beschränkt sind. Deshalb dürfen wir RECHNEN auf der Schalttafel aktivieren, d.h. schwarz klicken.

Nachdem der Arbeitsdesktop nun anwendergerecht gestaltet wurde, speichern wir ihn als PARTY.INF ab, mit »Arbeitsumgebung sichern...« im Datei-Menü.

Für die Dateien KUNDE, OP und EINKAUF werden Rechendefinitionen benötigt, die als <Dateiname>. CAL gespeichert wurden. Um sie beim Arbeiten nicht jedesmal neu laden zu müssen, legen wir uns mit unserem Texteditor eine »Batch-Datei« an. Sie muß lauten:

KUNDE:KUNDE.CAL 
EINKAUF:EINKAUF.CAL 
OP:OP.CAL

und wird als PARTY.BAT auf der Ebene der PARTY-Dateien gespeichert. Diese Datei bewirkt, daß beim Aufrufen der Datenbank alle angegebenen Rechendefinitionen automatisch geladen werden.

Bei der bisherigen Konfiguration müßte nach Aufruf der Datenbank der Desktop mit »Arbeitsumgebung laden...« hergestellt werden. Auch das läßt sich automatisieren. Hierzu ist - mit einem Texteditor - in EXEC.INF die erste Zeile in ».INF« zu ändern. Beim Starten von EXEC.PRG wird so nach einer INF-Datei gefragt. Durch Eingabe von PARTY.IN wird die Datenbank mit ihrem Desktop und den Rechendefinitionen geladen. Ist PARTY die einzige Datenbank, können wir durch »Arbeitsumgebung sichern...« als EXEC.INF bewirken, daß beim EXEC-Start die Datenbank automatisch aufgerufen wird. Da EXEC. PRG normalerweise nicht im PARTY-Ordner liegen wird, müssen wir auf der Ebene von EXEC.INF als EXEC.BAT ein Doppel unserer »Batch-Datei« anlegen. Es unterscheidet sich von der ursprünglichen dadurch, daß nach dem Doppelpunkt die zugehörige Rechendatei mit voller Pfadangabe steht, also z.B.

KUNDE:E:\PARTY\KUNDE.CAL

Jetzt wollen wir überprüfen, ob Misch-Schreiben ordentlich ausgegeben werden. Das Mischformular eines solchen Anschreibens beginnt mit der Adresse, also

#An#
#Kunde(3)##Kunde(1)#
#Kunde(2)#
#Straße#
#PLz# #Ort#

Was passiert aber, wenn unsere Merkmale »An« oder »Kunde(2)« leer sind? Dann würden an dieser Stelle Leerzeilen ausgegeben! Bei »An« mag das nicht so schlimm sein, eine Leerzeile zwischen dem Namen und der Straße wirkt aber nicht gut. Adimens hat deshalb eine Funktion zur Zeilenunterdrückung für leere Merkmale eingebaut. Man muß dazu nur statt

#An#    #%An#
#Kunde(2)# #%Kunde(2)#

schreiben. Aber Achtung! Benutzen Sie das vorangestellte Prozentzeichen nie in Zeilen mit mehreren Merkmalen. Wäre z.B. »Kunde(3)# leer, »Kunde(1)« darf nicht leer sein, würde auch diese Zeile unterdrückt. Diese Einschränkung ist durchaus vernünftig, weil in einer Zeile mit mehreren Merkmalen für Leerinhalte nichts geschrieben wird. Sehen wir uns die Namenzeile an. Dort steht

#Kunde(3)##Kunde(l)#

wobei wichtig ist, daß sich zwischen den Merkmalkennzeichnungen »#« kein Leerzeichen befindet. Wir müssen deshalb darauf achten, daß Eintragungen in »Kunde(3)« mit einem Leerzeichen enden. Am einfachsten wird das mit einer Rechenoperation abgesichert:

IF |SYSMODE| = 1 THEN 
IF NOT Kunde(3) = "" THEN 
Kunde(3) = Kunde(3)+"";
ENDIF;
ENDIF;

Die Einschränkung auf Sysmode = 1 bewirkt, daß diese Rechnung nur beim Einfügen, nicht beim Ändern, durchgeführt wird. Und die IF-NOT-Bedingung hängt Leerzeichen nur an, wenn Kündet 3) nicht leer ist.

Nun dürfen wir aber nicht vergessen, daß nach der Adresse ein Betreff oder die Briefanrede kommt. Üblicherweise steht diese Zeile nach der oberen Falzmarke. Werden nun Zeilen unterdrückt, wandert der Betreff ebenfalls nach oben.

Wieder muß ein Trick her. Wir verzweigen in INIT und legen in der Datei KUNDE ein Textfeld »L« (für leer) der Länge 1 mit 2 Merkmalfeldern an und kehren mit »Db generieren« zurück. Anschließend muß die Rechnung KUNDE. CAL mit einem Texteditor (im Nicht-WP-Modus) ergänzt werden. Zunächst wird am Ende der vorhandenen Definitionen die o.g. angeführte doppelte IF-Schachtel eingetragen, dann

L(1) = "";L(2) = "";
IF An = THEN
L(1) = " "
ENDIF;
IF Kunde(2) = "" THEN 
L(2) = " "
ENDIF;

Hier werden zunächst die Inhalte der beiden Leerfelder gelöscht und, falls »An« oder »Kunde(2)« leer sind, ein Leerzeichen in »L(1)« bzw. »L(2)« eingetragen.

Anschließend ist KUNDE.CAL zu sichern und zur Datenbank zurückzukehren.

Schreiben wir jetzt die Adresse

#An#
#Kunde(3)##Kunde(1)#
#Kunde(2)#
#Straße 
#PLz# #Ort#
#%L(1)
#%L(2)

wird die Zeilenverschiebung (infolge von Leerfeldern) ausgeglichen, da an Stelle jeder entfallenen Zeile »An« oder »Kunde(2)« eine Zeile »L(1)« bzw. »L(2)« mit einem Leerzeichen gedruckt wird. Also ist die notwendige Zeilenanzahl und damit der Abstand der letzten Adreßzeile zum Betreff wieder hergestellt.

Abb. 2: Von Kunde bis Einkauf und OP

Jetzt stellen wir die Parameter für den Im/Export sowie die Seitenformatierung und Druckereinstellungen ein. Per Doppelklick auf das zugehörige Symbol öffnet sich die zugehörige Dialogbox, die entsprechend einzustellen ist. Wir speichern sie mit »Arbeitsumgebung sichern...« im Datei-Menü.

Bei den Im/Export ist die Datensatz-Trennung als (13X10) und die Feld-Trennung als "," einzustellen.

Die Seiteneinstellungen werden wirksam, sobald eine, aus einem im Nicht-WP-Modus geschriebenen Mischformular entstandene, Mischoperation auf das Diskettensymbol gezogen wird. Handelt es sich um eine Liste sollte Seitenvorschub auf AUS, sonst auf EIN stehen.

Bei der Druckereinstellung kann die »Direktausgabe« wichtig sein, falls Sie nämlich mit dem »IBM 2«-Zeichensatz arbeiten wollen (wegen der Umlaute) oder zwischen NLQ- und Normaldruck unterscheiden wollen. Das muß ihrem Drucker mitgeteilt werden. Der Inhalt der Direktausgabezeile wird bei Druckbeginn an den Drucker geschickt.

Wenn Sie diesen Datenbankkurs von Anfang an mitgemacht haben, befinden sich in der Datenbank schon einige Datensätze. Wir wollen jetzt zu einem Auftrag die Einkaufsliste erstellen. Im vorigen Kursteil lernten wir, über ein Mischformular die Zutaten herauszuschreiben, um sie in die Datei Einkauf zu übertragen. Die Arbeitsschritte gehen aus Abb. 2 hervor. Wir öffnen mit einem Doppelklick auf KUNDE eine Liste, suchen den Kunden und ziehen ihn mit gedrückter Maustaste auf das Mischen-Symbol (1a). Im Auswahlfenster suchen wir das zugehörige Mischformular (1b) und klicken doppelt darauf. Nach Beendigung des Mischens wird das Misch-Symbol (heißt jetzt KUNDE) mit gedrückter Maustaste auf das Disketten-Symbol gezogen (2a) und im Auswahlfenster als Name EINKAUF.EXP angegeben (2b). Anschließend muß das Im/Export-Symbol mit gedrückter Maustaste auf die Datei EINKAUF gezogen (3a) und EINKAUF.EXP ausgewählt werden. In der sich öffnenden Abfragebox sagen wir »Anzeigen« und beobachten den Datensatz-Import. Beachten Sie bitte, daß die zu EINKAUF gehörige Rechnung geladen ist.

Das Mischformular für die Einkaufsliste muß noch - mit einem Texteditor - im Nicht-WP-Modus geschrieben werden. Es hat drei Zeilen und lautet...

1. Zeile
#Termin# #Pers# Personen #Kunde(1)#
2. Zeile
#Buffet->EINKAUF#
#Zutat:-27##Menge:8#
#Einh#
3. Zeile 
#<-#

Dieses Mischformular wird als EINK_LST.DOC gespeichert.

Zum Ausdrucken der Einkaufsliste wird KUNDE wieder als Liste geöffnet, der passende Name mit gedrückter Maustaste auf »Mischen« gezogen und EINK_LST.DOC doppelt angeklickt. Anschließend darf das zu KUNDE umbenannte Mischsymbol auf den Drucker gezogen werden, da hier keine Textattribute Vorkommen.

Das Anlegen des OP-Datensatzes geschieht in gleicher Weise, nur daß als Mischformular OP.DOC benutzt wird, die zu erzeugende Exportdatei OP.EXP heißt und das Im/Export-Symbol auf OP zu ziehen ist. Auch hier muß vorher OP.CAL geladen sein.

Auch das Erstellen einer Auftragsbestätigung oder Rechnung gleicht weitgehend dem Ablauf, der für Einkaufsliste geschildert wurde. Natürlich müssen zunächst die Mischformulare geschrieben sein. Sic enthalten vermutlich auch Textattribute, also »fett« usw. In diesem Fall muß der WP-Modus benutzt und kann nicht unmittelbar aus dem Mischsymbol gedruckt werden, weil sich der zum Textprogramm gehörige Druckertreiber von EXEC. CFG unterscheidet. Wir müssen dann zunächst eine Druckdatei anlegen.

Sie entsteht per Ziehen des Misch- auf das Diskettensymbol und Vergabe eines Dateinamens. Diese Datei ist dann mit dem Textprogramm auszudrucken. Falls Sie über einen Texteditor verfügen, der es erlaubt Druckersteuerzeichen einzugeben, etwa »Tempus«, läßt sich diese umständliche Prozedur umgehen. Wir schreiben das Mischformular im Nicht-WP-Modus, speichern es und setzen die Steuerzeichen ein, z.B beim NEC P6 für

NLQ fett ein EscE
NLQ fett aus EscH

beim HP-DeskJet500 für:

NLQ fett ein Esc(s3b2Q
NLQ fett aus Esc(s0b2Q

und für:

Seitenende <Alt>+<12>

Die anzuwendenden Steuersequenzen können Sie dem Druckerhandbuch entnehmen. Das ist zwar etwas mühsam, macht sich aber schnell dadurch bezahlt, daß der Umweg über die Druckzwischendatei vermieden wird. Der Abstand Kopf bis erste Zeile muß in diesem Fall in Form von Leerzeilen geschrieben werden, linker Rand und Schriftqualität sind als »Direktausgabe« bei der Druckereinstellung anzugeben.

Während des Arbeitens wäre cs praktisch, Hilfestellungen bekommen zu können. Man sollte nicht davon ausgehen, daß der jeweilige Anwender alle Routinen beherrscht. Dieses Problem läßt sich aber relativ leicht lösen.

Wir gehen in INIT und legen eine neue Datei HILFE an. Sie ist sehr einfach aufgebaut. »Was« ist ein 25-stelliges Schlüsselfeld vom Typ Text, »Wie« ein mehrzeiliges Textfeld mit der maximalen Stellen- und Zeilenanzahl. Verbindungen zu anderen Dateien bestehen nicht. Für den Speicherbedarf sollten 25 bis 35 Datensätze reichen. Per »Db generieren« schreiben wir die Änderung fest.

Nach Rückkehr aus INIT müssen wir die Hilfen eingeben.

Für die praktische Arbeit mit HILFE gibt es dann zwei Möglichkeiten. In jedem Fall muß HILFE aktiviert sein. Anschließend können wir die Datei per Doppelklick oder per [Anzeigen] als Liste öffnen, dort die Frage suchen und die Maske öffnen, oder per [Suchen] die Frage eingeben und mit OK die Maske aufrufen.

Diese Datenbank läßt ein einwandfreies Arbeiten zu, wenn auch etwas mühsam, weil die zugehörigen EINKAUF- und OP-Datensätze per Mischen, Datei anlegen und importieren zu erzeugen sind.

Adimens erlaubt aber auch VIEWs bzw. JOINs als sog. Verbünde anzulegen. Diese Verbünde sind zwar, gegenüber echten VIEWs oder JOINs Krücken, erfüllen aber ihren Zweck.

Zur Wiederholung: Unter VIEW versteht man Masken, die Bestandteile aus mehren Dateien (Karteien) enthalten. Einen VIEW kann man nur ansehen, mit einem JOIN auch Daten manipulieren. Echte VIEWs oder JOINs reservieren sich dazu im Hauptspeicher Platz und laden dorthin die gewünschten Teile aus den verschiedenen Datensätzen. Je nach Definition können diese Datenkombinationen nur als Maske angezeigt oder auch bearbeitet werden. Das Problem bei Adimens scheint zu sein, daß es unter GEM arbeitet. Die Programmierer haben daher das Problem VIEW und JOIN dadurch gelöst, daß in INIT einmal die Verbindungen zu den beteiligten Dateien geschaltet und die zugehörige Maske angelegt wird. In einem solchen Verbund können jetzt aus einer zugehörigen Datei mehrere Datensätze eingehen, etwa bei Aufträgen mehrere Artikeldatensätze. Und das scheint der Knackpunkt gewesen zu sein. Zunächst muß ja nicht unbedingt bekannt sein, wieviele solche dazugehörigen Datensätze existieren. Dieses Problem stellt sich übrigens auch bei der Anlage eines Verbundes.

Der langen Rede kurzer Sinn! In Verbunden kann z.B. der COUNT-Be-fehl nicht benutzt werden. Fragt man nach der Datensatzanzahl, erhält man die Antwort 65.535 und Verbünde erwarten, daß der Verzweigungsschlüssel als eindeutig definiert ist.

Im nächsten Teil dieses Kurses erfahren Sie mehr darüber. (uw)


Hans Körner
Aus: ST-Magazin 08 / 1993, Seite 64

Links

Copyright-Bestimmungen: siehe Über diese Seite