1035 lines
26 KiB
Groff
1035 lines
26 KiB
Groff
.NH 3
|
|
.ft B
|
|
Ausgabe von Werten als Bin\o'a"'r-, Oktal-
|
|
.br
|
|
oder Hexadezimalzahl im Byte- oder Wortformat
|
|
.ft R
|
|
.LP
|
|
Der Reportgenerator f\o'u"'r \*(yy\ bietet die M\o'o"'glichkeit, Werte
|
|
in einem anderen Zahlensystem darzustellen. Die Werte werden
|
|
unabh\o'a"'ngig von der Wertart als Bitketten interpretiert und in das
|
|
gew\o'u"'nschte Zahlensystem umgewandelt.
|
|
|
|
.ft B
|
|
Syntax
|
|
.ft R
|
|
.DS L
|
|
|
|
_ _
|
|
| |
|
|
| Systemvariable |
|
|
_ _ | Systemkonstante |
|
|
| BIT | _ _ |_ _ |
|
|
| OCT | | BYTE | laenge || LAST | |
|
|
| HEX | | WORD | || VALUE | number |
|
|
| DEC | ~ ~ || NEXT | |
|
|
~ ~ ~~ ~ ~
|
|
|
|
.DE
|
|
.LP
|
|
BYTE ist Standard, f\o'u"'hrende Nullen werden unterdr\o'u"'ckt.
|
|
.LP
|
|
Ist die L\o'a"'nge angegeben, wird der Wert entweder vollst\o'a"'ndig
|
|
oder rechts verk\o'u"'rzt linksb\o'u"'ndig in den bereitgestellten Platz
|
|
eingetragen. Fehlt die L\o'a"'ngenangabe, wird der Wert vollst\o'a"'ndig
|
|
in der tats\o'a"'chlichen L\o'a"'nge ausgegeben.
|
|
|
|
.ft B
|
|
Beispiel
|
|
.ft R
|
|
.DS L
|
|
BIT LENGTH 10 VALUE 1 '*'
|
|
OCT VALUE 1 '*'
|
|
HEX VALUE 1
|
|
NEW LINE
|
|
|
|
Wert von VALUE 1:
|
|
|
|
a) 71 =i2
|
|
b) 30 =i1
|
|
c) 'ABC' string =c3
|
|
|
|
Darstellung:
|
|
|
|
BIT OCT HEX
|
|
|
|
a) 0001000111 * 000000 000107 * 0000 0047
|
|
b) 00011110 * 036 * 1E
|
|
c) 0100000101 * 101 102 103 * 41 42 43
|
|
.DE
|
|
.NH 3
|
|
.ft B
|
|
Wertzuweisungen zu Systemvariablen -
|
|
.br
|
|
arithmetische Ausdr\o'u"'cke
|
|
.ft R
|
|
.LP
|
|
F\o'u"'r die Berechnung nicht in der Relation enthaltener Werte steht
|
|
im Reportgenerator eine umfangreiche Arithmetik zur Verf\o'u"'gung.
|
|
Dem an C gew\o'o"'hnten Nutzer wird zus\o'a"'tzlich die Notation
|
|
arithmetischer Zuweisungen gem\o'a"'ss C gestattet.
|
|
|
|
.ft B
|
|
Syntax
|
|
.ft R
|
|
.DS L
|
|
|
|
SET systemvariable = arithm ausdruck
|
|
.DE
|
|
.LP
|
|
Durch die SET-Anweisung wird einer Systemvariablen das Ergebnis
|
|
eines arithmetischen Ausdrucks zugewiesen. Bei den Variablen
|
|
COLUMN und LINE ist die Wertzuweisung mit Ausgabeoperationen
|
|
verbunden.
|
|
Im arithmetischen
|
|
Ausdruck k\o'o"'nnen beliebige numerische Werte mit den Operationen
|
|
.DS L
|
|
|
|
+ oder += Addition
|
|
- oder -= Subtration
|
|
* oder *= Multiplikation
|
|
: oder := Division
|
|
/ oder /= ganzzahlige Division
|
|
% oder %= Modulodivision (Divisionsrest)
|
|
.DE
|
|
|
|
verkn\o'u"'pft werden. Die Klammerung von Teilausdr\o'u"'cken und die
|
|
Negation von Werten ist m\o'o"'glich. Die Syntax eines arithmetischen
|
|
Ausdruckes entspricht der allgemein \o'u"'blichen Notation
|
|
mathematischer Formeln.
|
|
.LP
|
|
.ft B
|
|
Beispiele
|
|
.ft R
|
|
.IP 1.
|
|
allgemeiner Ausdruck
|
|
.DS L
|
|
SET VAR 30 = ( - VALUE 10 * VAR 3 + 27.12E-7 )
|
|
: ( VAR 7 % 19 / 7.2 )
|
|
.DE
|
|
.IP 2.
|
|
Es soll die durchschnittliche Planerf\o'u"'llung
|
|
einer Plankennziffer VALUE 4 mit den Istwerten
|
|
VALUE 5 bis 7 ausgegeben werden:
|
|
.DS L
|
|
SET VAR 1 = ( VALUE 5 + VALUE 6 + VALUE 7 ) / 3
|
|
INTEGER SCALE 100 PIC 'DURCHSCHNITT: 009.99 %' VAR 1
|
|
.DE
|
|
.IP 3.
|
|
Es soll auf die 30. Zeile der Seite positioniert werden:
|
|
.DS L
|
|
SET LINE = 30
|
|
.DE
|
|
.LP
|
|
Tritt w\o'a"'hrend der Bearbeitung eines arithmetischen Ausdrucks ein
|
|
Fehler auf, wenn z. B. ein Zeichenkettenwert beteiligt ist, wird
|
|
die Berechnung abgebrochen. Der Variablen wird kein Wert
|
|
zugewiesen, sie bleibt unver\o'a"'ndert.
|
|
.NH 3
|
|
.ft B
|
|
Boolesche Variablen und Ausdr\o'u"'cke
|
|
.ft R
|
|
.LP
|
|
F\o'u"'r die wertabh\o'a"'ngige Programmabarbeitung stehen
|
|
M\o'o"'glichkeiten zur Formulierung Boolescher
|
|
Ausdr\o'u"'cke sowie 101 logische Variable
|
|
zur Verf\o'u"'gung.
|
|
.LP
|
|
Die Schalter
|
|
.DS L
|
|
SWITCH 0 bis SWITCH 125
|
|
.DE
|
|
k\o'o"'nnen die zwei Zust\o'a"'nde "ein" und "aus" bzw.
|
|
.ft B
|
|
TRUE
|
|
.ft R
|
|
und
|
|
.ft B
|
|
FALSE
|
|
.ft R
|
|
annehmen.
|
|
.LP
|
|
Initialisiert sind die Variablen bei Programmbeginn mit FALSE.
|
|
F\o'u"'r ihre \o'A"'nderung stehen vier M\o'o"'glichkeiten zur Auswahl.
|
|
.LP
|
|
.ft B
|
|
Syntax
|
|
.ft R
|
|
.DS L
|
|
|
|
_ _
|
|
| CLEAR |
|
|
| COMPLEMENT | SWITCH number
|
|
| SET |
|
|
~ ~
|
|
SET SWITCH number = boolean
|
|
.DE
|
|
.LP
|
|
Mit
|
|
.ft B
|
|
CLEAR,
|
|
.ft R
|
|
.ft B
|
|
COMPLEMENT
|
|
.ft R
|
|
und
|
|
.ft B
|
|
SET
|
|
.ft R
|
|
kann ein bestimmter Schalter
|
|
gel\o'o"'scht (FALSE), umgekehrt \%(TRUE-->FALSE, \%FALSE-->TRUE) bzw.
|
|
gesetzt (TRUE) werden. Die Wertzuweisung erlaubt das Eintragen
|
|
des Ergebnisses eines Booleschen Ausdrucks. Dieser wird durch die
|
|
Verkn\o'u"'pfung von Boole-Werten (TRUE/FALSE) gebildet.
|
|
Verkn\o'u"'pfungsoperatoren sind
|
|
.DS L
|
|
OR || bzw. | logisches "oder" (Disjunktion)
|
|
AND && bzw. & logisches "und" (Konjunktion).
|
|
.DE
|
|
.LP
|
|
Die Negation erfolgt mit einem vorgestellten
|
|
.ft B
|
|
NOT
|
|
.ft R
|
|
oder
|
|
.ft B
|
|
!.
|
|
.ft R
|
|
Eine Klammerung von Teilausdr\o'u"'cken ist m\o'o"'glich.
|
|
.LP
|
|
Boole-Werte k\o'o"'nnen logische Variablen (SWITCH number)
|
|
mit den Werten TRUE
|
|
oder FALSE sowie die Ergebnisse von Vergleichs\%operatoren sein. Als
|
|
Vergleichsoperanden sind alle nume\%rischen und Zeichenkettenwerte,
|
|
arithmetische Ausdr\o'u"'cke sowie NULL (Vergleich auf NULL-Wert)
|
|
zugelassen.
|
|
.LP
|
|
Die Operanden k\o'o"'nnen miteinander verglichen werden durch:
|
|
.DS L
|
|
|
|
< kleiner
|
|
> gr\o'o"'sser
|
|
!= ungleich
|
|
<> ungleich
|
|
<= kleiner gleich
|
|
>= gr\o'o"'sser gleich
|
|
= gleich.
|
|
== gleich
|
|
.DE
|
|
.LP
|
|
Zeichenkettenwerte k\o'o"'nnen nicht mit numerischen Werten verglichen
|
|
werden. Ein NULL-Wert ist grunds\o'a"'tzlich kleiner als ein beliebiger
|
|
anderer Wert. Zwei NULL-Werte sind gleich.
|
|
.LP
|
|
Die Abarbeitungsfolge eines Booleschen Ausdrucks wird durch die
|
|
Priorit\o'a"'t der Operatoren bestimmt.
|
|
Die h\o'o"'chste Priorit\o'a"'t hat
|
|
die numerische Negation, die kleinste OR:
|
|
.DS L
|
|
|
|
^ ! (Negationszeichen)
|
|
| * / : %
|
|
| + -
|
|
Priorit\o'a"'t < > <> != <= >= = ==
|
|
| NOT !
|
|
| AND && &
|
|
| OR || |
|
|
^
|
|
.DE
|
|
.LP
|
|
Bei gleicher Priorit\o'a"'t erfolgt die Bearbeitung von links nach
|
|
rechts.
|
|
.LP
|
|
.ft B
|
|
Beispiele
|
|
.ft R
|
|
.DS L
|
|
SET SWITCH 10
|
|
COMPLEMENT SWITCH 10
|
|
.DE
|
|
Mit SET wird die logische Variable 10 TRUE gesetzt und
|
|
durch COMPLEMENT umgekehrt, d.h. FALSE
|
|
.DS L
|
|
SET SWITCH 5 = VALUE 3 + 5 < VAR 7 AND
|
|
(SWITCH 5 OR SWITCH 10) AND
|
|
(VALUE 2 <> NULL OR
|
|
NOT VALUE 3 + 100 = VAR 8)
|
|
.DE
|
|
Der logischen Variablen 5 wird das Ergebnis des Booleschen Ausdrucks
|
|
zugewiesen.
|
|
.LP
|
|
Tritt w\o'a"'hrend der Bearbeitung eines Booleschen Ausdrucks ein
|
|
Fehler auf, wird diese abgebrochen und das Ergebnis FALSE
|
|
gesetzt.
|
|
.NH 3
|
|
.ft B
|
|
Steuerung der Programmabarbeitung
|
|
.ft R
|
|
.NH 4
|
|
.ft B
|
|
Verzweigung
|
|
.ft R
|
|
.LP
|
|
Die Verzweigung erm\o'o"'glicht die Abarbeitung von Anweisungen in
|
|
Abh\o'a"'ngigkeit von einer Bedingung (Boolescher Ausdruck).
|
|
|
|
.ft B
|
|
Syntax
|
|
.ft R
|
|
.br
|
|
|
|
IF boolean THEN laufsteuerung [ELSE laufsteuerung] ENDIF / ENDI
|
|
.LP
|
|
Hat der Boolesche Ausdruck den Wert TRUE, wird der THEN-Zweig
|
|
abgearbeitet, bei FALSE, wenn angegeben, der ELSE-Zweig.
|
|
Abgeschlossen wird die Anweisung durch ENDI.
|
|
Anstelle ENDI kann auch END IF stehen.
|
|
Die Verschachtelung
|
|
von IF-Anweisungen ist m\o'o"'glich.
|
|
|
|
.ft B
|
|
Beispiel
|
|
.ft R
|
|
|
|
Es soll das Quartal ermittelt und ausgegeben werden:
|
|
.DS L
|
|
IF MONTH < 6
|
|
THEN IF MONTH < 3
|
|
THEN 'I'
|
|
ELSE 'II'
|
|
ENDI
|
|
ELSE IF MONTH < 9
|
|
THEN 'III'
|
|
ELSE 'IV'
|
|
ENDI
|
|
ENDI
|
|
'. QUARTAL'
|
|
.DE
|
|
|
|
Im Dezember wird zum Beispiel
|
|
IV. QUARTAL ausgegeben.
|
|
.LP
|
|
.ft B
|
|
Hinweis:
|
|
.ft R
|
|
Die Werte der Systemvariablen MONTH haben den Bereich 0...11 !
|
|
.NH 4
|
|
.ft B
|
|
Zyklus
|
|
.ft B
|
|
.LP
|
|
F\o'u"'r die Programmierung von Zyklen stehen zwei Anweisungen
|
|
bereit.
|
|
|
|
.ft B
|
|
Syntax
|
|
.ft R
|
|
.DS L
|
|
|
|
REPEAT number laufsteuerung ENDREPEAT/ENDR
|
|
WHILE boolean DO laufsteuerung ENDWHILE/ENDW
|
|
.DE
|
|
.LP
|
|
Bei REPEAT wird der Zyklus in einer vorher festgelegten Anzahl
|
|
(number), jedoch mindestens einmal, durchlaufen. Ist number ein
|
|
reeller Wert, wird er durch Abrunden zu einem ganzzahligen
|
|
umgewandelt.
|
|
Der WHILE-Zyklus wird ausgef\o'u"'hrt, solange der Boolesche Ausdruck
|
|
den Wert TRUE liefert.
|
|
|
|
.ft B
|
|
Beispiel
|
|
.ft R
|
|
|
|
In VALUE 1 bis VALUE 10 stehen Werte zwischen 0 und 100. Die
|
|
Werte sollen, wenn sie kleiner als 50 sind, als r\o'o"'mische Zahlen
|
|
ausgegeben werden:
|
|
.DS L
|
|
|
|
SET VAR 1 = 1
|
|
REPEAT 10
|
|
IF VALUE VAR 1 < 50
|
|
THEN
|
|
SET VAR 2 = VALUE VAR 1
|
|
WHILE VAR 2 >= 10
|
|
DO 'X' SET VAR 2 -= 10
|
|
ENDW
|
|
IF VAR 2 >= 5
|
|
THEN 'V' SET VAR 2 -= 5
|
|
ENDI
|
|
IF VAR 2 > 0
|
|
THEN REPEAT VAR 2 'I' ENDR
|
|
ENDI
|
|
SPACE 3
|
|
ENDI
|
|
SET VAR 1 += 1
|
|
ENDR
|
|
.DE
|
|
.LP
|
|
Sind im Tupel die ersten 10 Werte
|
|
.br
|
|
1, 30, 60, 12, 77, 3, 90, 17, 22, 33
|
|
.br
|
|
wird in die Liste eingetragen:
|
|
.br
|
|
I XXX XII III XVII XXII XXXIII
|
|
.NH 4
|
|
.ft B
|
|
Fallauswahl
|
|
.ft R
|
|
.LP
|
|
Die Fallauswahl ist eine Mehrfachverzweigung, die durch eine
|
|
Variable gesteuert wird.
|
|
|
|
.ft B
|
|
Syntax
|
|
.ft R
|
|
.DS L
|
|
CASE VAR number [IN] [DO laufsteuerung]
|
|
[OUT laufsteuerung]ENDCASE/ENDC
|
|
.DE
|
|
.LP
|
|
VAR number enth\o'a"'lt einen ganzzahligen Wert. Ist er 0, werden die
|
|
Anweisungen nach dem 1. DO abgearbeitet, ist er 2, die nach dem
|
|
2. DO usw. Ist f\o'u"'r den Wert keine DO-Konstruktion mehr da, oder
|
|
ist der Wert kleiner als 1, werden die Anweisungen von OUT
|
|
abgearbeitet, vorausgesetzt, OUT ist definiert. Ist VAR number reell,
|
|
wird durch Abrunden ein ganzzahliger Wert erzeugt. Die
|
|
CASE-Klausel wird mit ENDC abgeschlossen.
|
|
Die Angabe von IN kann entfallen.
|
|
.LP
|
|
.ft B
|
|
Achtung
|
|
.ft R
|
|
.LP
|
|
Die direkte Verschachtelung von CASE-Klauseln ist nicht m\o'o"'glich!
|
|
Wird eine CASE-Klausel jedoch in einer Prozedur vereinbart, ist
|
|
deren Aufruf innerhalb einer anderen CASE-Klausel realisierbar.
|
|
.LP
|
|
.ft B
|
|
Beispiel
|
|
.ft R
|
|
.LP
|
|
Im Kopf einer Monatsabrechnung soll der Name des Monats
|
|
ausgegeben werden:
|
|
.DS L
|
|
'ABRECHNUNG FUER DEN MONAT '
|
|
SET VAR 1 = MONTH
|
|
CASE VAR 1
|
|
DO 'JANUAR'
|
|
DO 'FEBRUAR'
|
|
DO 'MAERZ'
|
|
DO 'APRIL'
|
|
DO 'MAI'
|
|
DO 'JUNI'
|
|
DO 'JULI'
|
|
DO 'AUGUST'
|
|
DO 'SEPTEMBER'
|
|
DO 'OKTOBER'
|
|
DO 'NOVEMBER'
|
|
DO 'DEZEMBER'
|
|
OUT '(DER MONAT MUSS ERST ERFUNDEN WERDEN)'
|
|
ENDC
|
|
.DE
|
|
Im September wird in den Report eingetragen:
|
|
.br
|
|
ABRECHNUNG FUER DEN MONAT SEPTEMBER
|
|
.NH 4
|
|
.ft B
|
|
Prozeduren
|
|
.ft R
|
|
.LP
|
|
Oft verwendete gleichartige Programmteile k\o'o"'nnen in Prozeduren
|
|
vereinbart werden.
|
|
|
|
.ft B
|
|
Syntax
|
|
.ft R
|
|
.DS L
|
|
PROC int laufsteuerung RETURN
|
|
.DE
|
|
.LP
|
|
Der Wert f\o'u"'r int beginnt mit 1. Es sind maximal
|
|
50 Werte vorgesehen. Als Identifikator der Prozedur
|
|
wird eine Nummer int festgelegt. Die Definition der
|
|
Prozeduren muss im Teil
|
|
.ft B
|
|
definitionen,
|
|
.ft R
|
|
die Notierung der Prozedur selbst im Teil
|
|
.ft B
|
|
prozeduren
|
|
.ft R
|
|
unmittelbar hinter AS erfolgen.
|
|
.LP
|
|
Beim Aufruf einer Prozedur werden alle Anweisungen bis RETURN
|
|
abgearbeitet.
|
|
|
|
.ft B
|
|
Syntax
|
|
.ft R
|
|
.DS L
|
|
CALL [PROC] int
|
|
.DE
|
|
.LP
|
|
Der Parameter PROC kann ohne Bedeutungsverlust weggelassen
|
|
werden. int bestimmt die Nummer der gerufenen Prozedur. Es gilt der
|
|
Grundsatz, dass eine Prozedur vor dem ersten Aufruf definiert
|
|
sein muss. Das ist insbesondere bei der Definition mehrerer
|
|
Prozeduren zu beachten. Nicht erlaubt ist z.B. folgende
|
|
Konstruktion:
|
|
.DS L
|
|
PROC 1 CALL 5 RETURN
|
|
PROC 5 .... RETURN
|
|
.DE
|
|
.ft B
|
|
Beispiel
|
|
.ft R
|
|
.LP
|
|
Es soll eine Prozedur f\o'u"'r die Potenz X^Y
|
|
definiert werden
|
|
.br
|
|
(Y = nat\o'u"'rliche Zahl).
|
|
X wird in VAR 1, Y in VAR 2 erwartet, das
|
|
Ergebnis steht in VAR 0.
|
|
.DS L
|
|
PROC 1
|
|
SET VAR 0 = 1
|
|
REPEAT VAR 2
|
|
SET VAR 0 = VAR 0 * VAR 1
|
|
ENDR
|
|
RETURN
|
|
.DE
|
|
.LP
|
|
Die Berechnung von 13^11 wird realisiert mit:
|
|
.DS L
|
|
SET VAR 1 = 13
|
|
SET VAR 2 = 11
|
|
CALL 1
|
|
REAL VAR 0
|
|
.DE
|
|
.NH 4
|
|
.ft B
|
|
Seitengestaltung
|
|
.ft R
|
|
.LP
|
|
Eine Seite hat im Reportgenerator f\o'u"'r \*(yy\ folgende
|
|
Gestalt:
|
|
.DS L
|
|
|
|
COLUMNS
|
|
|<----------------->|
|
|
________|___________________|______________
|
|
/|\e | | PAGEBEGIN | | /|\e |
|
|
| | L |___________________| L | A | |
|
|
| | I | | I | L | |
|
|
| | N | Informationsteil | N | L | |
|
|
L| | E | | E | | |
|
|
I| | B | | E | L | |
|
|
N| | E | | N | I | |
|
|
E| | G | | D | N | |
|
|
S| | I | | | E | |
|
|
\e|/ | N | | | S | |
|
|
________|___________________| | | |
|
|
| | PAGEEND | | | |
|
|
| |___________________|___| | |
|
|
|________________________________\e /__|
|
|
.DE
|
|
.LP
|
|
Die Gr\o'o"'sse einer Seite wird durch die Parameter COLUMNS, LINES
|
|
und ALL LINES bestimmt. Der Seitenrahmen mit
|
|
Seitenkopf (PAGEBEGIN), Seitenfuss (PAGEEND), linkem Seitenrand
|
|
(LINEBEGIN) und rechtem Seitenrand (LINEEND) wird, wenn die Teile
|
|
vom Nutzer definiert wurden, vom Reportgenerator automatisch f\o'u"'r
|
|
jede Seite aufgebaut.
|
|
|
|
.ft B
|
|
Syntax
|
|
.ft R
|
|
.DS L
|
|
_ _
|
|
| LINEBEGIN |
|
|
| LINEEND |
|
|
ON | PAGEBEGIN | [DO] [laufsteuerung] END/ENDO
|
|
| PAGEEND |
|
|
~ ~
|
|
.DE
|
|
.LP
|
|
Ist die Laufsteuerung nicht angegeben, gilt der Rahmenteil als
|
|
nicht definiert, d. h. eine existierende Definition wird
|
|
gel\o'o"'scht. Sind im Programm mehrere Definitionen f\o'u"'r einen
|
|
Rahmenteil angegeben, gilt immer die aktuellste.
|
|
.LP
|
|
In PAGEBEGIN und PAGEEND werden Informationen vereinbart, die auf
|
|
jeder Seite erscheinen sollen. Das k\o'o"'nnen die aktuelle
|
|
Seitennummer, \o'U"'berschriften, Fussnoten und Tupelwerte sein. Aber auch
|
|
Berechnungen k\o'o"'nnen ausgef\o'u"'hrt werden. Soll zum Beispiel die
|
|
Seitennummerierung in 10er Schritten erfolgen, muss in PAGEBEGIN
|
|
die Wertzuweisung SET PAGE = PAGE + 9 enthalten sein,
|
|
da bei Seitenwechsel automatisch um 1 erh\o'o"'ht wird. Mit
|
|
LINEBEGIN und LINEEND k\o'o"'nnen "Begrenzungen",
|
|
Zeilennummerierungen u.a. vereinbart werden.
|
|
.LP
|
|
Der Aufbau eines Rahmenteils wird vorzeitig abgebrochen, wenn bei
|
|
PAGEBEGIN und PAGEEND ein unerlaubter Seitenwechsel veranlasst
|
|
wird bzw. bei LINEBEGIN und LINEEND ein Zeilenvorschub.
|
|
.LP
|
|
Der Informationsteil nimmt den eigentlichen Inhalt der Seite auf.
|
|
Ist eine Zeile l\o'a"'nger als mit COLUMNS festgelegt, werden
|
|
\o'u"'berstehende Zeichen auf eine neue Zeile \o'u"'bertragen.
|
|
Ist eine Seite
|
|
voll, wird automatisch ein Seitenwechsel ausgel\o'o"'st.
|
|
.LP
|
|
Die L\o'a"'nge von PAGEBEGIN und PAGEEND ist beliebig und kann auch
|
|
von Seite zu Seite unterschiedlich sein. Reicht die physische
|
|
Seite nicht aus, wird eine zweite hinzugezogen.
|
|
.LP
|
|
Auch bei LINEBEGIN und LINEEND ist die L\o'a"'nge zun\o'a"'chst
|
|
unerheblich. Allerdings sollte darauf geachtet werden, dass diese
|
|
zusammen mit COLUMNS nicht gr\o'o"'sser als die maximale Druckbreite wird.
|
|
Werden die Seitenr\o'a"'nder bis zum physischen Blattende gew\o'u"'nscht,
|
|
muss PAGEEND um die entsprechende Anzahl Leerzeilen erweitert
|
|
werden.
|
|
.LP
|
|
Die Variable LINE bezieht sich in PAGEBEGIN und PAGEEND auf die
|
|
physische Seite, ebenso COLUMN in LINEBEGIN und LINEEND.
|
|
.LP
|
|
Ansonsten geben diese Variablen die Position bez\o'u"'glich des
|
|
Informationsteils an.
|
|
|
|
.ft B
|
|
Beispiel
|
|
.ft R
|
|
.LP
|
|
Die Funktionsweise der Seitendefinition soll im folgenden an
|
|
einer "Mini"-Seite mit 12 Spalten und 7 Zeilen gezeigt werden.
|
|
Die physische Seite habe eine L\o'a"'nge von 12 Zeilen:
|
|
.nf
|
|
report kompl1_r
|
|
with
|
|
columns 12
|
|
lines 7
|
|
all lines 12
|
|
big
|
|
|
|
/* switches */
|
|
define last_page = 1
|
|
|
|
/* domains */
|
|
define d_name = 1
|
|
define d_qual = 2
|
|
define d_pkz = 3
|
|
define d_lohn = 4
|
|
define d_abt = 5
|
|
define d_gruppe = 6
|
|
|
|
define #d_name = char 20
|
|
define #d_qual = char 8
|
|
define #d_pkz = char 12
|
|
define #d_lohn = integer 2
|
|
define #d_abt = integer 2
|
|
define #d_gruppe = integer 2
|
|
|
|
as
|
|
|
|
on pagebegin do
|
|
'-' 12
|
|
\en
|
|
' Seite: '
|
|
integer @2 page
|
|
\en
|
|
\e2 date
|
|
\en
|
|
end
|
|
|
|
on pageend do
|
|
if ! ^last_page then
|
|
\e6 'b.w.'
|
|
\en
|
|
end if
|
|
'-' 12
|
|
\en
|
|
end
|
|
|
|
on linebegin do 'I' end
|
|
on lineend do 'I' end
|
|
|
|
\en2
|
|
' Deckblatt'
|
|
\ef
|
|
|
|
for all do
|
|
for one do
|
|
if #5 = 26 then
|
|
\e2
|
|
char #1 batch 10 @20
|
|
\en3
|
|
end if
|
|
end one
|
|
end all
|
|
|
|
set ^last_page
|
|
\e5 'Ende' ;
|
|
.fi
|
|
.LP
|
|
Als Tupelfile wird die Datenmenge des Beispiels
|
|
.ft B
|
|
kompl_p
|
|
.ft R
|
|
verwendet. Mit
|
|
dem Programm wird folgende Liste generiert:
|
|
.DS L
|
|
Erl\o'a"'uterung:
|
|
|
|
I------------I Seitenkopf
|
|
I SEITE: 1 I mit Seitennummer
|
|
I 20-MAY-88 I und Datum
|
|
I I
|
|
I I
|
|
I DECKBLATT I Listenkopf
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I B.W. I Seitenfuss
|
|
I------------I
|
|
I------------I
|
|
I SEITE: 2 I
|
|
I 20-MAY-88 I
|
|
I SCHMIDT, I automatischer Zeichenketten-
|
|
I HERMANN I umbruch (batch)
|
|
I I Zeilenvorschub
|
|
I I
|
|
I NEUMANN, I
|
|
I INGE I
|
|
I I Seitenvorschub, da Seite 2
|
|
I B.W. I gef\o'u"'llt ist
|
|
I------------I
|
|
I------------I
|
|
I SEITE: 3 I
|
|
I 20-MAY-88 I
|
|
I I
|
|
I WARNKE, I
|
|
I PETER I
|
|
I I
|
|
I I
|
|
I ENDE I Listenende
|
|
I I kein Seitenfuss
|
|
I------------I
|
|
|
|
.DE
|
|
.LP
|
|
Bei kurzen Programmen steht der Aufwand zur
|
|
Dom\o'a"'nendefinition in einem ung\o'u"'nstigen
|
|
Verh\o'a"'ltnis zur Gesamtbeschreibung. Auch wenn
|
|
diese Definition im Programm nicht komplett gebraucht wird,
|
|
muss sie vollst\o'a"'ndig sein (Identit\o'a"'t zum
|
|
Deskription-File).
|
|
.NH 4
|
|
.ft B
|
|
Gruppenwechselprogrammierung
|
|
.ft R
|
|
.LP
|
|
In diesem Abschnitt sollen Hinweise zur
|
|
Gruppenwechselprogrammierung gegeben werden.
|
|
Diese erfolgt innerhalb der Anweisung
|
|
.DS L
|
|
FOR ONE DO ... ENDONE
|
|
.DE
|
|
w\o'a"'hrend der Bearbeitung eines Tupels. Unterschieden wird in
|
|
Gruppenbeginn und -ende. Ein Gruppenbeginn liegt vor, wenn das
|
|
Gruppenattribut im aktuellen Tupel verschieden ist von dem im
|
|
vorhergehenden Tupel.
|
|
Das bedeutet nat\o'u"'rlich, dass ein zum Gruppenattribut
|
|
sortiertes Tupelfile vorliegen muss.
|
|
In einem Booleschen Ausdruck l\o'a"'sst sich
|
|
das durch den Vergleich VALUE x <> LAST x f\o'u"'r das Tupelattribut
|
|
x abtesten. Verk\o'u"'rzend kann daf\o'u"'r auch geschrieben werden
|
|
.DS L
|
|
GROUPBEGIN x.
|
|
.DE
|
|
.LP
|
|
Diese Anweisung liefert einen Boole-Wert. Liegt ein Gruppenbeginn
|
|
vor, ist er TRUE.
|
|
.LP
|
|
Das Gruppenende l\o'a"'sst sich durch einen Vergleich mit dem
|
|
n\o'a"'chsten Tupel feststellen.
|
|
\o'A"'ndert sich das Gruppenattribut,
|
|
bedeutet das das Ende der Gruppe.
|
|
Abtesten l\o'a"'sst sich das mit der
|
|
Konstruktion VALUE x <> NEXT x oder verk\o'u"'rzend
|
|
.DS L
|
|
GROUPEND x.
|
|
.DE
|
|
.LP
|
|
Liegt das Gruppenende f\o'u"'r das Gruppenattribut x vor, liefert die
|
|
Anweisung den Wert TRUE.
|
|
.LP
|
|
Im einf\o'u"'hrenden Beispiel
|
|
.ft B
|
|
(pers_p)
|
|
.ft R
|
|
ist ein sehr einfacher Fall
|
|
der Gruppenwechselprogrammierung angef\o'u"'hrt. Der Gruppenname
|
|
.ft B
|
|
p_abt
|
|
.ft R
|
|
wird jeweils nur einmal am Beginn einer Gruppe
|
|
ausgegeben. Realisiert wurde das durch die Anweisungen
|
|
.DS L
|
|
IF GROUPBEGIN p_abt THEN
|
|
INTEGER @4 #p_abt
|
|
END IF
|
|
.DE
|
|
.LP
|
|
Ein komplizierteres Beispiel
|
|
ist im Programm
|
|
.ft B
|
|
kompl_p
|
|
.ft R
|
|
angef\o'u"'hrt.
|
|
Um eventuell mehr Klarheit zu schaffen,
|
|
soll nun noch ein relativ \o'u"'bersichtliches
|
|
Beispiel folgen. F\o'u"'r die
|
|
Relation
|
|
.ft B
|
|
perskomp
|
|
.ft R
|
|
ist f\o'u"'r jede Abteilung und jede Gruppe sowie f\o'u"'r alle
|
|
Mitarbeiter die Summe der L\o'o"'hne zu berechnen und auszugeben:
|
|
.nf
|
|
report kompl2_r
|
|
with
|
|
columns 35
|
|
lines 20
|
|
all lines 24
|
|
big
|
|
|
|
/* variables */
|
|
define grp_lohn = 1
|
|
define abt_lohn = 2
|
|
define all_lohn = 3
|
|
|
|
/* domains */
|
|
define d_name = 1
|
|
define d_qual = 2
|
|
define d_pkz = 3
|
|
define d_lohn = 4
|
|
define d_abt = 5
|
|
define d_gruppe = 6
|
|
|
|
define #d_name = char 20
|
|
define #d_qual = char 8
|
|
define #d_pkz = char 12
|
|
define #d_lohn = integer 2
|
|
define #d_abt = integer 2
|
|
define #d_gruppe = integer 2
|
|
|
|
as
|
|
|
|
on pagebegin do
|
|
'-' 35
|
|
\en
|
|
' Seite: '
|
|
integer @2 page
|
|
\e\e15
|
|
date
|
|
\en
|
|
'-' 35
|
|
\en
|
|
end
|
|
|
|
on pageend do
|
|
'-' 35
|
|
\en
|
|
end
|
|
|
|
on linebegin do 'I' end
|
|
on lineend do 'I' end
|
|
|
|
\en2
|
|
' Deckblatt' \en
|
|
' Lohn nach Abteilungen und Gruppen'
|
|
\ef
|
|
set $1 = 0
|
|
set $2 = 0
|
|
set $3 = 0
|
|
|
|
for all do
|
|
for one do
|
|
set $1 += #4
|
|
set $2 += #4
|
|
set $3 += #4
|
|
if groupend d_gruppe then
|
|
\e5 'Gruppe'
|
|
\e15
|
|
integer @4 #d_gruppe
|
|
\e20 integer @8 $1 ',- M'
|
|
\en
|
|
set $1 = 0
|
|
end if
|
|
if groupend d_abt then
|
|
\e5 'Abteilung'
|
|
\e15
|
|
integer @4 #d_abt
|
|
\e20 integer @8 $2 ',- M '
|
|
\en2
|
|
set $2 = 0
|
|
'-' 35 \en
|
|
end if
|
|
end one
|
|
end all
|
|
|
|
'-' 35 \en
|
|
\e5 'Gesamt'
|
|
\e20 integer @8 $3 ',- M'
|
|
\en
|
|
'=' 35 \en3
|
|
\e5 'Listenende' ;
|
|
.fi
|
|
.LP
|
|
Bei Abarbeitung wird folgende Liste
|
|
generiert:
|
|
.DS L
|
|
I-----------------------------------I
|
|
I SEITE: 1 20-MAY-88 I
|
|
I-----------------------------------I
|
|
I I
|
|
I I
|
|
I DECKBLATT I
|
|
I LOHN NACH ABTEILUNGEN UND GRUPPEN I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I-----------------------------------I
|
|
.DE
|
|
.DS L
|
|
I-----------------------------------I
|
|
I SEITE: 2 20-MAY-88 I
|
|
I-----------------------------------I
|
|
I GRUPPE 1 2906,- M I
|
|
I ABTEILUNG 0 2906,- M I
|
|
I I
|
|
I-----------------------------------I
|
|
I GRUPPE 12 700,- M I
|
|
I ABTEILUNG 10 700,- M I
|
|
I I
|
|
I-----------------------------------I
|
|
I GRUPPE 23 877,- M I
|
|
I ABTEILUNG 13 877,- M I
|
|
I I
|
|
I-----------------------------------I
|
|
I GRUPPE 10 1120,- M I
|
|
I GRUPPE 23 1986,- M I
|
|
I ABTEILUNG 26 3106,- M I
|
|
I I
|
|
I-----------------------------------I
|
|
I GRUPPE 10 1337,- M I
|
|
I ABTEILUNG 32 1337,- M I
|
|
I I
|
|
I-----------------------------------I
|
|
.DE
|
|
.DS L
|
|
I-----------------------------------I
|
|
I SEITE: 3 20-MAY-88 I
|
|
I-----------------------------------I
|
|
I-----------------------------------I
|
|
I GRUPPE 2 1337,- M I
|
|
I GRUPPE 11 600,- M I
|
|
I ABTEILUNG 33 1937,- M I
|
|
I I
|
|
I-----------------------------------I
|
|
I GRUPPE 2 1116,- M I
|
|
I GRUPPE 3 1362,- M I
|
|
I ABTEILUNG 55 2478,- M I
|
|
I I
|
|
I-----------------------------------I
|
|
I GRUPPE 1 3250,- M I
|
|
I GRUPPE 3 1567,- M I
|
|
I ABTEILUNG 129 4817,- M I
|
|
I I
|
|
I-----------------------------------I
|
|
I GRUPPE 4 900,- M I
|
|
I GRUPPE 5 2790,- M I
|
|
I GRUPPE 6 4115,- M I
|
|
I GRUPPE 7 2200,- M I
|
|
I-----------------------------------I
|
|
.DE
|
|
.DS L
|
|
I-----------------------------------I
|
|
I SEITE: 4 20-MAY-88 I
|
|
I-----------------------------------I
|
|
I ABTEILUNG 199 10005,- M I
|
|
I I
|
|
I-----------------------------------I
|
|
I-----------------------------------I
|
|
I GESAMT 28163,- M I
|
|
I===================================I
|
|
I I
|
|
I I
|
|
I LISTENENDE I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I I
|
|
I-----------------------------------I
|
|
.DE
|
|
.LP
|
|
Gruppen k\o'o"'nnen auf verschiedenen Ebenen gebildet werden. Im
|
|
Beispiel-Tupelfile kann nach der Abteilung gruppiert werden
|
|
und innerhalb dieser nach den Gruppen. Die Liste
|
|
wurde so definiert, dass eine seitenweise Ausgabe
|
|
auf dem Bildschirm erfolgt (HOLD-MODUS).
|
|
.bp
|
|
.NH 3
|
|
.ft B
|
|
Schl\o'u"'sselworte
|
|
.ft R
|
|
.LP
|
|
.DS L
|
|
all end linebegin repeat
|
|
and enda lineend report
|
|
as endc lines return
|
|
batch endi m_day scale
|
|
batchline endo minut second
|
|
before endr mod set
|
|
big endw month space
|
|
bit exp new switch
|
|
byte false next terminal
|
|
call for norm then
|
|
case from not time
|
|
char graphic null to
|
|
clear groupbegin oct true
|
|
col groupend on tuple
|
|
column hex one value
|
|
columns hour or var
|
|
complement if out w_day
|
|
date ignore page while
|
|
day in pagebegin with
|
|
dec integer pageend word
|
|
default is_dst pic y_day
|
|
define last point year
|
|
do length proc
|
|
else line real
|
|
.DE
|