P8000/WEGA/contrib/ingres/dbs/sys/man/reporti

2353 lines
91 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

REPORT(DABA) DABA16 REPORT(DABA)
NAME
report - Reportunterstuetzung
BESCHREIBUNG
Die Reportunterstuetzung gestattet die Erzeugung von Reports
(Berichten) aus Daten eines MUTOS-Files.
Einleitung
Die hier vorgestellte Unterstuetzung gestattet mit aus-
schliesslich DABA-Werkzeugen einen Report zu erzeugen.
Fuer Daten aus der Datenbank wird das dadurch realisiert,
dass mit copy (copy(ql)) oder copyr (copyr(mutos)) Daten aus
einer Relation in ein MUTOS-File (Tupel-File) kopiert wer-
den. Anschliessend wird dieses Tuple-File durch den DABA-
Report-Generator (Interpreter) verarbeitet, der den Report
erstellt.
Der Report-Generator rg (rg(mutos)) benoetigt ein Domaenen-
Beschreibung-File des Tupel-Files, das mit rd (rd(mutos))
direkt oder das aus einem Report-Quellcode-File mit
Domaenen-Beschreibung durch den Report-Compiler rc
(rc(mutos)) mit erzeugt werden kann.
Der Report-Generator wird durch ein Report-Code-File gesteu-
ert. Dieses File wird aus einem Report-Quellcode-File durch
den Report-Compiler rc (rc(mutos)) erstellt.
Das Report-Quellcode-File enthaelt Anweisungen der Report-
sprache von DABA.
Ueber die hier beschriebene Moeglichkeit hinaus gibt es an-
dere, um mit DABA- und MUTOS-Mitteln Reports zu erzeugen.
Wenn z.B. keine Berechnungen auszufuehren und/oder die Re-
ports in Texte einzufuegen sind, ist es moeglich, den Pra-
eprozessor tbl des MUTOS-Textaufbereitungsprogrammes nroff
zu verwenden. In diesem Fall koennen die Daten aus einer
Relation der Datenbank mit copy (copy(ql)) oder mit copyr
(copyr(mutos)) in ein MUTOS-File kopiert werden. Dabei
muessen zwischen den Domaenenwerten Tabulator-Zeichen ein-
gesteuert werden.
Eine andere Moeglichkeit des Erzeugens von Reports aus Daten
der Datenbank waere u.U. ebenfalls das Kopieren mit copy
oder copyr und eine anschliessende Reportgenerierung mit dem
MUTOS-Programm awk.
Uebersicht
Die DABA-Report-Unterstuetzung wird durch die DABA-MUTOS-
Kommandos rc, rg, rd und rp_desc realisiert.
Das Kommando rc ruft den Report-Compiler auf, der die Re-
portdefinition (alle Report-Sprachanweisungen fuer einen Re-
port) verarbeitet. Die Reportsprache ist prozedural und ge-
stattet umfangreiche Berechnungen.
Das Kommando rg ruft den Report-Generator auf, der die Li-
sten erzeugt.
Das Kommando rp kann benutzt werden, um bei Spezifikation
einer Relation der Datenbank entweder nur ein
Domaenenbeschreibungs-File oder ein Reportskelett mit Doma-
enenbeschreibung zu erzeugen.
Das Kommando rp_desc druckt ein Doaenenbeschreibungs-File.
Ein einfaches Beispiel
Wir wollen den folgenden Report erstellen.
--------------------------------------------------
Gehalt und Geburtsjahr nach Leitern 24-Jun-89
Abtlg. Name Gehalt Geburtsjahr
--------------------------------------------------
Rose, Petra 1206,- M 1931
Gruene, Peter 1700,- M 1920
10 Mueller, Ernst 700,- M 1950
13 Fleischer, Karl 877,- M 1952
26 Neumann, Inge 1198,- M 1950
Schmidt, Hermann 1120,- M 1936
Warnke, Peter 788,- M 1940
32 Loda, Dieter 500,- M 1952
Baum, Klaus 837,- M 1956
33 Kayser, Helmut 600,- M 1952
Weber, Franz 1337,- M 1944
55 Maerz, Udo 1116,- M 1947
Mueller, Petra 1362,- M 1939
129 Moser, Otto 1567,- M 1938
Schulze, Ernst 1564,- M 1944
Zeidler, Fritz 1686,- M 1928
199 Rose, Peter 1590,- M 1927
Wunsch, Peter-Paul 900,- M 1928
Schneider, Peter 1300,- M 1930
Heine, Rolf 905,- M 1929
Ernst, Eva 1010,- M 1931
Malter, Juergen 1200,- M 1920
Weise, Juergen 900,- M 1935
Thoms, Rolf 1000,- M 1941
Schmidt, Petra 1200,- M 1940
--------------------------------------------------
Dazu ist folgendes zu tun.
Es wird das Kommando
modifyr dt personal heapsort leiter
aufgerufen, um die personal Beispielrelation der
Demonstrations-Datenbank dt in eine Speicherungsstruktur
heapsort mit der Spezifikation leiter zu ueberfuehren. Da-
mit ist diese Relation nach leiter sortiert.
Anschliessend wird das Tupel-File tuple im aktuellen Direc-
tory aus der Relation personal erstellt. Das erfolgt z.B.
mit dem Kommando:
copyr dt personal into tuple
Anschliessend wird ein Report-Skelettfile erstellt:
rd -r dt personal pers_r
Dieses File hat folgendes Aussehen:
report r_code # desc
with
/* page layout */
/* procedures */
/* variables */
/* switches */
/* domains */
define num = 1
define #num = integer 2
define name = 2
define #name = char 20
define gehalt = 3
define #gehalt = integer 2
define leiter = 4
define #leiter = integer 2
define gebdat = 5
define #gebdat = integer 2
define einstdat = 6
define #einstdat = integer 2
as
on pagebegin do
end
on pageend do
end
on linebegin do
end
on lineend do
end
on batchline do
end
for all do
for one do
end one
end all
;
Dieses File
pers_r
wird so editiert,
dass es folgendes Aussehen bekommt.
report pers_r
with
columns 50
lines 60
all lines 66
define num = 1
define #num = integer 2
define name = 2
define #name = char 20
define gehalt = 3
define #gehalt = integer 2
define leiter = 4
define #leiter = integer 2
define gebdat = 5
define #gebdat = integer 2
define einstdat = 6
define #einstdat = integer 2
as
on pagebegin do
'-' 50 \n
'Gehalt und Geburtsjahr nach Leitern'
\42 date \n2
'Abtlg.'
\8 'Name'
\30 'Gehalt'
\40 'Geburtsjahr'
\n
'-' 50 \n2
end
for all do
for one do
if groupbegin leiter then
\n integer @4 #leiter
end if
\8 char @20 #name
\30 integer @5 #gehalt ',- M'
\40 integer @9 #gebdat
\n
end one
end all
;
Dieses File enthaelt die Reportdefinition und die Domaenen-
definition.
Anschliessend wird der Inhalt des Files pers_r mit dem
Report-Compiler uebersetzt.
rc -o pers_r
Es entsteht das File r_code, das den erzeugten Report-Code
enthaelt und das File desc, das die Domaenenbeschreibungen
beinhaltet.
Jetzt kann das Kommando
rg
gegeben werden, das als Eingabe das File tuple, als Ausgabe
den Bildschirm hat und durch r_code gesteuert wird. Das Fi-
le desc dient zur Lokalisation der Domaenen im File tuple.
Aufbau der Reportdefinition
Jede Reportdefinition beginnt mit report und wird mit ; ab-
geschlossen.
Der grundsaetzliche Aufbau:
[define] report r_code_name [desc_name]
with
formatierung
definitionen
as
kopfangaben
tupelverarbeitung
fussangaben
;
Prozeduren werden mit call aufgerufen, hierzu wurde kein
Symbol eingefuehrt.
Fuer die definitionen erfolgt eine Zuordnung moeglicher Va-
riablen, Prozeduren, Boolescher Variablen zu einer laufenden
Nummer (jeweils mit 0 beginnend) und Domaenen zu einer lau-
fenden Nummer (mit 1 beginnend). Die Domaenendefinition
muss anschliessend durch eine Typzuordnung ergaenzt werden,
wobei dem Domaenennamen ein '#' voranzustellen ist. Im Pro-
gramm gilt folgende Zuordnung von Bezeichnung und Symbol:
Boolesche Variable (switch) ^
Domaene (val) #
Variable (var) $
Fuer die formatierung koennen den Bezeichnern
lines
all lines
columns
from page to page
from tupel to tupel
Werte zugewiesen und gegebenenfalls mit big eine
Grossbuchstaben-Konvertierung eingeschaltet werden.
Die Parameter koennen in beliebiger Reihenfolge angegeben
werden. Bei doppelt aufgefuehrten gilt der zuletzt defi-
nierte Parameter. Werden zum Zeitpunkt des Reportaufbaus
neue Festlegungen getroffen, verlieren die jeweiligen alten
Parameter ihre Gueltigkeit. Fuer alle Parameter gelten
Standardfestlegungen. Die Parameter haben folgende Bedeu-
tung (die Grossschreibung im Text dient nur der Hervorhe-
bung, Schluesselwoerter koennen im Programm klein und gross
geschrieben werden ):
LINES int
Laenge des Informationsteils auf einer Seite ( int
Zeilen), Standard: Wert von ALL LINES, wenn definiert,
sonst: 66.
ALL LINES int
Laenge der physischen Druckseite ( int Zeilen). Stan-
dard: Wert von LINES
COLUMNS int
Breite des Informationsteils ( int Spalten). Standard:
132
FROM PAGE int
Es werden nur die Seiten in die Liste eingetragen, de-
ren Seitennummern groesser oder gleich der angegebenen
Zahl int sind. Standard: 0
TO PAGE int
Es werden nur die Seiten in die Liste eingetragen, de-
ren Seitennummern kleiner oder gleich der angegebenen
Zahl int sind. Standard: 32767 (Maximum)
FROM TUPLE int
Es werden nur die Tupel verarbeitet, deren Tupelnummern
groesser oder gleich der angegebenen Zahl int sind.
Standard: 0
TO TUPLE int
Es werden nur die Tupel verarbeitet, deren Tupelnummern
kleiner oder gleich der angegebenen Zahl int sind.
Standard:32767 (Maximum)
BIG
Alle Kleinbuchstaben werden beim Einschreiben in die
Liste automatisch in Grossbuchstaben umgewandelt.
Standard: keine Umwandlung
Ist der Wert von LINES groesser als der von ALL LINES, wird
ALL LINES um ganze Vielfache seines Wertes erhoeht. Dies be-
deutet, dass sich eine Informationsseite ueber zwei oder
mehr Druckseiten erstreckt.
In prozeduren werden alle in der Reportdefinition benoetig-
ten Prozeduren notiert.
Die kopfangaben enthalten alle Anweisungen zur Gestaltung
des Listenkopfes. In der Regel wird am Beginn der Kopfan-
gaben der Seitenaufbau definiert. Die Ausgabe von Tupelwer-
ten in den Kopfangaben ist nicht sinnvoll.
Die laufsteuerung vereinigt in sich alle Moeglichkeiten zur
Eintragung von Werten und Zeichenketten in die Liste, zur
Arithmetik und zur Seitengestaltung.
Die Syntax und Semantik der Sprachanweisungen sind in den
angegebenen Kapiteln beschrieben.
Die tupelverarbeitung umfasst alle Anweisungen zur Aufberei-
tung und Ausgabe der Tupelwerte. Die Beschreibung der Tupel-
verarbeitung erfolgt im Abschnitt "Bereitstellung der Tupel-
werte".
Im abschliessenden Teil fussangaben wird die Definition des
Listenfusses beschrieben. In der vorliegenden Version ko-
ennen hier die Funktionswerte einer Anfrage ausgewertet wer-
den.
Viele Anweisungen haben als Parameter die syntaktische Kon-
struktion number. Bei number kann entweder ein Direktwert
int angegeben werden oder aber eine Variable.
Vorschub und Positionieranweisungen
Fuer die Positionierung der auszugebenden Werte auf den Sei-
ten gibt zwei Varianten, eine Kurz- und eine Langform. Die
Kurzform erspart viel Schreibaufwand und kann emfpohlen wer-
den. Es koennen folgende Anweisungen gegeben werden:
NEW PAGE oder \f
Die aktuelle Seite wird abgeschlossen. Es erfolgt der
Vorschub auf eine neue Seite. Aus Sparsamkeitsgruenden
wird ein mehrfaches NEW PAGE nur einmal ausgefuehrt.
Es werden nur Seiten ausgegeben, die mindestens ein
Zeichen enthalten. Wird also eine Leerseite gewuenscht,
muss zwischen den zwei NEW-PAGE-Anweisungen mindestens
ein Leerzeichen ausgegeben werden.
NEW LINE number oder \n number
Es erfolgt der Vorschub auf eine neue Zeile. Die alte
Zeile wird abgeschlossen und number-1 Leerzeilen werden
ausgegeben. Der Standardwert fuer number ist 1. Wurde
der Wert von LINES erreicht, wird ein Seitenvorschub
ausgefuehrt.
COL number oder \n number
Es wird auf die Spalte number positioniert. Hat die ak-
tuelle Schreibposition in der Zeile bereits die ange-
gebene Spalte number ueberschritten, erfolgt ein auto-
matisches NEW LINE und danach die Positionierung. Wenn
bei Variante 2 der Aufwand zum Auszaehlen zu gross ist,
koennen sie mit \\ it number auch relativ positionie-
ren.
SPACE number oder \\ number
Es werden number Leerzeichen eingefuegt.
Bei der Kurzform sollte der Zwischenraum von \ zu number
entfallen, er verwirrt nur.
Positionierungen auf einer Seite koennen ausserdem durch
Wertzuweisungen erreicht werden (SET LINE..., SET CO-
LUMN...). Diese Moeglichkeit ist in Abschnitt "Wertzuwei-
sung zu Systemvariablen .." beschrieben.
Beispiel
new page
new line 5
col 11
Es wird auf die 11. Spalte der 5. Zeile einer neuen Seite
positioniert. In Kurzform
\f
\n5
\11
Ausgabe konstanter Zeichenketten
Es besteht die Moeglichkeit, Zeichenketten in der Listende-
finition festzulegen, die unveraendert in die Liste ueber-
nommen werden.
'zeichenkette' BATCH number
'zeichenkette' number
Bei zeichenkette number wird die zeichenkette number -mal in
die Liste uebertragen.
Beispiel:
'=+' 5
Es wird die Zeichenkette '=+=+=+=+=+' in die Liste ein-
getragen.
Die BATCH-Funktion erlaubt das "Stapeln" einer Zeichen-
kette. Unter Stapeln wird die Moeglichkeit verstanden, eine
Zeichenkette in einer bestimmten Breite ( number Zeichen)
ueber mehrere Zeilen auszugeben. Dabei wird durch den Re-
portgenerator versucht, nur ganze Worte zu uebertragen.
Ist ein Wort laenger als die festgelegte Breite, muss es
auf zwei oder mehr Zeilen verteilt werden. Eine Silbentren-
nung fuehrt das System nicht aus.
Der Aufbau einer BATCH-Zeichenkette erfolgt in zwei Schrit-
ten:
In die aktuelle Zeile wird der erste Teil der Zeichen-
kette in der durch number bestimmten Laenge eingetra-
gen. Danach werden weitere Anweisungen fuer die Zeile
bearbeitet.
Bei Vorschub auf eine neue Zeile wird der Rest der
BATCH-Zeichenkette auf zusaetzliche Zeilen verteilt,
den sogenannten BATCH-Zeilen. Wenn sie erwarten, dass
die gesamte Zeichenkette ausgegeben und verteilt werden
soll, muss eine Laengenangabe erfolgen.
Beispiel
'DAS IST ALLES NICHT SO KOMPLIZIERT' batch $breite @35
Folgende Zeichenketten werden eingetragen, wenn die Varia-
ble "breite" die Werte
12 bzw. 5 hat:
DAS IST DAS
ALLES NICHT IST
SO ALLES
KOMPLIZIERT NICHT
SO
KOMPL
IZIER
T
Die BATCH-Funktion kann fuer mehrere Zeichenketten in einer
Zeile verwendet werden. Die naechste regulaere Zeile folgt
dann unmittelbar nach dem laengsten aller Stapel.
Um auch BATCH-Zeilen gestalten zu koennen, z. B. Tabellen-
striche weiter zu fuehren oder auch Werte auszugeben, wird
eine spezielle Anweisung zur Verfuegung gestellt.
Syntax
ON BATCHLINE [DO] [laufsteuerung] ENDO
Sie definiert den Grundaufbau ("Hintergrund") einer BATCH-
Zeile. Beim Auftreten dieser Anweisung wird eine solche Zei-
le noch nicht aufgebaut. Dies erfolgt erst nach dem Ab-
schluss der regulaeren Zeile vor dem Aufbau einer BATCH-
Zeile. Die BATCH-Zeichenketten werden dann in die vorberei-
teten BATCH-Zeilen eingetragen.
Beispiel
on batchline do
'I'
\15 'I'
\29 'I'
endo
\n2
I DAS IST I WIE ES I
I ALLES NICHT I SCHEINT I
I SO I I
I KOMPLIZIERT I I
Zeichenketten-Eingabe vom Terminal
Fuer die Gestaltung variabler Texte in der Liste, die nicht
Teil der Tupeldatei sind, steht die Moeglichkeit der Bedie-
nereingabe von Zeichenketten zur Verfuegung.
Syntax
TERMINAL zeichenkette [BATCH number]
Die Bearbeitung der Anweisung vollzieht sich in folgenden
Schritten:
Der Text von 'zeichenkette' wird auf dem Terminal unter
Anfuegung des Zeichens ">" ausgegeben.
Die Eingabe der, in die Liste einzutragenden Zeichen-
kette, vom Terminal wird erwartet.
Die eingelesene Zeichenkette wird nun genauso behan-
delt, wie eine Zeichenkette, die direkt in der Listen-
definition angegeben wurde. Die Bearbeitung eines Wie-
derholungsfaktors ist nicht moeglich.
Zu beachten ist, dass die eingelesenen Zeichenketten nicht
abgespeichert werden. Dies bedeutet, dass die Eingabe wie-
derholt vorgenommen werden muss, wenn die Anweisung TERMINAL
in einem Zyklus steht.
Beispiel
terminal 'NAME DES KUNDEN' \n2
Bei der Abarbeitung dieser Anweisungen erscheint auf dem
Terminal die Ausschrift:
NAME DES KUNDEN>
Wird als Name "Mueller" angegeben, steht in der Liste
z.B.:
Werter Herr Mueller!
Bereitstellung der Tupelwerte
Die Bereitstellung der Tupelwerte erfolgt im Teil
tupelverarbeitung.
Syntax
FOR ALL [DO] [laufsteuerung]
FOR [ONE] [DO] [laufsteuerung] END [ONE] | ENDO
[laufsteuerung] END ALL | ENDA
Die Tupelverarbeitung hat also folgendes Aussehen:
FOR ALL DO
.
.
.
FOR ONE DO
.
.
.
END ONE
.
.
.
END ALL
Erreicht die Abarbeitung die Anweisung FOR ALL DO, wird das
jeweils naechste Tupel gelesen. Zwischen FOR ONE DO und END
ONE kann das Tupel verarbeitet werden. Wird festgestellt,
dass alle Tupel gelesen wurden, erfolgt die weitere Abarbei-
tung der Listendefinition ab der ersten Anweisung nach END
ALL.
Die Konstruktion FOR ALL DO ... END ALL kann als Zyklus
betrachtet werden, der verlassen wird, wenn alle Tupel der
Eingabedatei verarbeitet wurden.
Der Zugriff auf die Werte eines Tupels wird durch das
Schluesselwort VALUE oder das Schluesselzeichen # und
die Nummer der Domaene realisiert.
define p_num = 1
.
.
define #p_num = integer 2
Das spart aber viel Arbeit, weil sie nicht unbedingt #p_num
schreiben muessen, um den Wert dieser Domaene zu erreichen -
es genuegt auch #1. Sie haben zu entscheiden, ob die Ueber-
sicht mit der zweiten Variante noch gewahrt bleibt.
Der Reportgenerator ermoeglicht nicht nur den Zugriff zum
aktuellen Tupel, sondern auch zum unmittelbar vorhergehenden
und nachfolgenden durch die Schluesselwoerter LAST und NEXT.
Syntax
LAST number
NEXT number
LAST und NEXT koennen ueberall dort verwendet werden, wo
auch # moeglich ist. Das heisst, dass gleichzeitig drei Tu-
pel ausgewertet werden koennen und ermoeglicht beispielswei-
se die Ausgabe von drei Tupeln nebeneinander ueber mehrere
Zeilen.
Wird mit number auf ein Attribut zugegriffen, das im Tupel
gar nicht existiert, wird eine Warnung auf dem Bedientermi-
nal ausgegeben und die Domaene Null verwendet. Wird auf ein
Tupel zugegriffen, welches nicht existiert, z. B. bei der
erstmaligen Abarbeitung von FOR ONE DO auf das Tupel "LAST",
haben alle Tupelattribute einen NULL-Wert.
Der NULL-Wert kennzeichnet ein Attribut als nicht definiert.
Er kann auch innerhalb von Tupeln auftreten. Intern ist der
NULL-Wert durch eine bestimmte Bitkombination verschlues-
selt.
Es sei folgende Relation erstellt:
Relation: perskomp
|name |qual |pkz |lohn |abt|gruppe|
|----------------------------------------------------------|
|Gruene, Peter |Dipl.Ing|301220433447| 1700| 0| 1|
|Rose, Petra |Oekonom |270531327326| 1206| 0| 1|
|Mueller, Ernst |Kaufmann|110450423412| 700| 10| 12|
|Fleischer, Karl |Kraftf. |200652456768| 877| 13| 23|
|Schmidt, Hermann |Ing.Oek.|130536487246| 1120| 26| 10|
|Neumann, Inge |Ing. |120950366789| 1198| 26| 23|
|Warnke, Peter |FA |120740423408| 788| 26| 23|
|Baum, Klaus |FA |191156423577| 837| 32| 10|
|Loda, Dieter |FA |040352433406| 500| 32| 10|
|Weber, Franz |Dipl.Ing|261044466201| 1337| 33| 2|
|Kayser, Helmut |TFA |200652434556| 600| 33| 11|
|Maerz, Udo |Ing. |120947434566| 1116| 55| 2|
|Mueller, Petra |Dipl.Ing|111139334464| 1362| 55| 3|
|Schulze, Ernst |Dipl.Ing|221144434043| 1564|129| 1|
|Zeidler, Fritz |Dipl.Oek|310328434035| 1686|129| 1|
|Moser, Otto |Dipl.Ing|241238434052| 1567|129| 3|
|Weise, Juergen |FA |131235435334| 900|199| 4|
|Malter, Juergen |Ing. |180620435662| 1200|199| 5|
|Rose, Peter |Dipl.Oek|200227435046| 1590|199| 5|
|Ernst, Eva |Dipl.Ma.|130431334667| 1010|199| 6|
|Heine, Rolf |Oek. |220829435672| 905|199| 6|
|Schmidt, Petra |Dipl.Ma.|101040334223| 1200|199| 6|
|Thoms, Rolf |Oek. |100341434221| 1000|199| 6|
|Schneider, Peter |Oek. |130730434446| 1300|199| 7|
|Wunsch, Peter-Paul|Ing. |050428433078| 900|199| 7|
|----------------------------------------------------------|
Das Programm kompl_p soll eine stark vereinfachte FZR-
Beitragsuebersicht erstellen:
report kompl_r
with
/* page layout */
columns 60
lines 36
all lines 48
/* procedures */
define p_fzr = 1
define p_pgw = 2
/* switches */
define last_page = 1
/* variables */
define next_page = 0
define fzr = 1
define grp_lohn = 2
define grp_fzr = 3
define grp_cnt = 4
define abt_lohn = 5
define abt_fzr = 6
define abt_cnt = 7
/* 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
proc p_fzr
set $fzr = ($fzr - 600) / 10
if $fzr > 60 then set $fzr = 60 end if
return
proc p_pgw
if line < 47 then 'I' end if
return
on pagebegin do
'-' 60 \n
'VEB Generatorwerke'
\50 date \n
'1234 Berlin'
\50 time \n
'Beispielstr. 13'
\28 'Seite: ' integer page \n
'-' 60 \n2
if ! page == 1 then
\20 'Liste der Abteilung ' integer #d_abt
end if
\n2
end
on pageend do
if ! ^last_page then
set $next_page = page + 1
\36 'Es folgt Seite: ' integer $next_page
end if
\n
'-' 60 \n3
end
on lineend do call p_pgw end
on linebegin do call p_pgw end
on batchline do
\18
if #d_pkz from 7 to 7 == '4'
then 'maennl'
else 'weibl'
end if
end
set line = 10
\\20 'Liste der Abteilungen ' new page
for all do
for one do
if groupbegin d_abt then new page end if
if groupbegin d_gruppe then
'**** Gruppe ' integer @3 #d_gruppe
' ****' \n2
'Name'
\15 'Qualifikation'
\32 'Geb.-Datum'
\45 'Lohn'
\55 'FZR' \n
\15 'maennl/weibl' \n2
end if
set $fzr = #d_lohn
call p_fzr
char batch 10 @20 #d_name
\18 char #d_qual
\33 char to 2 #d_pkz '.'
char from 3 to 4 #d_pkz '.'
char from 5 to 6 #d_pkz
\44 integer @4 #d_lohn ',-M'
\54 integer @3 $fzr ',-M' \n
set $grp_lohn += #d_lohn
set $grp_fzr += $fzr
set $grp_cnt += 1
if groupend d_gruppe then
set $abt_lohn += $grp_lohn
set $abt_fzr += $grp_fzr
set $abt_cnt += $grp_cnt
if $grp_cnt > 0 then
set $grp_lohn := $grp_cnt
set $grp_fzr := $grp_cnt
end if
\28 'Durchschnitt: '
\44 integer @4 $grp_lohn ',-M'
\54 integer @3 $grp_fzr ',-M' \n2
set $grp_lohn = 0
set $grp_fzr = 0
set $grp_cnt = 0
'-' 60 \n
end if
if groupend d_abt then
if $abt_cnt > 0 then
set $abt_lohn := $abt_cnt
set $abt_fzr := $abt_cnt
end if
'Durchschnitt der Abteilung: '
\44 integer @4 $abt_lohn ',-M'
\54 integer @3 $abt_fzr ',-M' \n2
set $abt_lohn = 0
set $abt_fzr = 0
set $abt_cnt = 0
'=' 60 \n
end if
end one
end all
set ^last_page;
Als Ausgabegeraet wurde ein Seriendrucker mit 48 Zeilen Sei-
tenlaenge gewaehlt, der softwareseitig keinen Seitenvorschub
realisieren kann (Ausgabe von Zeilenvorschub). Da jeweils
am Zeilenanfang und -ende mit 'I' gerahmt werden soll, ist
durch die Prozedur p_pgw die Abfrage nach den Zeilennummern
1..46 eingeordnet, um zu verhindern, dass auf den Zeilen 47
und 48 (Seitenfalz) ebenfalls ein 'I' erscheint. Bei Druk-
kern (Paralleldrucker), die diese Einschraenkung nicht ken-
nen, kann die Prozedur p_pgw entfallen.
Die Rolle von lines und all lines soll am Beispiel noch ein-
mal erklaert werden. Die Differenz zwischen beiden betraegt
12, also die Summe der new lines, die fuer die Abschnitte on
pagebegin do und on pageend do verwendet wurden. Damit ste-
hen fuer den Informationsteil tatsaechlich nur 36 Zeilen zur
Verfuegung. Bei einem Drucker mit 72 Zeilen muessten ent-
sprechend fuer lines 60 Zeilen und all lines 72 Zeilen ge-
schrieben werden. Falls sie sich hierbei verzaehlen, erhal-
ten sie in der Regel unbrauchbare Seitenformatierungen. Be-
vor weitere Erlaeuterungen folgen, einige Auszuege aus dem
tatsaechlichen Druckbild:
I------------------------------------------------------------I
IVEB Generatorwerke 19-May-88 I
I1234 Berlin 11:18:42 I
IBeispielstr. 13 Seite: 2 I
I------------------------------------------------------------I
I I
I Liste der Abteilung 0 I
I I
I**** Gruppe 1 **** I
I I
IName Qualifikation Geb.-Datum Lohn FZR I
I maennl/weibl I
I I
IGruene, Dipl.Ing 30.12.20 1700,-M 60,-M I
IPeter maennl I
IRose, Oekonom 27.05.31 1206,-M 60,-M I
IPetra weibl I
I Durchschnitt: 1453,-M 60,-M I
I I
I------------------------------------------------------------I
IDurchschnitt der Abteilung: 1453,-M 60,-M 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
I I
I I
I I
I I
I I
I I
I Es folgt Seite: 3 I
I------------------------------------------------------------I
I------------------------------------------------------------I
IVEB Generatorwerke 19-May-88 I
I1234 Berlin 11:19:29 I
IBeispielstr. 13 Seite: 10 I
I------------------------------------------------------------I
I I
I Liste der Abteilung 199 I
I I
I**** Gruppe 4 **** I
I I
IName Qualifikation Geb.-Datum Lohn FZR I
I maennl/weibl I
I I
IWeise, FA 13.12.35 900,-M 30,-M I
IJuergen maennl I
I Durchschnitt: 900,-M 30,-M I
I I
I------------------------------------------------------------I
I**** Gruppe 5 **** I
I I
IName Qualifikation Geb.-Datum Lohn FZR I
I maennl/weibl I
I I
IMalter, Ing. 18.06.20 1200,-M 60,-M I
IJuergen maennl I
IRose, Dipl.Oek 20.02.27 1590,-M 60,-M I
IPeter maennl I
I Durchschnitt: 1395,-M 60,-M I
I I
I------------------------------------------------------------I
I**** Gruppe 6 **** I
I I
IName Qualifikation Geb.-Datum Lohn FZR I
I maennl/weibl I
I I
IErnst, Eva Dipl.Ma. 13.04.31 1010,-M 41,-M I
I weibl I
IHeine, Oek. 22.08.29 905,-M 30,-M I
IRolf maennl I
ISchmidt, Dipl.Ma. 10.10.40 1200,-M 60,-M I
IPetra weibl I
IThoms, Oek. 10.03.41 1000,-M 40,-M I
IRolf maennl I
I Durchschnitt: 1029,-M 43,-M I
I Es folgt Seite: 11 I
I------------------------------------------------------------I
I------------------------------------------------------------I
IVEB Generatorwerke 19-May-88 I
I1234 Berlin 11:19:41 I
IBeispielstr. 13 Seite: 11 I
I------------------------------------------------------------I
I I
I Liste der Abteilung 199 I
I I
I I
I------------------------------------------------------------I
I**** Gruppe 7 **** I
I I
IName Qualifikation Geb.-Datum Lohn FZR I
I maennl/weibl I
I I
ISchneider, Oek. 13.07.30 1300,-M 60,-M I
IPeter maennl I
IWunsch, Ing. 05.04.28 900,-M 30,-M I
IPeter-Paul maennl I
I Durchschnitt: 1100,-M 45,-M I
I I
I------------------------------------------------------------I
IDurchschnitt der Abteilung: 1112,-M 46,-M 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
I I
I I
I I
I I
I I
I------------------------------------------------------------I
Sofern sie die Liste auf einem Paralleldrucker mit einer
Seitenlaenge von 66 Zeilen ausgeben wollen, kann die Pro-
zedur p_pgw, wie ereits erwaehnt, weggelassen werden. Die
Kopfinformationen sehen dann so aus:
/* page layout */
columns 60
lines 56
all lines 66
big
Die Behandlung des Seitenendes muss entsprechend obiger De-
finition auf
on pageend do
if ! ^last_page then
set $next_page = page + 1
\36 'Es folgt Seite: ' integer $next_page
end if
'-' 60 \n
end
geaendert werden und die Zeilenende und -anfangsbehandlung
sieht jetzt so aus:
on lineend do 'I' end
on linebegin do 'I' end
Falls sie in der Zeile
char batch 10 @20 #d_name
die Laengenangabe @20 vergessen, werden in der 2. Zeile
exakt soviele Zeichen nicht ausgegeben, wie in der 1. ge-
spart wurden. Es steht dann beispielsweise:
Thoms,
R
Schmidt,
Petr
Systemvariable
Systemvariablen werden automatisch dem Nutzer zur Verfuegung
gestellt. Sie besitzen einen definierten Anfangswert und ko-
ennen durch den Nutzer beliebige Werte zugewiesen bekommen.
Die Variablen haben folgende Bedeutung:
PAGE
Nummer der aktuellen Seite
Mit 1 beginnend, wird bei jedem Vorschub auf eine neue
Seite der Wert PAGE um eins erhoeht. PAGE kann vom Nut-
zer ein beliebiger Wert zwischen 0 und 32767 zugewiesen
werden.
TUPLE
Nummer des aktuellen Tupels
Mit 1 beginnend, wird bei jedem Einlesen eines neuen
Tupels dieser Wert um eins erhoeht. TUPLE kann vom Nut-
zer ein beliebiger Wert zwischen 0 und 32767 zugewiesen
werden.
LINE
aktuelle Zeilennummer auf der Seite
Ist LINE das Ziel einer Wertzuweisung, wird nicht nur
die neue Zeilennummer in LINE eingetragen, sondern tat-
saechlich auch die angegebene Zeile der Seite positio-
niert. Ist die aktuelle Zeilennummer bereits groesser
oder gleich der berechneten, erfolgt automatisch der
Vorschub auf eine neue Seite und danach die Positionie-
rung auf die gewuenschte Zeile.
COLUMN
aktuelle Schreibposition (Spalte, mit 1 beginnend) in
der Zeile
Ist COLUMN Ziel einer Wertzuweisung, wird der ge-
wuenschte Wert in COLUMN eingetragen und auf die Spalte
positioniert.
VAR
allgemeine Variable
Dem Nutzer stehen 126 Variable (VAR0 - VAR125) zur
freien Verfuegung. Der Nummer kann mit define ein ent-
sprechender Name zugeordnet werden. Sie werden im Ge-
gensatz zu Domaenenwerten (#) mit $NAME oder $number
(mit 0 beginnend) gerufen. Den verfuegbaren Variablen
koennen Integer- und Realwerte zugewiesen werden. Am
Anfang sind alle Variablen mit dem Wert 0 initiali-
siert.
Die allgemeinen Variablen sollten nicht mit den Bool-
schen Variablen verwechselt werden, hier sind ebenfalls
126 Variable verfuegbar, die den Wert TRUE oder FALSE
annehmen koennen (siehe Abschnitt "Boolsche Variable").
Alle Systemvariablen beinhalten numerische Werte und ko-
ennen als solche in die Liste eingetragen werden.
Zeichenkettenvariablen gibt es im Reportgenerator nicht.
Systemkonstante, Datum, Uhrzeit
Die Systemkonstanten werden dem Nutzer fuer die Ausgabe und
Verwendung in arithmetischen Ausdruecken zur Verfuegung
gestellt. Sie koennen nicht Ziel einer Wertzuweisung sein:
YEAR aktuelles Jahr (0 bis 99 als Jahr - 99)
MONTH aktueller Monat (0 bis 11)
DAY aktueller Tag (1 bis 31)
M_DAY aktueller Tag im Monat (1 bis 31)
W_DAY aktueller Tag der Woche (0 = Sonntag bis 6)
Y_DAY aktueller Tag im Jahr (0 bis 365)
HOUR aktuelle Stunde (0 bis 23)
MINUTE aktuelle Minute (0 bis 59)
SECOND aktuelle Sekunde (0 bis 59).
Die Konstanten werden beim Start des Report-Generators neu
aus der Systemzeit des Rechners ermittelt.
Der Reportgenerator stellt zwei spezielle Funktionen fuer
die Ausgabe von Datum und Uhrzeit zur Verfuegung:
DATE in der Form tt-mmm-jj
TIME in der Form hh:mm:ss.
Beispiel
'DATUM UND UHRZEIT:' date ' ' time
erzeugt den Text
DATUM UND UHRZEIT: 27-JAN-86 11:13:25
Ausgabe von numerischen Werten
In diesem Abschnitt werden die Ausgabemoeglichkeiten von nu-
merischen Werten vorgestellt. Dafuer stehen die drei Funk-
tionen
- INTEGER
- REAL
- GRAPHIC
zur Verfuegung. Welchen numerischen Typ die auszugebenden
Werte intern besitzen, ist fuer die Funktionen ohne Bedeu-
tung. Welcher Wert ausgegeben werden soll, wird unmittelbar
hinter der Funktion angegeben.
Der erste Parameter dieser Funktionen ist die Laenge.
[LENGTH number]
oder
[@number]
Number legt die Anzahl der Zeichen fest, die fuer die Aus-
gabe des Wertes in der Listenzeile zur Verfuegung gestellt
werden. Diese Anzahl kann den Funktionen mit Angabe von num-
ber vorgegeben werden. Die Zahlen werden dann rechtsbuendig
in den bereitgestellten Platz eingetragen. Fehlt die Laenge-
nangabe, wird genau so viel Platz in der Zeile beansprucht,
wie fuer die Darstellung des Wertes notwendig ist. Die Zahl
wird also linksbuendig ab der aktuellen Schreibposition ein-
getragen. Die naechste Ausgabe erfolgt dann unmittelbar hin-
ter dem Wert.
Ausgabe als Integer-Zahl
Die Darstellung eines Wertes erfolgt als ganze Zahl.
_ _
| |
INTEGER laenge | SCALE real | num daten
| PIC zeichenkette |
~ ~
Wahlweise kann ein Skalierungsfaktor und eine Druckauf-
bereitungsmaske spezifiziert werden.
Der Wert wird mit dem Skalierungsfaktor multipliziert. Damit
lassen sich bequem Massstabsveraenderungen, Zinsberechnun-
gen, Prozentrechnungen u.a. realisieren. Der auszugebende
Wert wird eventuell gerundet.
Beispiel
integer @18
scale 0.0325
pic 'ZINSEN: 00009.99 M'
#p_guthab
Hat #p_guthab den Wert 20000, wird in die Liste eingetra-
gen:
ZINSEN: 6.50 M
Die Symbole einer Druckaufbereitungsmaske PIC haben fest zu-
geordnete Bedeutungen. Diese sind im einzelnen:
<
linksbuendiges Eintragen der aufbereiteten Maske in die
verfuegbare Spalte
>
rechtsbuendiges Eintragen der aufbereiteten Maske in
die verfuegbare Spalte
=
zentriertes Eintragen der aufbereiteten Maske in die
verfuegbare Spalte
9
Eintragen einer Ziffer
0
Eintragen einer Ziffer, falls es sich nicht um eine
Vornull handelt. Bei Vornullen wird ein Leerzeichen
bzw. das Vorzeichen (falls gewuenscht) eingetragen.
+
unbedingte Darstellung des Vorzeichens unmittelbar
vor der ersten Ziffer;
-
Darstellung nur des negativen Vorzeichens unmittelbar
vor der ersten Ziffer (Standard); sonst unveraenderte
Uebernahme in das Ausgabebild.
Um die Symbole fuer die Druckaufbereitung als normale Zei-
chen verwenden zu koennen, mueen sie mit dem Zeichen '\' ka-
schiert (geschuetzt) werden. Das Zeichen '\' ist durch die
Umschreibung '\\' verfuegbar.
Die Symbole fuer die Positionierung der Druckaufbereitungs-
maske koennen an beliebiger Stelle stehen, das zuletzt ge-
gebene Symbol wird fuer die Druckaufbereitung verwendet, al-
le anderen werden "verschluckt".
Das Symbol fuer das Vorzeichen kann an drei Stellen ange-
geben werden:
- vor dem ersten '0'-Symbol
Darstellung des Vorzeichens an dieser Position;
- vor dem ersten '9'-Symbol
Darstellung des Vorzeichens unmittelbar vor der ersten Zif-
fer;
- nach dem letzten '9'-Symbol
Darstellung des Vorzeichens nach der letzten Ziffer
Beachte:
Das zuletzt verwendete Vorzeichensymbol wird fuer die Auf-
bereitung verwendet.
Ausgabe als Real-Zahl
Die Darstellung eines Wertes erfolgt als Gleitkommazahl.
_ _
| |
| SCALE real |
| BEFORE number |
REAL laenge | POINT number | num daten
| NORM number |
| IGNORE |
| EXP zeichenkette |
~ ~
Die wahlweise anzugebenden Parameter haben folgende Bedeu-
tung:
SCALE real
Der Attributwert wird vor der Aufbereitung mit dem
Skalierungsfaktor multipliziert.
BEFORE number
Anzahl der Stellen vor dem Komma
Standard: 0
POINT number
Anzahl der Stellen nach dem Komma
Die letzte Stelle ist gerundet.
Standard: 6
NORM number
Die Zahl soll mit einem bestimmten Exponenten dar-
gestellt werden. Beispielsweise wird bei NORM 5
die Zahl mit dem Exponenten E+05 dargestellt. Der Para-
meter BEFORE wird dabei unwirksam.
IGNORE
Die Angabe des Exponenten soll unterdrueckt werden. Der
Parameter BEFORE wird dabei unwirksam. Ist die Darstel-
lung des Wertes ohne Exponenten nicht moeglich, gelten
die anderen Parameter.
EXP zeichenkette
Es wird die Zeichenkette vor dem Exponentenwert defi-
niert.
Standard: 'E'
Beispiel
Es sollen verschiedene Darstellungsmoeglichkeiten der Varia-
blen $1 mit dem Wert 123.45 veranschaulicht werden:
1) real $1
0.123450E 03
2) real length 20 scale 2000 before 3 point 2 exp 'EXP' $1
246.90 EXP 03
3) real length 20 scale 2000 before 3 point 2
exp 'EXP' ignore $1
246900.00
4) real length 20 norm -2 $1
12345.000000E-02
5) real length 15 exp '*10**' point 1 $1
0.1*10** 03
Die Darstellung noch einmal zum besseren Vergleich:
1) 0.123450E 03
2) 246.90 EXP 03
3) 246900.00
4) 12345.000000E-02
5) 0.1*10** 03
Pseudographische Ausgabe
Der Reportgenerator ermoeglicht die einfache Darstellung
von Diagrammen.
_ _
|_ _ _ _ |
|| | | | |
|| FROM | | VAR int| |
GRAPHIC laenge || TO | | real | | num daten
|~ ~ ~ ~ |
| WITH zeichenkette |
~ ~
Der durch die Grenzen FROM und TO definierte Wertebereich
wird auf den mit 'laenge' angegebenen Darstellungsbereich
abgebildet. Die Abbildung erfolgt mit dem bei WITH angege-
benen Zeichen. Ist FROM < TO erfolgt eine linksbuendige und
ist FROM > TO eine rechtsbuendige Darstellung der Pseudogra-
fik in der Spalte.
Standards: laenge = 50
FROM 0
TO 0
WITH '*'
Beispiel
Es soll das Attribut "menge" grafisch dargestellt werden.
Vor der grafischen Darstellung soll der Wert als Integer-
Zahl ausgegeben werden.
for one do
integer @3 #menge
\6
graphic @20 from 0 to 10 with '+' #menge
\n
end one
Darstellung:
7 ++++++++++++++
3 ++++++
4 ++++++++
8 ++++++++++++++++
1 ++
0
11 ++++++++++++++++++++
Ausgabe von Zeichenkettenwerten
Fuer die Ausgabe von Zeichenkettenwerten steht die Funktion
CHAR zur Verfuegung:
_ _
| _ _ | _ _
| | FROM | | | LAST |
CHAR laenge | | TO | number| | VALUE | number
| | BATCH | | | NEXT |
~ ~ ~ ~ ~ ~
Ist die Laenge angegeben, wird die Zeichenkette linksbuendig
in den bereitgestellten Platz eingetragen. Sollte die Zei-
chenkette laenger sein, wird rechts abgeschnitten. Mit FROM
und TO kann die auszugebende Zeichenkette eingeschraenkt
werden. Ist keine Laenge angegeben, wird die Zeichenkette in
ihrer Originallaenge eingetragen. Die Tupelwerte duerfen
nicht numerischer Wertart sein.
Die Zeichenketten koennen mit der Funktion BATCH ueber meh-
rere Zeilen verteilt werden. Zu beachten ist, dass eine La-
engenangabe nicht die Laenge der auszugebenden Zeichenkette
bestimmt, sondern den bereitgestellten Platz in der Liste.
Dieser Unterschied existiert, da die Zeichenketten ueberwie-
gend in ganzen Worten ausgegeben werden und dadurch Platz
verloren geht. Mit CHAR 110 BATCH 20 werden zum Beispiel ge-
nau 5 Zeilen zu 20 und eine Zeile mit 10 Zeichen gefuellt,
unabhaengig davon, wie lang die Zeichenkette ist.
Beispiel
char from 3 #text
\n
char from 5 to 12 #text
Hat #text die Zeichenkette
'PLATSCH BATCH',
erzeugen die Anweisungen die Zeichenketten
ATSCH BATCH
SCH BATC
Ausgabe von Werten verschiedener Formate
Der Reportgenerator bietet die Moeglichkeit, Werte in einem
anderen Zahlensystem darzustellen. Die Werte werden unab-
haengig von der Wertart als Bitketten interpretiert und in
das gewuenschte Zahlensystem umgewandelt.
Syntax
_ _
| |
| Systemvariable |
_ _ | Systemkonstante |
| BIT | _ _ |_ _ |
| OCT | | BYTE | laenge || LAST | |
| HEX | | WORD | || VALUE | number |
| DEC | ~ ~ || NEXT | |
~ ~ ~~ ~ ~
BYTE ist Standard, fuehrende Nullen werden unterdrueckt.
Ist die Laenge angegeben, wird der Wert entweder vollsta-
endig oder rechts verkuerzt linksbuendig in den bereitge-
stellten Platz eingetragen. Fehlt die Laengenangabe, wird
der Wert vollstaendig in der tatsaechlichen Laenge ausge-
geben.
Beispiel
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
Systemvariable und arithmetische Ausdruecke
Fuer die Berechnung nicht in der Relation enthaltener Werte
steht im Reportgenerator eine umfangreiche Arithmetik zur
Verfuegung. Dem an C gewoehnten Nutzer wird zusaetzlich die
Notation arithmetischer Zuweisungen gemaess C gestattet.
Syntax
SET systemvariable = arithm_ausdruck
Durch die SET-Anweisung wird einer Systemvariablen das Er-
gebnis eines arithmetischen Ausdrucks zugewiesen. Bei
den Variablen COLUMN und LINE ist die Wertzuweisung mit
Ausgabeoperationen verbunden. Im arithmetischen Ausdruck
koennen beliebige numerische Werte mit den Operationen
+ oder += Addition
- oder -= Subtration
* oder *= Multiplikation
: oder := Division
/ oder /= ganzzahlige Division
% oder %= Modulodivision (Divisionsrest)
verknuepft werden. Die Klammerung von Teilausdruecken und
die Negation von Werten ist moeglich. Die Syntax eines
arithmetischen Ausdruckes entspricht der allgemein ueblichen
Notation mathematischer Formeln.
Beispiele
Allgemeiner Ausdruck:
SET VAR 30 = ( - VALUE 10 * VAR 3 + 27.12E-7 )
: ( VAR 7 % 19 / 7.2 )
Es soll die durchschnittliche Planerfuellung einer
Plankennziffer VALUE 4 mit den Istwerten VALUE 5 bis 7
ausgegeben werden:
SET VAR 1 = ( VALUE 5 + VALUE 6 + VALUE 7 ) / 3
INTEGER SCALE 100 PIC 'DURCHSCHNITT: 009.99 %' VAR 1
Es soll auf die 30. Zeile der Seite positioniert wer-
den:
SET LINE = 30
Tritt waehrend der Bearbeitung eines arithmetischen Aus-
drucks ein Fehler auf, wenn z. B. ein Zeichenkettenwert be-
teiligt ist, wird die Berechnung abgebrochen. Der Variablen
wird kein Wert zugewiesen, sie bleibt unveraendert.
Boolesche Variable und Ausdruck
Fuer die wertabhaengige Programmabarbeitung stehen Moeg-
lichkeiten zur Formulierung Boolescher Ausdruecke sowie
101 logische Variable zur Verfuegung.
Die Schalter
SWITCH 0 bis SWITCH 125
koennen die zwei Zustaende "ein" und "aus" bzw. TRUE und
FALSE annehmen.
Initialisiert sind die Variablen bei Programmbeginn mit
FALSE. Fuer ihre Aenderung stehen vier Moeglichkeiten zur
Auswahl.
Syntax
_ _
| CLEAR |
| COMPLEMENT | SWITCH number
| SET |
~ ~
SET SWITCH number = boolean
Mit CLEAR, COMPLEMENT und SET kann ein bestimmter Schalter
geloescht (FALSE), umgekehrt (TRUE-->FALSE, FALSE-->TRUE)
bzw. gesetzt (TRUE) werden. Die Wertzuweisung erlaubt das
Eintragen des Ergebnisses eines Booleschen Ausdrucks. Dieser
wird durch die Verknuepfung von Boole-Werten (TRUE/FALSE)
gebildet. Verknuepfungsoperatoren sind
OR || bzw. | logisches "oder" (Disjunktion)
AND && bzw. & logisches "und" (Konjunktion).
Die Negation erfolgt mit einem vorgestellten NOT oder !.
Eine Klammerung von Teilausdruecken ist moeglich.
Boole-Werte koennen logische Variablen (SWITCH number ) mit
den Werten TRUE oder FALSE sowie die Ergebnisse von
Vergleichsoperatoren sein. Als Vergleichsoperanden sind alle
numerischen und Zeichenkettenwerte, arithmetische Ausdruecke
sowie NULL (Vergleich auf NULL-Wert) zugelassen.
Die Operanden koennen miteinander verglichen werden durch:
< kleiner
> groesser
!= ungleich
<> ungleich
<= kleiner gleich
>= groesser gleich
= gleich.
== gleich
Zeichenkettenwerte koennen nicht mit numerischen Werten ver-
glichen werden. Ein NULL-Wert ist grundsaetzlich kleiner als
ein beliebiger anderer Wert. Zwei NULL-Werte sind gleich.
Die Abarbeitungsfolge eines Booleschen Ausdrucks wird durch
die Prioritaet der Operatoren bestimmt. Die hoechste Prio-
ritaet hat die numerische Negation, die kleinste OR:
^ ! (Negationszeichen)
| * / : %
| + -
Prioritaet < > <> != <= >= = ==
| NOT !
| AND && &
| OR || |
^
Bei gleicher Prioritaet erfolgt die Bearbeitung von links
nach rechts.
Beispiele
SET SWITCH 10
COMPLEMENT SWITCH 10
Mit SET wird die logische Variable 10 TRUE gesetzt und durch
COMPLEMENT umgekehrt, d.h. FALSE
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)
Der logischen Variablen 5 wird das Ergebnis des Booleschen
Ausdrucks zugewiesen.
Tritt waehrend der Bearbeitung eines Booleschen Ausdrucks
ein Fehler auf, wird diese abgebrochen und das Ergebnis FAL-
SE gesetzt.
Steuerung der Programmabarbeitung Verzweigung
Die Verzweigung ermoeglicht die Abarbeitung von Anweisun-
gen in Abhaengigkeit von einer Bedingung (Boolescher Aus-
druck).
Syntax
IF boolean THEN laufsteuerung [ELSE laufsteuerung] END-
IF / ENDI
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. Anstel-
le ENDI kann auch END IF stehen. Die Verschachtelung von
IF-Anweisungen ist moeglich.
Beispiel
Es soll das Quartal ermittelt und ausgegeben werden:
IF MONTH < 6
THEN IF MONTH < 3
THEN 'I'
ELSE 'II'
ENDI
ELSE IF MONTH < 9
THEN 'III'
ELSE 'IV'
ENDI
ENDI
'. QUARTAL'
Im Dezember wird zum Beispiel IV. QUARTAL ausgegeben.
Hinweis:
Die Werte der Systemvariablen MONTH haben den Bereich 0...11
!
Zyklus
Fuer die Programmierung von Zyklen stehen zwei Anweisungen
bereit.
Syntax
REPEAT number laufsteuerung ENDREPEAT/ENDR
WHILE boolean DO laufsteuerung ENDWHILE/ENDW
Bei REPEAT wird der Zyklus in einer vorher festgelegten An-
zahl ( number ), jedoch mindestens einmal, durchlaufen. Ist
number ein reeller Wert, wird er durch Abrunden zu einem
ganzzahligen umgewandelt. Der WHILE-Zyklus wird ausgefuehrt,
solange der Boolesche Ausdruck den Wert TRUE liefert.
Beispiel
In VALUE 1 bis VALUE 10 stehen Werte zwischen 0 und 100. Die
Werte sollen, wenn sie kleiner als 50 sind, als roemische
Zahlen ausgegeben werden:
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
Sind im Tupel die ersten 10 Werte
1, 30, 60, 12, 77, 3, 90, 17, 22, 33
wird in die Liste eingetragen:
I XXX XII III XVII XXII XXXIII
Fallauswahl
Die Fallauswahl ist eine Mehrfachverzweigung, die durch
eine Variable gesteuert wird.
Syntax
CASE VAR number [IN] [DO laufsteuerung]
[OUT laufsteuerung]ENDCASE/ENDC
VAR number enthaelt einen ganzzahligen Wert. Ist er 0, wer-
den die Anweisungen nach dem 1. DO abgearbeitet, ist er 2,
die nach dem 2. DO usw. Ist fuer den Wert keine DO-
Konstruktion mehr da, oder ist der Wert kleiner als 1, wer-
den 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.
Achtung
Die direkte Verschachtelung von CASE-Klauseln ist nicht mo-
eglich! Wird eine CASE-Klausel jedoch in einer Prozedur
vereinbart, ist deren Aufruf innerhalb einer anderen CASE-
Klausel realisierbar.
Beispiel
Im Kopf einer Monatsabrechnung soll der Name des Monats
ausgegeben werden:
'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
Im September wird in den Report eingetragen:
ABRECHNUNG FUER DEN MONAT SEPTEMBER
Prozeduren
Oft verwendete gleichartige Programmteile koennen in Pro-
zeduren vereinbart werden.
Syntax
PROC int laufsteuerung RETURN
Der Wert fuer 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
definitionen, die Notierung der Prozedur selbst im Teil pro-
zeduren unmittelbar hinter AS erfolgen.
Beim Aufruf einer Prozedur werden alle Anweisungen bis RE-
TURN abgearbeitet.
Syntax
CALL [PROC] int
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 Auf-
ruf definiert sein muss. Das ist insbesondere bei der Defi-
nition mehrerer Prozeduren zu beachten. Nicht erlaubt ist
z.B. folgende Konstruktion:
PROC 1 CALL 5 RETURN
PROC 5 .... RETURN
Beispiel
Es soll eine Prozedur fuer die Potenz XLYK definiert werden
(Y = natuerliche Zahl). X wird in VAR 1, Y in VAR 2 erwar-
tet, das Ergebnis steht in VAR 0.
PROC 1
SET VAR 0 = 1
REPEAT VAR 2
SET VAR 0 = VAR 0 * VAR 1
ENDR
RETURN
Die Berechnung von 13L11K wird realisiert mit:
SET VAR 1 = 13
SET VAR 2 = 11
CALL 1
REAL VAR 0
Seitengestaltung
Eine Seite hat im Reportgenerator folgende Gestalt:
COLUMNS
|<----------------->|
________|___________________|______________
/|\ | | PAGEBEGIN | | /|\ |
| | 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 | |
\|/ | N | | | S | |
________|___________________| | | |
| | PAGEEND | | | |
| |___________________|___| | |
|________________________________\ /__|
Die Groesse einer Seite wird durch die Parameter COLUMNS,
LINES und ALL LINES bestimmt. Der Seitenrahmen mit Seiten-
kopf (PAGEBEGIN), Seitenfuss (PAGEEND), linkem Seitenrand
(LINEBEGIN) und rechtem Seitenrand (LINEEND) wird, wenn die
Teile vom Nutzer definiert wurden, vom Reportgenerator auto-
matisch fuer jede Seite aufgebaut.
Syntax
_ _
| LINEBEGIN |
| LINEEND |
ON | PAGEBEGIN | [DO] [laufsteuerung] END/ENDO
| PAGEEND |
~ ~
Ist die Laufsteuerung nicht angegeben, gilt der Rahmenteil
als nicht definiert, d. h. eine existierende Definition wird
geloescht. Sind im Programm mehrere Definitionen fuer einen
Rahmenteil angegeben, gilt immer die aktuellste.
In PAGEBEGIN und PAGEEND werden Informationen vereinbart,
die auf jeder Seite erscheinen sollen. Das koennen die ak-
tuelle Seitennummer, Ueberschriften, Fussnoten und Tupelwer-
te sein. Aber auch Berechnungen koennen ausgefuehrt werden.
Soll zum Beispiel die Seitennummerierung in 10er Schritten
erfolgen, muss in PAGEBEGIN die Wertzuweisung SET PAGE = PA-
GE + 9 enthalten sein, da bei Seitenwechsel automatisch um 1
erhoeht wird. Mit LINEBEGIN und LINEEND koennen "Begrenzun-
gen", Zeilennummerierungen u.a. vereinbart werden.
Der Aufbau eines Rahmenteils wird vorzeitig abgebrochen,
wenn bei PAGEBEGIN und PAGEEND ein unerlaubter Seitenwechsel
veranlasst wird bzw. bei LINEBEGIN und LINEEND ein Zeilen-
vorschub.
Der Informationsteil nimmt den eigentlichen Inhalt der Seite
auf. Ist eine Zeile laenger als mit COLUMNS festgelegt, wer-
den ueberstehende Zeichen auf eine neue Zeile . Ist eine
Seite voll, wird automatisch ein Seitenwechsel ausgeloest.
Die Laenge 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.
Auch bei LINEBEGIN und LINEEND ist die Laenge zunaechst un-
erheblich. Allerdings sollte darauf geachtet werden, dass
diese zusammen mit COLUMNS nicht groesser als die maximale
Druckbreite wird. Werden die Seitenraender bis zum physi-
schen Blattende gewuenscht, muss PAGEEND um die entsprechen-
de Anzahl Leerzeilen erweitert werden.
Die Variable LINE bezieht sich in PAGEBEGIN und PAGEEND auf
die physische Seite, ebenso COLUMN in LINEBEGIN und LINEEND.
Ansonsten geben diese Variablen die Position bezueglich des
Informationsteils an.
Beispiel
Die Funktionsweise der Seitendefinition soll im folgenden an
einer "Mini"-Seite mit 12 Spalten und 7 Zeilen gezeigt wer-
den. Die physische Seite habe eine Laenge von 12 Zeilen:
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
\n
' Seite: '
integer @2 page
\n
\2 date
\n
end
on pageend do
if ! ^last_page then
\6 'b.w.'
\n
end if
'-' 12
\n
end
on linebegin do 'I' end
on lineend do 'I' end
\n2
\f
for all do
for one do
if #5 = 26 then
\2
char #1 batch 10 @20
\n3
end if
end one
end all
set ^last_page
\5 'Ende' ;
Als Tupelfile wird die Datenmenge des Beispiels kompl_p ver-
wendet. Mit dem Programm wird folgende Liste generiert:
Erlaeuterung:
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 gefuellt 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
Bei kurzen Programmen steht der Aufwand zur Domaenendefini-
tion in einem unguenstigen Verhaeltnis zur Gesamtbeschrei-
bung. Auch wenn diese Definition im Programm nicht komplett
gebraucht wird, muss sie vollstaendig sein (Identitaet zum
Deskription-File).
Gruppenwechselprogrammierung
In diesem Abschnitt sollen Hinweise zur Gruppenwechselpro-
grammierung gegeben werden. Diese erfolgt innerhalb der An-
weisung
FOR ONE DO ... ENDONE
waehrend 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 natuerlich, dass
ein zum Gruppenattribut sortiertes Tupelfile vorliegen muss.
In einem Booleschen Ausdruck laesst sich das durch den Ver-
gleich VALUE x <> LAST x fuer das Tupelattribut x abtesten.
Verkuerzend kann dafuer auch geschrieben werden
GROUPBEGIN x.
Diese Anweisung liefert einen Boole-Wert. Liegt ein Gruppen-
beginn vor, ist er TRUE.
Das Gruppenende laesst sich durch einen Vergleich mit dem
naechsten Tupel feststellen. Aendert sich das Gruppenattri-
but, bedeutet das das Ende der Gruppe. Abtesten laesst sich
das mit der Konstruktion VALUE x <> NEXT x oder verkuerzend
GROUPEND x.
Liegt das Gruppenende fuer das Gruppenattribut x vor, lie-
fert die Anweisung den Wert TRUE.
Im einfuehrenden Beispiel pers_p ist ein sehr einfacher Fall
der Gruppenwechselprogrammierung angefuehrt. Der Gruppenname
p_abt wird jeweils nur einmal am Beginn einer Gruppe aus-
gegeben. Realisiert wurde das durch die Anweisungen
IF GROUPBEGIN p_abt THEN
INTEGER @4 #p_abt
END IF
Ein komplizierteres Beispiel ist im Programm kompl_p ange-
fuehrt. Um eventuell mehr Klarheit zu schaffen, soll nun
noch ein relativ uebersichtliches Beispiel folgen. Fuer die
Relation perskomp ist fuer jede Abteilung und jede Gruppe
sowie fuer alle Mitarbeiter die Summe der Loehne zu berech-
nen und auszugeben:
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
\n
' Seite: '
integer @2 page
\\15
date
\n
'-' 35
\n
end
on pageend do
'-' 35
\n
end
on linebegin do 'I' end
on lineend do 'I' end
\n2
\f
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
\5 'Gruppe'
\15
integer @4 #d_gruppe
\20 integer @8 $1 ',- M'
\n
set $1 = 0
end if
if groupend d_abt then
\5 'Abteilung'
\15
integer @4 #d_abt
\20 integer @8 $2 ',- M '
\n2
set $2 = 0
'-' 35 \n
end if
end one
end all
\5 'Gesamt'
\20 integer @8 $3 ',- M'
\n
\5 'Listenende' ;
Bei Abarbeitung wird folgende Liste generiert:
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
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
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
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
Gruppen koennen 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).
Schluesselworte
all end linebegin repeat
and enda lineend report
as endc lines return
batch endi m_day scale
batchline endo minute 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