diff options
Diffstat (limited to 'doc/eudas/eudas.hdb.13')
-rw-r--r-- | doc/eudas/eudas.hdb.13 | 757 |
1 files changed, 0 insertions, 757 deletions
diff --git a/doc/eudas/eudas.hdb.13 b/doc/eudas/eudas.hdb.13 deleted file mode 100644 index 435fbfc..0000000 --- a/doc/eudas/eudas.hdb.13 +++ /dev/null @@ -1,757 +0,0 @@ -#limit (11.0)##pagelength (16.5)##block# -#start (2.0,0.0)# -#page (133)# -#headodd# -#center#EUDAS#right#% - -#end# -#headeven# -%#center#EUDAS - -#end# -#center#1 - -13 Programmierung von Druckmustern - - - -13.1 Abkürzungen - -In den vorigen Kapiteln haben Sie erfahren, daß man Feldmuster -von ganz bestimmter Länge definieren kann, deren Inhalt in genau -dieser Länge eingesetzt und bei Bedarf abgeschnitten wird. Bei der -Angabe dieser Länge spielt jedoch die Länge des Feldnamens eine -ganz entscheidende Rolle. Das kürzeste Feldmuster fester Länge, das -Sie definieren können, ist nämlich zwei Zeichen länger als der Feld -name (ein Musterzeichen vorher und eins nachher). - Hätte das Feld 'PLZ' den Namen 'Postleitzahl' bekommen, so -müßte ein solches Feldmuster mindestens eine Länge von 14 Zeichen -haben. Damit Sie mit diesem Feldnamen auch ein Feldmuster der -Länge 4 bekommen können (Postleitzahlen haben in den seltensten -Fällen mehr als 4 Stellen), haben Sie die Möglichkeit, den Namen -'Postleitzahl' für die Verwendung im Druckmuster geeignet abzu -kürzen. - Abkürzungen haben jedoch noch eine viel weitreichendere -Bedeutung. Mit ihnen ist es möglich, nicht nur die Feldinhalte einer -EUDAS-Datei einzusetzen, sondern auch jeden anderen Text, den Sie -mit einem ELAN-Programm erzeugen können. - Die einfachsten zusätzlichen Daten, die Sie verwenden können, -sind z.B. Datum und Uhrzeit. Für weitergehende Zwecke können Sie -die Inhalte der EUDAS-Datei auch für Berechnungen verwenden und -damit so umfangreiche Probleme wie das Schreiben von Rechnungen -oder statistische Auswertungen unter Verwendung eines Druck -musters lösen. - -#on("b")#Abkürzungsteil#off("b")# Abkürzungen werden in einem speziellen -Abkür -zungsteil am Ende eines Abschnittes angegeben. Der Abkürzungsteil -wird durch die Anweisung - - - % ABKUERZUNGEN - - -eingeleitet. Eine Abkürzungsdefinition hat eine ähnliche Form wie -ein Refinement (Falls Sie nicht wissen, was das ist, vergessen Sie -es). Zu Beginn steht der Name der Abkürzung in Form eines Feld -musters, beginnend in der ersten Spalte. Danach folgt, durch Leer -zeichen getrennt, ein Doppelpunkt in der gleichen Zeile. Daran -schließt sich ein beliebiger ELAN-Ausdruck an, der sich in freiem -Format über beliebig viele Zeilen erstrecken kann und mit einem -Punkt abgeschlossen werden muß. Dieser ELAN-Ausdruck muß ein -TEXT-Objekt liefern. - -#on("b")#Feldinhalt#off("b")# Für die Abfrage von Inhalten aus einer -EUDAS-Datei ist der Ausdruck - - - f ("Feldname") - - -vordefiniert. Die Abkürzung des Feldes 'Postleitzahl' würde also als -Ausschnitt folgendermaßen aussehen: - - - % ABKUERZUNGEN - &p : f ("Postleitzahl") . - - -Mit dieser Definition kann man im Muster so verfahren, als ob das -Feld 'Postleitzahl' auch 'p' hieße. Diese einfachste Form der Ab -kürzung können Sie natürlich variieren, indem Sie für 'p' und -'Postleitzahl' Ihre eigenen Namen einsetzen. - -#on("b")#Übersetzung#off("b")# Beachten Sie, daß das Druckmuster in ein -ELAN-Pro -gramm umgeformt werden muß, da ELAN-Ausdrücke in ihm vorkom -men. Das automatisch erzeugte ELAN-Programm wird dann vom -ELAN-Compiler übersetzt und ausgeführt. Fehler in den ELAN-Aus -drücken im Abkürzungsteil können erst vom ELAN-Compiler ent -deckt werden. Dieser kennt jedoch das Druckmuster nicht und mel -det die Fehler anhand des generierten Programms. Sie müssen in -einem solchen Fall aufpassen, daß Sie die Fehlerquelle an der rich -tigen Stelle im Druckmuster lokalisieren (Hilfestellungen dazu sind -im Kapitel über die Übersetzung von Druckmustern zu finden). - -#on("b")#Beispiel#off("b")# Um die Verwendung von Abkürzungen zu -demonstrieren, wollen wir folgendes Druckmuster betrachten: - - - % VORSPANN - Adressenliste als Beispiel für Abkürzungen - Stand: &Datum - ------------------------------------------ - % ABKUERZUNGEN - &Datum : date . - - % WIEDERHOLUNG - &&l : &Vorname %Name - &Strasse - &&p& &Ort - ------------------------------------------ - % ABKUERZUNGEN - &l : lfd nr . - &p : f ("PLZ") . - - % NACHSPANN - &l Adressen gedruckt. - - -Dieses Beispiel enthält eine ganze Reihe interessanter Details. Als -erstes sollten Sie registrieren, daß auch im Vorspann oder Nach -spann Feldmuster verwendet werden können. Soll in diesem Fall ein -Feldinhalt aus der EUDAS-Datei eingesetzt werden, so werden beim -Vorspann die Inhalte des ersten und beim Nachspann die Inhalte des -letzten durch Suchmuster ausgewählten Satzes verwendet. Daher -kann auch jeder Abschnitt einen Abkürzungsteil haben. Abkürzun -gen gelten jedoch für alle Abschnitte (s. '&l'); die Aufteilung in -mehrere Abkürzungsteile fördert im wesentlichen die Übersichtlich -keit. - Versuchen Sie, an diesem Beispiel die wichtigsten Unterschiede -zwischen dem #on("i")#Musterteil#off("i")# und dem #on("i")#Abkürzungsteil#off("i")# eines Abschnittes -zu verstehen. Das Format des Musterteiles soll in die Ausgabe -übernommen werden; daher ist dort die Stellung jedes Wortes wich -tig. Im Abkürzungsteil definieren Sie Abkürzungen ohne bestimm -tes Format - mit der einzigen Ausnahme, daß eine Abkürzungs -definition mit einem '&' in der ersten Spalte anfangen und ein -Leerzeichen vor dem Doppelpunkt haben muß. Wie Sie sehen, dürfen -dort Leerzeilen zur besseren Lesbarkeit eingefügt werden. -Sie sollten bei unserem Beispiel folgende Ausgabe erhalten: - - - Adressenliste als Beispiel für Abkürzungen - Stand: 28.12.84 - ------------------------------------------ - 1 : Herbert Wegner - Krämergasse 12 - 5000 Köln - ------------------------------------------ - 2 : Helga Sandmann - Willicher Weg 109 - 5300 Bonn 1 - ------------------------------------------ - 3 : Albert Katani - Lindenstr. 3 - 5210 Troisdorf - ------------------------------------------ - 4 : Peter Ulmen - Mozartstraße 17 - 5 Köln 60 - ------------------------------------------ - 5 : Karin Regmann - Grengelweg 44 - 5000 Köln 90 - ------------------------------------------ - 6 : Hubert Arken - Talweg 12 - 5200 Siegburg - ------------------------------------------ - 7 : Anna-Maria Simmern - Platanenweg 67 - 5 Köln 3 - ------------------------------------------ - 8 : Angelika Kaufmann-Drescher - Hauptstr. 123 - 53 Bonn 2 - ------------------------------------------ - 9 : Harald Fuhrmann - Glockengasse 44 - 5000 Köln 1 - ------------------------------------------ - 10 : Friedrich Seefeld - Kabelgasse - 5000 Köln-Ehrenfeld - ------------------------------------------ - 10 Adressen gedruckt. - - -Nun zu den Abkürzungen im einzelnen. Das Feld 'PLZ' muß abge -kürzt werden, damit es rechtsbündig vor den Ort gedruckt werden -kann. Die Abkürzung 'p' benutzt die im vorigen Kapitel beschriebe -ne Form zur Abfrage des Feldinhaltes. - 'Datum' wird als Abkürzung für das aktuelle Datum definiert, -ein häufig benötigter Fall. 'date' ist der ELAN-Ausdruck, der das -Datum liefert. (Bemerkung für ELAN-Programmierer: der Name der -Abkürzung gehorcht nicht der ELAN-Syntax für Bezeichner). - Eine für Tabellen sinnvolle Funktion wird bei der Definition -von 'l' verwendet. Der von EUDAS definierte Ausdruck 'lfd nr' lie -fert die laufende Nummer des gerade gedruckten Satzes als Text. -Dabei ist zu beachten, daß die laufende Nummer nicht mit der Satz -nummer übereinstimmt, sondern nur während des Druckvorganges -von 1 an bei jedem gedruckten Satz hochgezählt wird. Diese Funk -tion dient dazu, die Sätze in der Liste durchzunumerieren. - Die laufende Nummer soll in der Liste rechtsbündig mit Doppel -punkt vor dem Namen stehen. Dazu wird das Feldmuster '&&l' be -nutzt, eine Form, die eigentlich keinen Sinn hat (die Kombination -'variable Länge' und 'rechtsbündig' gibt es nicht). Um ein möglichst -kurzes Feldmuster schreiben zu können, wird in diesem Fall jedoch -feste Länge unterstellt (auch ohne folgendes '&'). Damit hat das -kürzeste Feldmuster fester Länge drei Zeichen sowohl im linksbün -digen ('&l&') wie auch im rechtsbündigen Fall ('&&l'). - -#on("b")#Auswertungen#off("b")# Die Verwendung der Abkürzung 'l' im Nachspann -kann als erstes Beispiel für eine Auswertungsfunktion gelten. Da -für den Nachspann die Daten des letzten Satzes verwendet werden, -erscheint hier die laufende Nummer des letzten Satzes und somit die -Anzahl der Sätze, die gedruckt wurden. Das kann dazu benutzt -werden, die Sätze zu zählen, die eine bestimmte Suchbedingung -erfüllen. Folgendes Druckmuster zählt die Anzahl der Frauen oder -Männer in der Datei: - - - % NACHSPANN - &l Personen mit dem Geschlecht '%<m/w>' vorhanden. - % ABKUERZUNGEN - &l : lfd nr . - - -Wenn Sie vor dem Drucken jetzt die Suchbedingung 'm' für das Feld -'m/w' einstellen, werden alle Männer ausgewählt. Das Drucken be -steht in diesem Fall nur aus dem Hochzählen der laufenden Nummer -für jeden Mann. Im Nachspann kann das Ergebnis dann ausgegeben -werden; zugleich soll der aktuelle Wert des Feldes 'm/w' gedruckt -werden, damit das Druckmuster auch für das Zählen der Frauen -verwendet werden kann. - Die beiden möglichen Ausgaben würden dann so aussehen: - - - 6 Personen mit dem Geschlecht 'm' vorhanden. - - 4 Personen mit dem Geschlecht 'w' vorhanden. - - -#on("b")#Zusammenfassung#off("b")# Wir können die Erkenntnisse dieses -Abschnittes wie folgt zusammenfassen: - -* Feldmuster können auch im Vorspann und Nachspann verwendet - werden. Im Vorspann werden die Daten des ersten, im Nachspann - die Daten des letzten ausgewählten Satzes verwendet. - -* Der Musterteil eines Abschnittes definiert ein Format; der Ab - kürzungsteil ist formatfrei. - -* 'lfd nr' dient zum Durchnumerieren aller gedruckten Sätze. - -* Ein rechtsbündiges Feldmuster hat immer auch feste Länge. - -#on("b")#Komplexe Abkürzungen#off("b")# Mit Hilfe von Abkürzungen können wir -jetzt auch bessere Musterbriefe schreiben. Ein Problem, das bereits -angesprochen wurde, besteht darin, daß in der Anrede je nach Ge -schlecht 'Herr' oder 'Frau' stehen soll. Um dieses Problem zu lösen, -wird der Inhalt des Feldes 'm/w' benötigt. - Da in einer Abkürzung jede ELAN-Anweisung erlaubt ist, die -einen Text liefert, können natürlich auch #on("i")#IF-Anweisungen#off("i")# verwen -det werden. Mit diesen Informationen können wir jetzt die Abkür -zung 'Anrede' definieren: - - - % ABKUERZUNGEN - &Anrede : - IF f ("m/w") = "w" THEN - "Frau" - ELSE - "Herr" - END IF . - - -Für Nicht-Programmierer: Die IF-Anweisung besteht aus einer Ab -frage und zwei Alternativen. Die Abfrage steht zwischen dem IF und -dem THEN und besteht in der Regel aus einer Abfrage, ob zwei -Dinge gleich oder ungleich (<>), größer oder kleiner sind. Außerdem -können mehrere Abfragen mit AND (und) und OR (oder) kombiniert -werden. Näheres dazu im Kapitel 14. - Die Alternative hinter dem THEN wird ausgewählt, wenn die -Abfrage zutrifft. An dieser Stelle sind wieder beliebige Ausdrücke -erlaubt, die einen Text liefern, einschließlich erneuter IF-Anwei -sungen (Schachtelung). Die Alternative zwischen ELSE und END IF -wird ausgewählt, wenn die Abfrage nicht zutrifft. - -#on("b")#Textkonstanten#off("b")# Bisher wurden nur ELAN-Funktionen als -Textlie -feranten betrachtet ('date', 'lfd nr', 'f'). In unserem Fall werden -aber #on("i")#Textkonstanten#off("i")# in den Alternativen der IF-Anweisung benö -tigt. Textkonstanten werden in ELAN in Anführungsstriche einge -schlossen, die aber nicht zum Text gehören. Innerhalb einer Text -konstanten werden Leerzeichen wie alle anderen Zeichen angesehen -(erscheinen also auch nachher in der Ausgabe). - Bei solchen Abkürzungen, die längere Anweisungen umfassen, -sollten Sie das freie Format ausnutzen und eine möglichst über -sichtliche Darstellung wählen. Wie Sie sehen, muß nur der Doppel -punkt noch in der ersten Zeile stehen, der Rest kann sich beliebig -auf die folgenden Zeilen erstrecken. - -#on("b")#Beispiel#off("b")# Ein typischer Einsatz einer IF-Anweisung für die -Anrede sieht so aus: - - - % WIEDERHOLUNG - - Sehr geehrte&Anrede %<Name>! - - ... - % ABKUERZUNGEN - &Anrede : - IF f ("m/w") = "m" THEN - "r Herr" - ELSE - " Frau" - END IF . - - -Sie sollten jetzt diese Konstruktion in einen Musterbrief einfügen -können. Probieren Sie ihn dann als Beispiel aus ! - -#on("b")#Weitere Möglichkeiten#off("b")# Durch Verwendung von Abkürzungen ist -es -auch möglich, rechtsbündige Felder mit einer Länge von weniger als -3 Zeichen zu simulieren. Dies geschieht mit Hilfe der Textoperatio -nen von ELAN. Ohne ELAN-Vorkenntnisse können Sie dieses Bei -spiel überlesen. In unserer Liste im obigen Beispiel sind die laufen -den Nummern höchstens zweistellig und sollten deshalb auch nur -zwei Stellen belegen. Dies würde folgende Abkürzung ermöglichen: - - - % ABKUERZUNGEN - &l : text (lfd nr als zahl, 2) . - lfd nr als zahl : int (lfd nr) . - - -Die Prozedur 'text' wird dazu benutzt, eine Zahl rechtsbündig auf -zwei Stellen zu formatieren (s. EUMEL-Benutzerhandbuch). Da die -Abkürzung immer eine Länge von zwei Zeichen hat, kann sie auch in -einem Feldmuster variabler Länge eingesetzt werden. Die Attribute -'feste Länge' und 'rechtsbündig' werden in diesem Fall also nicht -durch das Feldmuster, sondern durch die Abkürzung selbst erzeugt. - Um die Prozedur 'text' anwenden zu können, muß die laufende -Nummer als Zahl (sprich: INT-Objekt) vorliegen. Diese Umwandlung -wird mit der Prozedur 'int' vorgenommen, die einen Text in eine -Zahl umwandelt. Obwohl man 'int (lfd nr)' direkt in den Aufruf von -'text' hätte schreiben können, wird hier als Demonstration dafür ein -Refinement verwendet. - Refinements können in einem Abkürzungsteil neben Abkürzun -gen stehen und von allen Abkürzungen benutzt werden. Sie werden -ähnlich geschrieben wie Abkürzungen, nur ihr Name muß in Klein -buchstaben geschrieben werden, dafür muß er nicht in der ersten -Spalte anfangen und kann Leerzeichen enthalten. Bei komplizierte -ren Ausdrücken sollten Refinements zur besseren Lesbarkeit einge -setzt werden. - Sie können die IF-Anweisung auch mit beliebig vielen ELIF- -Teilen versehen. Achten Sie jedoch darauf, daß die IF-Anweisung -#on("i")#immer#off("i")# irgendeinen Wert liefern muß. Sie dürfen also den ELSE-Teil -nicht weglassen. Statt einer IF-Anweisung können Sie natürlich -auch eine SELECT-Anweisung verwenden. Es stehen Ihnen im Prin -zip alle werteliefernden Anweisungen von ELAN zur Verfügung. - Die Programmiersprache ELAN bietet Ihnen noch weit mehr -Möglichkeiten, als hier beschrieben werden können. So können Sie -sich eigene Prozeduren definieren und diese dann in Abkürzungen -verwenden. In Kapitel 14 und 15 finden Sie eine Einführung in die -wichtigsten Konstrukte, die für EUDAS gebraucht werden. - - -13.2 Bedingte Musterteile - -Wenn größere Teile des Druckmusters in Abhängigkeit von bestimm -ten Daten unterschiedlich ausfallen sollen, werden die dazu benö -tigten Abkürzungen sehr umfangreich. Für solche Fälle kann man -IF-Anweisungen auch im Musterteil eines Abschnitts verwenden. In -diesem Fall werden die Alternativen der IF-Anweisung durch -Musterzeilen dargestellt. - Im Musterteil müssen jedoch die Zeilen, die Teil der IF-An -weisung sind, von den Musterzeilen unterschieden werden. Deshalb -werden die Anweisungszeilen durch ein '%'-Zeichen in der ersten -#on("i")#und#off("i")# zweiten Spalte gekennzeichnet. Das zweite '%'-Zeichen dient -zur Unterscheidung von Anweisungen an den Druckgenerator, die -nicht an den ELAN-Compiler übergeben werden sollen. - Mit einer IF-Anweisung im Musterteil kann man das Anredepro -blem auch folgendermaßen lösen: - - - % WIEDERHOLUNG - %% IF f ("m/w") = "w" THEN - Sehr geehrte Frau &<Name>! - %% ELSE - Sehr geehrter Herr &<Name>! - %% END IF; - - -Beachten Sie den Unterschied, daß die IF-Anweisung hier mit einem -Semikolon abgeschlossen werden muß - in Abkürzungen mußte ja ein -Punkt danach folgen. Außerdem darf hier der ELSE-Teil (die zweite -Alternative) fehlen, während in einer Abkürzung in jeder Alternati -ve etwas stehen muß (zumindest der leere Text ""). - Falls sich der IF-THEN-Teil über mehr als eine Zeile erstrek -ken soll, muß jede dieser Zeilen mit '%%' beginnen, da die Folgezei -len sonst als Musterzeilen gedruckt würden. Benutzen Sie in einem -solchen Fall jedoch besser ein Refinement, das Sie im Abkürzungs -teil definieren müssen. - Sie können im Musterteil auch andere ELAN-Anweisungen -verwenden. Der Unterschied zu Abkürzungen liegt darin, daß die -Musterzeilen nicht als Werte angesehen werden, die die Anweisung -liefern muß, sondern als Anweisungen, die dort aufgeführten Mu -sterzeilen einzusetzen und zu drucken. Daher kann im Musterteil -auch eine FOR-Schleife sinnvoll sein, wenn in Abhängigkeit eines -Wertes eine bestimmte Anzahl von Zeilen gedruckt werden soll. - - -13.3 Übersetzung - -Wenn Sie bis jetzt auch als ELAN-Programmierer immer noch nicht -ganz durchblicken, wie Sie welche ELAN-Anweisungen verwenden -können, dann ist das noch kein Anlaß zur Sorge. Es ist kaum mög -lich, die genauen Auswirkungen beliebiger Anweisungen zu be -schreiben, ohne den Übersetzungsprozeß zu schildern, der diese -Anweisungen zu einem ELAN-Programm zusammenbindet. Daher soll -diese Übersetzung jetzt genauer erklärt werden. - -#on("b")#Übersetzungsmechanismus#off("b")# Alle Zeilen eines Abkürzungsteils -wer -den direkt in das Programm übernommen, wobei der Name einer Ab -kürzung durch einen beliebig gewählten Refinementnamen ersetzt -wird ('abk' + eine laufende Nummer). Alle Abkürzungen und Re -finements werden als globale Refinements definiert, also außerhalb -von Prozeduren. Dadurch wird erreicht, daß sie an jeder Stelle -verwendet werden können. - Damit eine Abkürzung richtig als Refinement übersetzt wird, -muß sie ein TEXT-Objekt als Wert liefern. Die anderen Refinements -sind beliebig, da Sie nur in selbstdefinierten Anweisungen verwen -det werden. Die Refinements der Abkürzungen werden in einer Zu -weisung an eine TEXT-Variable verwendet, damit der Druckgenera -tor auf den entsprechenden Wert zugreifen kann. - Jeder Abschnitt wird dagegen als eine Prozedur übersetzt. Jede -Folge von Musterzeilen wird in eine Anweisung übersetzt, diese -Musterzeilen einzusetzen und zu drucken. Jede '%%'-Anweisung -wird einfach unverändert dazwischen geschrieben. Die Vorspann- -Prozedur wird einmal zu Anfang aufgerufen, die Prozedur für den -Wiederholungsteil einmal für jeden ausgewählten Satz und die Nach -spann-Prozedur einmal am Schluß. - Bei Fehlern im ELAN-Teil zeigt der Compiler das erzeugte Pro -gramm zusammen mit seinen Fehlermeldungen im Paralleleditor. Sie -müssen nun die Fehlermeldung lokalisieren und anhand der eben -gegebenen Hinweise in das ursprüngliche Druckmuster zurücküber -setzen, damit Sie dort den Fehler korrigieren können. - -#on("b")#Beispiel#off("b")# Nun müßten Sie genug Informationen haben, um -beliebige -ELAN-Anweisungen in das Druckmuster einfügen zu können. Als -Beispiel wollen wir versuchen, alle Männer und Frauen in der -Adressendatei zu zählen, ohne ein Suchmuster einstellen zu müssen -und ohne den Druckvorgang zweimal ablaufen zu lassen (wie dies -bei dem obigen Beispiel der Fall war). Ein erster Versuch könnte so -aussehen: - - - % VORSPANN - %% INT VAR maenner, frauen; - %% maenner := 0; - %% frauen := 0; - % WIEDERHOLUNG - %% IF f ("m/w") = "m" THEN - %% maenner INCR 1 - %% ELSE - %% frauen INCR 1 - %% END IF - % NACHSPANN - &maenner Männer und %frauen Frauen vorhanden. - - -Aber Vorsicht! In diesem Beispiel sind mehrere Fehler eingebaut. -Finden Sie sie! - -#on("b")#Fehler im Beispiel#off("b")# Der erste Fehler befindet sich im -Nachspann. -Hier wird versucht, die Namen der beiden Variablen 'maenner' und -'frauen' direkt in einem Feldmuster zu verwenden. Diese beiden -Namen sind dem Druckgenerator nicht bekannt, sondern nur dem -ELAN-Compiler. Um die Werte der beiden Variablen einsetzen zu -können, müssen Sie also zwei geeignete Abkürzungen definieren. - Der zweite Fehler ist schwieriger zu finden. Wie oben gesagt, -wird jeder Abschnitt in eine Prozedur übersetzt. Die in einem Ab -schnitt definierten Variablen können also nur in diesem Abschnitt -verwendet werden (sie sind lokal) und auch nicht im Abkürzungs -teil, da dieser wieder global vereinbart wird. Die beiden im Vor -spann definierten Variablen stehen also im Wiederholungsteil und im -Nachspann nicht zur Verfügung. - -#on("b")#Anweisungen im Initialisierungsteil#off("b")# Für diesen Fall gibt -es die -Möglichkeit, ELAN-Anweisungen vor allen Abschnitten im Initiali -sierungsteil zu definieren. Diese Anweisungen sind dann ebenfalls -global. Das richtige Druckmuster finden Sie auf der nächsten Seite. - Natürlich könnten Sie die Initialisierung der beiden Variablen -auch noch aus dem Vorspann herausnehmen. Denken Sie daran, daß -Sie aus INT-Variablen erst einen Text machen müssen, ehe Sie sie -in eine Musterzeile einsetzen können. Beachten Sie Schreibweise der -Variablen: in ELAN können die Umlaute nicht in Bezeichnern ver -wendet werden, daher muß die Variable mit 'ae' geschrieben wer -den. Im Mustertext und in Abkürzungs- und Feldnamen können die -Umlaute jedoch frei verwendet werden. - - - %% INT VAR maenner, frauen; - % VORSPANN - %% maenner := 0; - %% frauen := 0; - % WIEDERHOLUNG - %% IF f ("m/w") = "m" THEN - %% maenner INCR 1 - %% ELSE - %% frauen INCR 1 - %% END IF - % NACHSPANN - &m Männer und %f Frauen vorhanden . - % ABKUERZUNGEN - &m : text (maenner) . - &f : text (frauen) . - - - -13.4 Gruppen - -Der Druckgenerator bietet die Möglichkeit, Vorspann und Nachspann -nicht nur am Anfang und am Ende, sondern auch an bestimmten -Stellen zwischen Sätzen zu drucken. Diese Stellen sind dadurch -bestimmt, daß ein bestimmtes Merkmal (z.B. ein Feldinhalt) seinen -Wert ändert. Ein solches Merkmal wird im Druckmuster #on("i")#Gruppe#off("i")# ge -nannt. - Ein Beispiel für die Verwendung von Gruppen ist eine Schüler -datei, die nach Klassen geordnet ist. Definiert man das Feld 'Klas -se' als Gruppe, so wird jeweils am Ende einer Klasse ein Nachspann -und am Beginn einer Klasse ein Vorspann gedruckt. - Dieses Verfahren ist eine Erweiterung der bisher beschriebenen -Methode, indem eine Datei quasi in mehrere Dateien untergliedert -wird, die jedoch in einem Arbeitsgang gedruckt werden können. -Voraussetzung dafür ist jedoch, daß die Datei nach dem Gruppen -merkmal geordnet ist - der Druckgenerator sammelt nicht erst alle -Schüler einer Klasse aus der Datei, sondern erwartet sie hinter -einander. - -#on("b")#Gruppendefinition#off("b")# Eine Gruppe wird im Initialisierungsteil -des -Druckmusters (also vor allen Abschnitten) definiert. Notwendige -Daten sind eine Nummer zur Identifizierung und das Merkmal. Die -Nummer sollte am sinnvollsten von 1 an vergeben werden; die mög -lichen Werte sind nach oben hin beschränkt. Das Merkmal ist ein -beliebiger ELAN-Ausdruck, der einen Text liefert. Sinnvollerweise -wird er den Inhalt eines Feldes enthalten. - Gruppendefinitionen müssen nach allen ELAN-Anweisungen im -Initialisierungsteil folgen, und zwar, weil die Gruppendefinitionen -alle in einer Prozedur zusammengefaßt werden, die bei jedem neuen -Satz auf Gruppenwechsel testet. - Unter der Annahme, daß die oben erwähnte Schülerdatei ein -Feld 'Klasse' besitzt, würde die Gruppe wie folgt definiert: - - - % GRUPPE 1 f ("Klasse") - - -Nach der Anweisung 'GRUPPE' folgt die Gruppennummer und dann -ein ELAN-Ausdruck. Die ganze Definition muß in einer Zeile stehen; -reicht der Platz nicht aus, müssen Sie in einem Abkürzungsteil ein -Refinement definieren. - -#on("b")#Klassenliste#off("b")# Das komplette Druckmuster für die -Klassenliste könn -te folgendes Aussehen haben, wenn außer 'Klasse' auch noch die -Felder 'Name' und 'Vorname' vorhanden sind: - - - % GRUPPE 1 f ("Klasse") - % VORSPANN - Klassenliste für Klasse &Klasse - ---------------------------- - % WIEDERHOLUNG - &Vorname %Name - % NACHSPANN - \#page\# - - -Wenn eine Gruppe definiert ist, werden im Nachspann immer die -Feldinhalte des letzten Satzes vor dem Gruppenwechsel gedruckt, im -Vorspann die Inhalte des ersten Satzes nach dem Wechsel. Daher -kann hier im Vorspann die Klasse gedruckt werden, da sie sich erst -ändert, wenn schon wieder der nächste Vorspann gedruckt wird. - -#on("b")#Mehrere Gruppen#off("b")# Wie die Identifikation über eine -Gruppennummer -vermuten läßt, können Sie mehrere Gruppen definieren. Nachspann -und Vorspann werden jeweils gedruckt, wenn sich das Merkmal ir -gendeiner Gruppe ändert. Ob eine bestimmte Gruppe gewechselt hat, -kann mit der Abfrage - - - BOOL PROC gruppenwechsel (INT CONST gruppennummer) - - -in einer IF-Anweisung ermittelt werden. Vor dem ersten und nach -dem letzten Satz wechseln automatisch alle Gruppen. - Die ganze Datei bildet eine Quasi-Gruppe mit der Nummer 0. -Sie ist immer definiert und wechselt nur vor dem ersten und nach -dem letzten Satz. Sie ist es, die bewirkt, daß Vorspann und Nach -spann in ihrer normalen Weise gedruckt werden. - -#on("b")#Anwendungsbeispiel#off("b")# Um einige der Möglichkeiten zu -illustrieren, -die durch Gruppen geschaffen werden, wollen wir als Beispiel eine -Anwendung betrachten, die neue Wege für die Benutzung von EUDAS -aufzeigt. - Aus einer Datei, in der für jede Bestellung der Kunde, der Ar -tikel, die bestellte Menge und der Einzelpreis des Artikels einge -tragen werden, sollen anschließend Rechnungen gedruckt werden. -Die Datei soll folgende Felder haben: - - - 'Kundennummer' - 'Artikelnummer' - 'Einzelpreis' - 'Menge' - - -Als Voraussetzung müssen die Bestellungen in der Datei jeweils -nach Kunden geordnet vorliegen. Die Kundennummer wird als Gruppe -definiert, so daß die Bestellungen eines Kunden zu einer Rechnung -zusammengefaßt werden können. Das Druckmuster rechnet dann die -einzelnen Preise zusammen und gibt eine Endsumme aus. - Damit in der Rechnung Name und Adresse des Kunden auftau -chen können, wird zu der Bestellungsdatei die Kundendatei gekop -pelt, die folgende Felder haben soll: - - - 'Kundennummer' - 'Name' - 'Vorname' - 'Strasse' - 'PLZ' - 'Ort' - - -Stellen Sie sich zum Ausprobieren des folgenden Druckmusters ge -gebenenfalls eigene Daten zusammen. Hier nun das Druckmuster: - - - %% REAL VAR gesamtpreis, summe; - % GRUPPE 1 f ("Kundennummer") - % VORSPANN - %% summe := 0.0; - Fa. Kraus & Sohn - Schotterstr. 10 - - 5000 Köln 1 - &Vorname %Name - &Strasse - - &PLZ &Ort &Datum - - R E C H N U N G - =============== - - Menge Artikelnr. Einzelpreis Gesamtpreis - ------------------------------------------------ - % ABKUERZUNGEN - &Datum : date . - - % WIEDERHOLUNG - %% gesamtpreis := round - %% (wert ("Einzelpreis") * wert ("Menge"), 2); - %% summe INCR gesamtpreis; - &Menge &Artikelnummer &&&&epr&& &&&&gpr&& - % ABKUERZUNGEN - &epr : f ("Einzelpreis") . - &gpr : zahltext (gesamtpreis, 2) . - - % NACHSPANN - ------------------------------------------------ - Summe: &&&&sum&& - + 14% MWSt. &&&Mwst&& - ========= - Endbetrag &&&&end&& - \#page\# - % ABKUERZUNGEN - &sum : zahltext (summe, 2) . - &Mwst : zahltext (mwst, 2) . - &end : zahltext (summe + mwst, 2) . - mwst : round (summe * 0.14, 2) . - - -Im Initialisierungsteil dieses Druckmusters wird die Kundennummer -als Gruppe definiert. Dies hat zur Folge, daß für jeden neuen Kun -den eine neue Rechnung begonnen wird, nachdem vorher im Nach -spann die Rechnungssumme des vorherigen Kunden berechnet und -ausgedruckt wurde. Vor dieser Gruppendefinition sind 'gesamtpreis' -und 'summe' definiert, die später als globale Variablen zur Verfü -gung stehen sollen. Diese Zeile darf nicht nach der Gruppendefini -tion stehen. - Im Vorspann wird der Kopf der Rechnung angegeben. Dieser -enthält neben den Daten des Kunden (aus der gekoppelten Kun -dendatei) noch das Datum. Die Kundennummer wird nur zum Kop -peln und als Gruppenmerkmal benötigt, erscheint also nicht auf der -Rechnung. - Es fällt auf, daß im Firmennamen ein '&'-Zeichen auftaucht, -das doch für die Markierung von Feldmustern reserviert ist. Die -beiden Musterzeichen können jedoch im normalen Text auftauchen, -wenn ihnen direkt ein Leerzeichen folgt. In diesem Fall werden Sie -nicht als Beginn eines Feldmusters interpretiert, sondern unverän -dert gedruckt. Der gleiche Fall taucht noch mit '%' im Nachspann -auf. - Im Wiederholungsteil wird zunächst aus dem Einzelpreis und der -Menge des jeweiligen Artikels der Gesamtpreis für diesen Artikel -berechnet. Für die Abfrage der Feldinhalte wird die Funktion 'wert' -verwendet, die wie 'f' funktioniert, jedoch gleich einen REAL-Wert -liefert. - Zu beachten ist, daß 'wert' wie beim Sortieren von Zahl alle -Sonderzeichen ignoriert. Weiterhin müssen die Zahlen mit dem ein -gestellten Dezimalkomma geschrieben werden (also normalerweise -mit Komma), damit ihr Wert richtig erkannt wird. Anderenfalls soll -ten Sie den Dezimalpunkt einstellen (s. 11.1). - Damit kaufmännisch richtig gerechnet wird, wird der Gesamt -preis auf 2 Nachkommastellen gerundet und erst dann aufsummiert. -Würde der Gesamtpreis nur zum Einsetzen gerundet, könnten bei der -anschließenden Addition der nicht gerundeten Werte eine falsche -Gesamtsumme entstehen. - Erst nach diesen Berechnungen kann die Musterzeile folgen, in -die die Werte dann eingesetzt werden. Um eine Ausgabe mit zwei -Nachkommastellen zu erzeugen, wird die von EUDAS definierte -Funktion 'zahltext' benutzt. Diese erzeugt aus einem REAL-Wert -einen Text mit der angegebenen Anzahl von Kommastellen und setzt -das korrekte Dezimalkomma ein. Das Ergebnis dieser Funktion wird -dann rechtsbündig eingesetzt. - Im Nachspann wird dann der summierte Wert mit aufgeschlage -ner Mehrwertsteuer gedruckt. Die Mehrwertsteuer muß ebenfalls auf -zwei Nachkommastellen gerundet werden. - -#on("b")#Erweiterung#off("b")# Zur Erweiterung könnten Sie die Bestelldatei -noch mit -einer Artikeldatei koppeln, die etwa folgende Struktur haben würde: - - - 'Artikelnummer' - 'Bezeichnung' - 'Einzelpreis' - - -In diesem Fall könnten Sie noch jeweils die Artikelbezeichnung in -eine Rechnungszeile drucken. Außerdem würde der Preis zentral -gespeichert. Eine entsprechende Änderung des Druckmusters sollte -Ihnen keine Schwierigkeiten bereiten. - - - |