P8000/WEGA/contrib/ingres/dbs/ing_src/teil2/report2.8

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