summaryrefslogtreecommitdiff
path: root/app/eudas/4.3/doc/eudas.hdb.13
blob: 435fbfc6e4df44eab9b664c337399da46e74b049 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
#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.