.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