2353 lines
91 KiB
Plaintext
2353 lines
91 KiB
Plaintext
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
|