1834 lines
49 KiB
Groff
1834 lines
49 KiB
Groff
.ds RH \f3Report\f1
|
|
.ds RF \f3UNIX\f1
|
|
.ds CH - % -
|
|
.ds LH Anwendung
|
|
.bp
|
|
.NH 2
|
|
.ft B
|
|
Report-Generator *
|
|
.ft R
|
|
.LP
|
|
.sp 10
|
|
.NH 3
|
|
.ft B
|
|
Vorbemerkung
|
|
.ft R
|
|
.LP
|
|
Wie jedes andere Werkzeug in \*(xx\ oder auch innerhalb
|
|
\*(yy\ ist der Report-Generator
|
|
.ft B
|
|
eine
|
|
.ft R
|
|
Alternative zur Erstellung von Drucklisten.
|
|
In der praktischen Anwendung werden Drucklisten
|
|
einerseits ben\o'o"'tigt, um periodisch
|
|
\o'u"'ber lange Zeitr\o'a"'ume Aussagen \o'u"'ber sich \o'a"'ndernde
|
|
Datenbest\o'a"'nde zu liefern, andererseits werden
|
|
aber auch Aussagen mit einem gewissen Einmaligkeitscharakter
|
|
gew\o'u"'nscht.
|
|
.LP
|
|
Im ersten Fall bleibt dem Projektanten in der Regel genug
|
|
Zeit, die Listenerstellung gr\o'u"'ndlich vorzubereiten,
|
|
sodass die Erstellung innerhalb eines AMX- oder EQUEL-Programmes
|
|
sinnvoll und effektiv ist - vor allem unterliegt hier
|
|
der Zugriff zu verschiedenen Relationen keiner
|
|
praktisch wirksamen Begrenzung. Das zu druckende File wird so
|
|
direkt aus den Datenbest\o'a"'nden der Relationen erzeugt.
|
|
.LP
|
|
Bei Verwendung des Report-Generators werden die Daten aus
|
|
einem Tupelfile gelesen, das vorher aus
|
|
.ft B
|
|
einer
|
|
.ft R
|
|
Relation erzeugt werden muss. Die Erstellung dieser Relation
|
|
aus den Dom\o'a"'nen verschiedener anderer Relationen
|
|
ist technisch einfach (
|
|
.ft B
|
|
scan (amx)
|
|
.ft R
|
|
oder
|
|
.ft B
|
|
retrieve (quel)
|
|
.ft R
|
|
), kann aber gegebenenfalls Dimensionierungsprobleme
|
|
verursachen - jedes Tupel muss der gleichen Struktur zugeordnet werden!
|
|
.LP
|
|
Wir k\o'o"'nnen nicht davon ausgehen, dass alle \*(yy\-Nutzer
|
|
mit C umgehen k\o'o"'nnen oder gerade dann, wenn operativ eine
|
|
Druckliste dringend ben\o'o"'tigt wird, ein Programmierer
|
|
d\o'a"'umchendrehend darauf gewartet hat!
|
|
Der Umgang mit dem Report-Generator
|
|
ist relativ schnell erlernt. Zu Beginn muss nicht jede
|
|
Raffinesse eingeordnet werden.
|
|
.NH 3
|
|
.ft B
|
|
Arbeitsschritte
|
|
.ft R
|
|
.LP
|
|
Wir verwenden wieder einmal unsere Relation aus "demo".
|
|
.DS
|
|
|
|
Relation: personal
|
|
---------
|
|
Besitzer: ing_db
|
|
Tupellaenge: 30
|
|
Verfallsdatum: Tue Apr 26 19:56:39 1988
|
|
Tupelanzahl: 25
|
|
Speicherstruktur: HEAP
|
|
Relationentyp: Nutzerrelation
|
|
.DE
|
|
.sp 1
|
|
.DS
|
|
Domaenname Typ Laenge Schluessel
|
|
-------------------------------------------
|
|
num i 2
|
|
name c 20
|
|
gehalt i 2
|
|
leiter i 2
|
|
gebdat i 2
|
|
einstdat i 2
|
|
-------------------------------------------
|
|
.DE
|
|
.LP
|
|
Mit dem Kommando
|
|
.IP
|
|
.ft B
|
|
rd demo personal
|
|
.ft R
|
|
.LP
|
|
wird ein File
|
|
.ft B
|
|
desc
|
|
.ft R
|
|
erzeugt. Dieses File l\o'a"'sst sich mit dem Kommando
|
|
.IP
|
|
.ft B
|
|
rp_desc desc
|
|
.ft R
|
|
.LP
|
|
auf dem Bildschirm darstellen.
|
|
.DS L
|
|
I +--------+
|
|
N | Post | REPORT description printer
|
|
G | Quick | VERSION 6/3.1
|
|
- | Report | RELEASE Thu Nov 14 00:00:00 1988
|
|
D +--------+
|
|
B ZKI 1988
|
|
|
|
| value | type | len | off |
|
|
+-------+-------+-------+-------+
|
|
! 1 | int | 2 | 0 |
|
|
! 2 | char | 20 | 2 |
|
|
! 3 | int | 2 | 22 |
|
|
! 4 | int | 2 | 24 |
|
|
! 5 | int | 2 | 26 |
|
|
! 6 | int | 2 | 28 |
|
|
+-------+-------+-------+-------+
|
|
.DE
|
|
Beachten sie, dass
|
|
der Vorspann auf
|
|
.ft B
|
|
stderr
|
|
.ft R
|
|
und die Tabelle auf
|
|
.ft B
|
|
stdout
|
|
.ft R
|
|
ausgegeben wird.
|
|
.LP
|
|
Die Spalte
|
|
.ft B
|
|
value
|
|
.ft R
|
|
stellt den Dom\o'a"'nennamen in Form eines Stellungsparameters
|
|
dar.
|
|
.NH 3
|
|
.ft B
|
|
Typ ,L\o'a"'nge ,Offset
|
|
.ft R
|
|
.LP
|
|
Beachten Sie bitte , dass das angebotene Deskriptionfile
|
|
im Sinne der Beschreibung mit dem Datenfile identisch ist.
|
|
.LP
|
|
Ein zweiter Weg zur Erstellung eines Deskriptionfiles
|
|
ist die Aufnahme einer Dom\o'a"'nenbeschreibung in die
|
|
Report-Quelle. Bei Reports f\o'u"'r Relationen aus
|
|
Datenbanken kann man mit
|
|
.ft B
|
|
rd -r
|
|
.ft R
|
|
einen leeren Report generieren, der die Beschreibung
|
|
der Dam\o'a"'nen verankert.Der Compiler hat die Aufgabe,
|
|
die Dom\o'a"'nenbeschreibung in das Deskriptionfile zu
|
|
\o'u"'bersetzen.
|
|
.LP
|
|
Der Variablenname im Report-Programm hat also keine unmittelbare
|
|
Korrespondenz mit der Relation.
|
|
Zu Beginn wollen wir uns noch auf einige Dinge einigen, die
|
|
vom Report-Generator zwar nicht gefordert werden, aber dennoch
|
|
recht n\o'u"'tzlich sind. In \*(xx\ werden \o'u"'blicherweise bestimmte
|
|
File-Typen mit einem Postfix versehen, es wird vorgeschlagen
|
|
.sp 1
|
|
.DS
|
|
Beschreibungsfile desc mit _d (analog Flag bei rg)
|
|
Datenfile tuple mit _f (analog Flag bei rg)
|
|
Ausgabe output mit _o (analog Flag bei rg)
|
|
Report-Quelle Quellcode mit _p (Programm)
|
|
r_code mit _r
|
|
.DE
|
|
.sp 1
|
|
zu benennen. Mit dieser Methode wird eine Gruppierung erreicht,
|
|
die garantiert, dass man auch bei mehr als 3 Report-Programmen
|
|
im Directory noch weiss, was wohin geh\o'o"'rt.
|
|
Der underscore wurde verwendet, weil rc
|
|
den Punkt nicht anerkennt und um
|
|
Verwechslungen mit dem Pascal Quellcode bzw. dem C-Objektfile
|
|
m\o'o"'glich w\o'a"'ren.
|
|
.LP
|
|
Folgende Liste soll erstellt werden:
|
|
.DS L
|
|
--------------------------------------------------
|
|
Gehalt und Geburtsjahr nach Abteilungen 9-Mai-88
|
|
|
|
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
|
|
--------------------------------------------------
|
|
.DE
|
|
.LP
|
|
Als Ausgangsrelation verwenden wir
|
|
.ft B
|
|
personal\c
|
|
.ft R
|
|
, die allerdings nach
|
|
.ft B
|
|
leiter
|
|
.ft R
|
|
sortiert werden muss. Das Kommando dazu mit der QUEL:
|
|
.IP
|
|
.ft B
|
|
modify personal to heapsort on leiter
|
|
.ft R
|
|
.LP
|
|
Das
|
|
.ft B
|
|
Tupelfile
|
|
.ft R
|
|
erzeugen wir mit
|
|
.IP
|
|
.ft B
|
|
copy personal() into "\/mnt\/work\/text\/pers.f" .
|
|
.ft R
|
|
.LP
|
|
Das Programm dazu sieht so aus (pers_p):
|
|
|
|
.nf
|
|
report pers_r
|
|
with
|
|
columns 50
|
|
lines 60
|
|
all lines 66
|
|
|
|
define p_num = 1
|
|
define p_name = 2
|
|
define p_gehalt = 3
|
|
define p_abt = 4
|
|
define p_gebdat = 5
|
|
|
|
define #p_num = integer 2
|
|
define #p_name = char 20
|
|
define #p_gehalt = integer 2
|
|
define #p_abt = integer 2
|
|
define #p_gebdat = integer 2
|
|
|
|
as
|
|
|
|
on pagebegin do
|
|
'-' 50 \en
|
|
'Gehalt und Geburtsjahr nach Abteilungen'
|
|
\e42 date \en2
|
|
'Abtlg.'
|
|
\e8 'Name'
|
|
\e30 'Gehalt'
|
|
\e40 'Geburtsjahr'
|
|
\en
|
|
'-' 50 \en2
|
|
end
|
|
|
|
for all do
|
|
for one do
|
|
if groupbegin p_abt then
|
|
\en integer @4 #p_abt
|
|
end if
|
|
\e8 char @20 #p_name
|
|
\e30 integer @5 #p_gehalt ',- M'
|
|
\e40 integer @9 #p_gebdat
|
|
\en
|
|
end one
|
|
end all
|
|
'-' 50 \en2
|
|
;
|
|
.fi
|
|
.LP
|
|
Zum Programm folgt sp\o'a"'ter noch eine Erl\o'a"'uterung.
|
|
Jetzt wird aus
|
|
.ft B
|
|
pers_p
|
|
.ft R
|
|
der
|
|
.ft B
|
|
r_code
|
|
.ft R
|
|
erzeugt. Das Kommando dazu:
|
|
.IP
|
|
.ft B
|
|
rc pers_p
|
|
.ft R
|
|
.LP
|
|
Durch die erste Zeile im Programm
|
|
.ft B
|
|
report pers_r
|
|
.ft R
|
|
weiss der Report-Compiler wie das File "r_code" zu benennen ist.
|
|
Mit dem Aufruf
|
|
.IP
|
|
.ft B
|
|
rg -dpers_d -fpers_f -ipers_r
|
|
.ft R
|
|
.LP
|
|
wird die Druckliste auf dem Bildschirm ausgegeben. F\o'u"'gen
|
|
sie noch die Option
|
|
.ft B
|
|
-opers_o
|
|
.ft R
|
|
hinzu, steht das Ergebnis im File
|
|
.ft B
|
|
pers_o.
|
|
.ft R
|
|
.NH 3
|
|
.ft B
|
|
Aufbau der Listendefinition
|
|
.ft R
|
|
.LP
|
|
Jede Listendefinition beginnt mit
|
|
.ft B
|
|
report
|
|
.ft R
|
|
und wird mit
|
|
.ft B
|
|
;
|
|
.ft R
|
|
abgeschlossen.
|
|
Der grunds\o'a"'tzliche Aufbau:
|
|
.DS I
|
|
[define] report r_code_name [desc_name]
|
|
with
|
|
formatierung
|
|
definitionen
|
|
as
|
|
kopfangaben
|
|
tupelverarbeitung
|
|
fussangaben
|
|
;
|
|
.DE
|
|
.LP
|
|
Prozeduren werden mit
|
|
.ft B
|
|
call
|
|
.ft R
|
|
aufgerufen, hierzu wurde kein Symbol eingef\o'u"'rt.
|
|
.LP
|
|
F\o'u"'r die
|
|
.ft B
|
|
definitionen
|
|
.ft R
|
|
erfolgt eine Zuordnung m\o'o"'glicher Variablen,
|
|
Prozeduren, Boolescher Variablen
|
|
zu einer laufenden Nummer (jeweils mit 0 beginnend)
|
|
und Dom\o'a"'nen zu einer
|
|
laufenden Nummer (mit 1 beginnend).
|
|
Die Dom\o'a"'nendefinition muss anschliessend durch eine
|
|
Typzuordnung erg\o'a"'nzt werden, wobei dem Dom\o'a"'nennamen
|
|
ein '#' voranzustellen ist.
|
|
Im Programm gilt folgende Zuordnung von Bezeichnung und Symbol:
|
|
.DS L
|
|
Boolesche Variable (switch) ^
|
|
Domaene (val) #
|
|
Variable (var) $
|
|
.DE
|
|
F\o'u"'r die
|
|
.ft B
|
|
formatierung
|
|
.ft R
|
|
k\o'o"'nnen den Bezeichnern
|
|
.DS I
|
|
lines
|
|
all lines
|
|
columns
|
|
from page to page
|
|
from tupel to tupel
|
|
.DE
|
|
Werte zugewiesen und gegebenenfalls mit
|
|
.ft B
|
|
big
|
|
.ft R
|
|
eine Grossbuchstaben-Konvertierung eingeschaltet werden.
|
|
.LP
|
|
Die Parameter k\o'o"'nnen in beliebiger Reihenfolge angegeben werden.
|
|
Bei doppelt aufgef\o'u"'hrten gilt der zuletzt definierte Parameter.
|
|
Werden zum Zeitpunkt des Listenaufbaus neue Festlegungen
|
|
getroffen, verlieren die jeweiligen alten Parameter ihre G\o'u"'ltigkeit.
|
|
F\o'u"'r alle Parameter gelten Standardfestlegungen.
|
|
Die Parameter haben folgende Bedeutung (die Grossschreibung
|
|
im Text dient nur der Hervorhebung, Schl\o'u"'sselw\o'o"'rter
|
|
k\o'o"'nnen im Programm klein und gross geschrieben werden ):
|
|
.LP
|
|
.ft B
|
|
LINES int
|
|
.ft R
|
|
.IP
|
|
L\o'a"'nge des Informationsteils auf einer Seite (int
|
|
Zeilen),
|
|
Standard: Wert von ALL LINES, wenn definiert,
|
|
sonst: 66,
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
ALL LINES int
|
|
.ft R
|
|
.IP
|
|
L\o'a"'nge der physischen Druckseite (int Zeilen),
|
|
Standard: Wert von LINES,
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
COLUMNS int
|
|
.ft R
|
|
.IP
|
|
Breite des Informationsteils (int Spalten),
|
|
Standard: 132,
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
FROM PAGE int
|
|
.ft R
|
|
.IP
|
|
Es werden nur die Seiten in die Liste eingetragen,
|
|
deren Seitennummer gr\o'o"'sser oder gleich der
|
|
angegebenen Zahl int ist.
|
|
Standard: 0;
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
TO PAGE int
|
|
.ft R
|
|
.IP
|
|
Es werden nur die Seiten in die Liste eingetragen,
|
|
deren Seitennummer kleiner oder gleich der
|
|
angegebenen Zahl int ist.
|
|
Standard: 32767 (Maximum);
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
FROM TUPLE int
|
|
.ft R
|
|
.IP
|
|
Es werden nur die Tupel verarbeitet, deren
|
|
Tupelnummer gr\o'o"'sser oder gleich der angegebenen
|
|
Zahl int ist.
|
|
Standard: 0
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
TO TUPLE int
|
|
.ft R
|
|
.IP
|
|
Es werden nur die Tupel verarbeitet, deren
|
|
Tupelnummer kleiner oder gleich der angegebenen Zahl
|
|
int ist.
|
|
Standard:32767 (Maximum)
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
BIG
|
|
.ft R
|
|
.IP
|
|
Alle Kleinbuchstaben werden beim Einschreiben in
|
|
die Liste automatisch in Grossbuchstaben
|
|
umgewandelt.
|
|
Standard: keine Umwandlung
|
|
.RE
|
|
.LP
|
|
Ist der Wert von LINES gr\o'o"'sser als der von ALL LINES, wird ALL
|
|
LINES um ganze Vielfache seines Wertes erh\o'o"'ht. Dies bedeutet,
|
|
dass sich eine Informationsseite \o'u"'ber zwei oder mehr Druckseiten
|
|
erstreckt.
|
|
.LP
|
|
In
|
|
.ft B
|
|
prozeduren
|
|
.ft R
|
|
werden alle in der Listendefinition ben\o'o"'tigten
|
|
Prozeduren notiert.
|
|
.LP
|
|
Die
|
|
.ft B
|
|
kopfangaben
|
|
.ft R
|
|
enthalten alle Anweisungen zur Gestaltung des
|
|
Listenkopfes. In der Regel wird am Beginn der Kopfangaben der
|
|
Seitenaufbau definiert.
|
|
Die Ausgabe von
|
|
Tupelwerten in den Kopfangaben ist nicht sinnvoll.
|
|
.LP
|
|
Die
|
|
.ft B
|
|
laufsteuerung
|
|
.ft R
|
|
vereinigt in sich alle M\o'o"'glichkeiten zur
|
|
Eintragung von Werten und Zeichenketten in die Liste, zur Arithmetik
|
|
und zur Seitengestaltung.
|
|
.LP
|
|
Die Syntax und Semantik der Sprachanweisungen sind in den
|
|
angegebenen Kapiteln beschrieben.
|
|
.LP
|
|
Die
|
|
.ft B
|
|
tupelverarbeitung
|
|
.ft R
|
|
umfasst alle Anweisungen zur Aufbereitung
|
|
und Ausgabe der Tupelwerte. Die Beschreibung der
|
|
Tupelverarbeitung erfolgt im Abschnitt "Bereitstellung der Tupelwerte".
|
|
.LP
|
|
Im abschliessenden Teil
|
|
.ft B
|
|
fussangaben
|
|
.ft R
|
|
wird die Definition des
|
|
Listenfusses beschrieben. In der vorliegenden Version k\o'o"'nnen
|
|
hier die Funktionswerte einer Anfrage ausgewertet werden.
|
|
.LP
|
|
Viele Anweisungen haben als Parameter die syntaktische
|
|
Konstruktion
|
|
.ft B
|
|
number.
|
|
.ft R
|
|
Bei number kann entweder ein Direktwert int
|
|
angegeben werden oder aber eine Variable.
|
|
.NH 3
|
|
.ft B
|
|
Vorschub und Positionierkommandos
|
|
.ft R
|
|
.LP
|
|
F\o'u"'r die Positionierung der auszugebenden Werte auf den Seiten
|
|
gibt es jeweils 2 Varianten, eine f\o'u"'r fleissige Schreiber und
|
|
eine f\o'u"'r diejenigen, die schnell zum Ziel kommen wollen! Es
|
|
k\o'o"'nnen folgende Anweisungen gegeben werden:
|
|
.LP
|
|
.ft B
|
|
NEW PAGE
|
|
.ft R
|
|
oder
|
|
.ft B
|
|
\ef
|
|
.ft R
|
|
.IP
|
|
Die aktuelle Seite wird abgeschlossen. Es erfolgt
|
|
der Vorschub auf eine neue Seite. Aus
|
|
Sparsamkeitsgr\o'u"'nden wird ein mehrfaches NEW PAGE nur
|
|
einmal ausgef\o'u"'hrt. Es werden nur Seiten
|
|
ausgegeben, die mindestens ein Zeichen enthalten. Wird
|
|
also eine Leerseite gew\o'u"'nscht, muss zwischen den
|
|
zwei NEW-PAGE-Anweisungen mindestens ein
|
|
Leerzeichen ausgegeben werden.
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
NEW LINE number
|
|
.ft R
|
|
oder
|
|
.ft B
|
|
\ennumber
|
|
.ft R
|
|
.IP
|
|
Es erfolgt der Vorschub auf eine neue Zeile. Die
|
|
alte Zeile wird abgeschlossen und number-1
|
|
Leerzeilen werden ausgegeben. Der Standardwert f\o'u"'r
|
|
number ist 1. Wurde der Wert von LINES erreicht,
|
|
wird ein Seitenvorschub ausgef\o'u"'hrt.
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
COL number
|
|
.ft R
|
|
oder
|
|
.ft B
|
|
\enumber
|
|
.ft R
|
|
.IP
|
|
Es wird auf die Spalte number positioniert. Hat
|
|
die aktuelle Schreibposition in der Zeile bereits
|
|
\o'u"'ber die angegebene Spalte number \o'u"'berschritten,
|
|
erfolgt ein automatisches NEW LINE und danach die
|
|
Positionierung. Wenn bei Variante 2 der Aufwand zum Ausz\o'a"'hlen
|
|
zu gross ist, k\o'o"'nnen sie mit
|
|
.ft B
|
|
\e\enumber
|
|
.ft R
|
|
auch relativ positionieren.
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
SPACE number
|
|
.ft R
|
|
oder
|
|
.ft B
|
|
\e\enumber
|
|
.ft R
|
|
.IP
|
|
Es werden number Leerzeichen eingef\o'u"'gt.
|
|
.RE
|
|
.LP
|
|
Bei der Kurzform sollte der Zwischenraum von \e zu number entfallen,
|
|
er verwirrt nur.
|
|
.LP
|
|
Positionierungen auf einer Seite k\o'o"'nnen ausserdem durch
|
|
Wertzuweisungen erreicht werden (SET LINE..., SET COLUMN...). Diese
|
|
M\o'o"'glichkeit ist in Abschnitt "Wertzuweisung zu Systemvariablen .."
|
|
beschrieben.
|
|
|
|
.ft B
|
|
Beispiel
|
|
.ft R
|
|
.DS L
|
|
new page
|
|
new line 5
|
|
col 11
|
|
.DE
|
|
Es wird auf die 11. Spalte der 5. Zeile einer
|
|
neuen Seite positioniert. In Kurzform
|
|
.DS L
|
|
\ef
|
|
\en5
|
|
\e11
|
|
.DE
|
|
.NH 3
|
|
.ft B
|
|
Ausgabe konstanter Zeichenketten
|
|
.ft R
|
|
.LP
|
|
Es besteht die M\o'o"'glichkeit, Zeichenketten in der
|
|
Listendefinition festzulegen, die unver\o'a"'ndert
|
|
in die Liste \o'u"'bernommen
|
|
werden.
|
|
.DS I
|
|
'zeichenkette' BATCH number
|
|
'zeichenkette' number
|
|
.DE
|
|
Bei
|
|
.ft B
|
|
zeichenkette number
|
|
.ft R
|
|
wird die zeichenkette number-mal in die
|
|
Liste \o'u"'bertragen.
|
|
|
|
.ft B
|
|
Beispiel
|
|
.ft R
|
|
.DS I
|
|
'=+' 5
|
|
|
|
.DE
|
|
Es wird die Zeichenkette '=+=+=+=+=+' in die
|
|
Liste eingetragen.
|
|
.LP
|
|
Die BATCH-Funktion erlaubt das "Stapeln" einer Zeichenkette.
|
|
Unter Stapeln wird die M\o'o"'glichkeit verstanden, eine Zeichenkette
|
|
in einer bestimmten Breite (number Zeichen) \o'u"'ber mehrere Zeilen
|
|
auszugeben. Dabei wird durch den Reportgenerator versucht, nur
|
|
ganze Worte zu \o'u"'bertragen. Ist ein Wort l\o'a"'nger als die
|
|
festgelegte Breite, muss es auf zwei oder mehr Zeilen verteilt werden.
|
|
Eine Silbentrennung f\o'u"'hrt das System nicht aus.
|
|
.LP
|
|
Der Aufbau einer BATCH-Zeichenkette erfolgt in zwei Schritten:
|
|
.IP 1.
|
|
In die aktuelle Zeile wird der erste Teil der Zeichenkette in
|
|
der durch number bestimmten L\o'a"'nge eingetragen. Danach werden
|
|
weitere Anweisungen f\o'u"'r die Zeile bearbeitet.
|
|
.IP 2.
|
|
Bei Vorschub auf eine neue Zeile wird der Rest der
|
|
BATCH-Zeichenkette auf zus\o'a"'tzliche Zeilen verteilt,
|
|
den sogenannten
|
|
BATCH-Zeilen. Wenn sie erwarten, dass die gesamte Zeichenkette
|
|
ausgegeben und verteilt werden soll, muss eine L\o'a"'ngenangabe
|
|
erfolgen.
|
|
.LP
|
|
.ft B
|
|
Beispiel
|
|
.ft R
|
|
.DS L
|
|
'DAS IST ALLES NICHT SO KOMPLIZIERT' batch $breite @35
|
|
.DE
|
|
.LP
|
|
Folgende Zeichenketten werden eingetragen, wenn die Variable
|
|
"breite" die Werte
|
|
.DS L
|
|
12 bzw. 5 hat:
|
|
|
|
DAS IST DAS
|
|
ALLES NICHT IST
|
|
SO ALLES
|
|
KOMPLIZIERT NICHT
|
|
SO
|
|
KOMPL
|
|
IZIER
|
|
T
|
|
.DE
|
|
.LP
|
|
Die BATCH-Funktion kann f\o'u"'r mehrere Zeichenketten in einer Zeile
|
|
verwendet werden. Die n\o'a"'chste regul\o'a"'re Zeile folgt dann
|
|
unmittelbar nach dem l\o'a"'ngsten aller Stapel.
|
|
.LP
|
|
Um auch BATCH-Zeilen gestalten zu k\o'o"'nnen, z. B. Tabellenstriche
|
|
weiter zu f\o'u"'hren oder auch Werte auszugeben, wird eine spezielle
|
|
Anweisung zur Verf\o'u"'gung gestellt.
|
|
|
|
.ft B
|
|
Syntax
|
|
.ft R
|
|
.DS L
|
|
|
|
ON BATCHLINE [DO] [laufsteuerung] ENDO
|
|
|
|
.DE
|
|
Sie definiert den Grundaufbau ("Hintergrund") einer BATCH-Zeile.
|
|
Beim Auftreten dieser Anweisung wird eine solche Zeile noch nicht
|
|
aufgebaut. Dies erfolgt erst nach dem Abschluss der regul\o'a"'ren
|
|
Zeile vor dem Aufbau einer BATCH-Zeile. Die BATCH-Zeichenketten
|
|
werden dann in die vorbereiteten BATCH-Zeilen eingetragen.
|
|
|
|
.ft B
|
|
Beispiel
|
|
.ft R
|
|
.DS L
|
|
on batchline do
|
|
'I'
|
|
\e15 'I'
|
|
\e29 'I'
|
|
endo
|
|
\en2
|
|
|
|
|
|
I DAS IST I WIE ES I
|
|
I ALLES NICHT I SCHEINT I
|
|
I SO I I
|
|
I KOMPLIZIERT I I
|
|
.DE
|
|
.NH 3
|
|
.ft B
|
|
Eingabe von Zeichenketten \o'u"'ber Terminal
|
|
.ft R
|
|
.LP
|
|
F\o'u"'r die Gestaltung variabler Texte in der Liste, die nicht Teil
|
|
der Tupeldatei sind, steht die Bedienereingabe von Zeichenketten
|
|
zur Verf\o'u"'gung.
|
|
|
|
.ft B
|
|
Syntax
|
|
.ft R
|
|
.DS L
|
|
|
|
TERMINAL zeichenkette [BATCH number]
|
|
|
|
.DE
|
|
Die Bearbeitung der Anweisung vollzieht sich in folgenden
|
|
Schritten:
|
|
|
|
.IP 1.
|
|
Der Text von 'zeichenkette' wird auf dem Terminal unter
|
|
Anf\o'u"'gung des Zeichens ">" ausgegeben.
|
|
.IP 2.
|
|
Die Eingabe der, in die Liste einzutragenden Zeichen\%kette, vom
|
|
Terminal wird erwartet.
|
|
.IP 3.
|
|
Die eingelesene Zeichenkette wird nun genauso behandelt, wie
|
|
eine Zeichenkette, die direkt in der Listendefinition
|
|
angegeben wurde. Die Bearbeitung eines
|
|
Wiederholungsfaktors ist nicht m\o'o"'glich.
|
|
.LP
|
|
Zu beachten ist, dass die eingelesenen Zeichenketten nicht
|
|
abgespeichert werden. Dies bedeutet, dass die Eingabe wiederholt
|
|
vorgenommen werden muss, wenn die Anweisung TERMINAL in einem Zyklus
|
|
steht.
|
|
|
|
.ft B
|
|
Beispiel
|
|
.ft R
|
|
.DS L
|
|
terminal 'NAME DES KUNDEN' \en2
|
|
.DE
|
|
Bei der Abarbeitung dieser Anweisungen erscheint auf
|
|
dem Terminal die Ausschrift:
|
|
.DS L
|
|
NAME DES KUNDEN>
|
|
.DE
|
|
Wird als Name "Mueller" angegeben, steht in der
|
|
Liste dann:
|
|
.br
|
|
Werter Herr Mueller!
|
|
|
|
.NH 3
|
|
.ft B
|
|
Bereitstellung der Tupelwerte
|
|
.ft R
|
|
.LP
|
|
Die Bereitstellung der Tupelwerte erfolgt im Teil
|
|
.ft B
|
|
tupelverarbeitung.
|
|
.ft R
|
|
|
|
.ft B
|
|
Syntax
|
|
.ft R
|
|
.DS I
|
|
FOR ALL [DO] [laufsteuerung]
|
|
|
|
FOR [ONE] [DO] [laufsteuerung] END [ONE] | ENDO
|
|
[laufsteuerung] END ALL | ENDA
|
|
.DE
|
|
Die Tupelverarbeitung hat also folgendes Aussehen:
|
|
.DS L
|
|
FOR ALL DO
|
|
.
|
|
.
|
|
.
|
|
FOR ONE DO
|
|
.
|
|
.
|
|
.
|
|
END ONE
|
|
.
|
|
.
|
|
.
|
|
END ALL
|
|
.DE
|
|
.LP
|
|
Erreicht die Abarbeitung die Anweisung FOR ALL DO, wird das
|
|
jeweils n\o'a"'chste Tupel gelesen. Zwischen FOR ONE DO
|
|
und END ONE kann das Tupel verarbeitet werden.
|
|
Wird festgestellt, dass alle Tupel gelesen wurden,
|
|
erfolgt die weitere Abarbeitung der Listendefinition ab der ersten
|
|
Anweisung nach END ALL.
|
|
.LP
|
|
Die Konstruktion FOR ALL DO ... END ALL kann als Zyklus betrachtet
|
|
werden, der verlassen wird, wenn alle Tupel der Eingabedatei
|
|
verarbeitet wurden.
|
|
.LP
|
|
Der Zugriff auf die Werte eines Tupels wird durch das
|
|
Schl\o'u"'sselwort VALUE oder das
|
|
Schl\o'u"'sselzeichen # und die Nummer der Dom\o'a"'ne realisiert.
|
|
Sicherlich hat sich die vermeintliche Doppeldefinition
|
|
im Einf\o'u"'hrungsbeispiel etwas umst\o'a"'ndlich ausgenommen.
|
|
.DS I
|
|
define p_num = 1
|
|
.
|
|
.
|
|
define #p_num = integer 2
|
|
.DE
|
|
Das spart aber viel Arbeit, weil sie nicht unbedingt #p_num
|
|
schreiben m\o'u"'ssen,
|
|
um den Wert dieser Dom\o'a"'ne zu erreichen - es gen\o'u"'gt
|
|
auch #1. Sie haben zu entscheiden, ob die \o'U"'bersicht mit der
|
|
zweiten Variante noch gewahrt bleibt.
|
|
.LP
|
|
Der Reportgenerator f\o'u"'r \*(yy\ erm\o'o"'glicht nicht nur den
|
|
Zugriff zum aktuellen Tupel, sondern auch zum unmittelbar
|
|
vorhergehenden und nachfolgenden durch die
|
|
Schl\o'u"'sselw\o'o"'rter LAST und NEXT.
|
|
|
|
.ft B
|
|
Syntax
|
|
.ft R
|
|
.DS L
|
|
LAST number
|
|
NEXT number
|
|
.DE
|
|
.LP
|
|
LAST und NEXT k\o'o"'nnen \o'u"'berall dort verwendet werden, wo auch
|
|
# m\o'o"'glich ist. Das heisst, dass gleichzeitig drei Tupel
|
|
ausgewertet werden k\o'o"'nnen und erm\o'o"'glicht beispielsweise die
|
|
Ausgabe von drei Tupeln nebeneinander \o'u"'ber mehrere Zeilen.
|
|
.LP
|
|
Wird mit number auf ein Attribut zugegriffen, das im Tupel gar
|
|
nicht existiert, wird eine Warnung auf dem Bedienterminal
|
|
ausgegeben und die Dom\o'a"'ne 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.
|
|
.LP
|
|
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 verschl\o'u"'sselt.
|
|
.LP
|
|
Bevor wir mit der Theorie fortfahren, versuchen wir ein etwas
|
|
umfangreicheres Beispiel, das zwar teilweise ein Vorgriff auf
|
|
Kommendes ist - im Wesentlichen aber Bekanntes benutzt.
|
|
Sie kopieren die Relation "personal" aus "demo" zu "perskomp"
|
|
auf folgende Form:
|
|
.DS L
|
|
|
|
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|
|
|
|---------------------------------------------------------------|
|
|
.DE
|
|
.LP
|
|
Mit
|
|
.ft B
|
|
copy perscomp()
|
|
.ft R
|
|
.ft B
|
|
into "mnt\/work\/text\/komp.f"
|
|
.ft R
|
|
erstellen sie das Tupelfile und
|
|
anschliessend das Deskription-File.
|
|
Das Programm
|
|
.ft B
|
|
kompl_p
|
|
.ft R
|
|
soll eine stark vereinfachte FZR-Beitrags\o'u"'bersicht
|
|
erstellen:
|
|
.LP
|
|
.nf
|
|
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 \en
|
|
'VEB Generatorwerke'
|
|
\e50 date \en
|
|
'1234 Berlin'
|
|
\e50 time \en
|
|
'Beispielstr. 13'
|
|
\e28 'Seite: ' integer page \en
|
|
'-' 60 \en2
|
|
if ! page == 1 then
|
|
\e20 'Liste der Abteilung ' integer #d_abt
|
|
end if
|
|
\en2
|
|
end
|
|
|
|
on pageend do
|
|
if ! ^last_page then
|
|
set $next_page = page + 1
|
|
\e36 'Es folgt Seite: ' integer $next_page
|
|
end if
|
|
\en
|
|
'-' 60 \en3
|
|
end
|
|
|
|
on lineend do call p_pgw end
|
|
on linebegin do call p_pgw end
|
|
|
|
on batchline do
|
|
\e18
|
|
if #d_pkz from 7 to 7 == '4'
|
|
then 'maennl'
|
|
else 'weibl'
|
|
end if
|
|
end
|
|
|
|
set line = 10
|
|
\e\e20 '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
|
|
' ****' \en2
|
|
'Name'
|
|
\e15 'Qualifikation'
|
|
\e32 'Geb.-Datum'
|
|
\e45 'Lohn'
|
|
\e55 'FZR' \en
|
|
\e15 'maennl/weibl' \en2
|
|
end if
|
|
|
|
set $fzr = #d_lohn
|
|
call p_fzr
|
|
char batch 10 @20 #d_name
|
|
\e18 char #d_qual
|
|
\e33 char to 2 #d_pkz '.'
|
|
char from 3 to 4 #d_pkz '.'
|
|
char from 5 to 6 #d_pkz
|
|
\e44 integer @4 #d_lohn ',-M'
|
|
\e54 integer @3 $fzr ',-M' \en
|
|
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
|
|
\e28 'Durchschnitt: '
|
|
\e44 integer @4 $grp_lohn ',-M'
|
|
\e54 integer @3 $grp_fzr ',-M' \en2
|
|
set $grp_lohn = 0
|
|
set $grp_fzr = 0
|
|
set $grp_cnt = 0
|
|
'-' 60 \en
|
|
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: '
|
|
\e44 integer @4 $abt_lohn ',-M'
|
|
\e54 integer @3 $abt_fzr ',-M' \en2
|
|
set $abt_lohn = 0
|
|
set $abt_fzr = 0
|
|
set $abt_cnt = 0
|
|
'=' 60 \en
|
|
end if
|
|
end one
|
|
end all
|
|
|
|
set ^last_page;
|
|
.fi
|
|
.LP
|
|
Als Ausgabeger\o'a"'t wurde ein Seriendrucker mit 48 Zeilen
|
|
Seitenl\o'a"'nge gew\o'a"'hlt, der softwareseitig
|
|
keinen Seitenvorschub realisieren kann (Ausgabe von Zeilenvorschub).
|
|
Da jeweils am Zeilenanfang und -ende mit 'I' gerahmt werden soll,
|
|
ist durch die Prozedur
|
|
.ft B
|
|
p_pgw
|
|
.ft R
|
|
die Abfrage nach den Zeilennummern 1..46 eingeordnet, um zu
|
|
verhindern, dass auf den Zeilen 47 und 48 (Seitenfalz)
|
|
ebenfalls ein 'I' erscheint. Bei Druckern (Paralleldrucker), die
|
|
diese Einschr\o'a"'nkung nicht kennen, kann die
|
|
Prozedur p_pgw entfallen.
|
|
.LP
|
|
Die Rolle von
|
|
.ft B
|
|
lines
|
|
.ft R
|
|
und
|
|
.ft B
|
|
all lines
|
|
.ft R
|
|
soll am Beispiel nocheinmal erkl\o'a"'rt werden.
|
|
Die Differenz zwischen beiden betr\o'a"'gt 12, also die
|
|
Summe der
|
|
.ft B
|
|
new lines,
|
|
.ft R
|
|
die f\o'u"'r die Abschnitte
|
|
.ft B
|
|
on pagebegin do
|
|
.ft R
|
|
und
|
|
.ft B
|
|
on pageend do
|
|
.ft R
|
|
verwendet wurden. Damit stehen f\o'u"'r den Informationsteil
|
|
tats\o'a"'chlich nur 36 Zeilen zur Verf\o'u"'gung. Bei einem Drucker
|
|
mit 72 Zeilen m\o'u"'ssten entsprechend f\o'u"'r
|
|
.ft B
|
|
lines
|
|
.ft R
|
|
60 Zeilen und
|
|
.ft B
|
|
all lines
|
|
.ft R
|
|
72 Zeilen geschrieben werden.
|
|
Falls sie sich hierbei verz\o'a"'hlen,
|
|
erhalten sie in der Regel unbrauchbare
|
|
Seitenformatierungen.
|
|
Bevor weitere Erl\o'a"'uterungen folgen, einige
|
|
Ausz\o'u"'ge aus dem tats\o'a"'chlichen Druckbild:
|
|
.DS L
|
|
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
|
|
|
|
|
|
.DE
|
|
.DS L
|
|
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
|
|
|
|
.DE
|
|
.DS L
|
|
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
|
|
|
|
|
|
.DE
|
|
.LP
|
|
Sofern sie die Liste auf einem Paralleldrucker
|
|
mit einer Seitenl\o'a"'nge von 66 Zeilen ausgeben wollen,
|
|
kann die Prozedur p_pgw, wie ereits erw\o'a"'hnt,
|
|
weggelassen werden. Die Kopfinformationen
|
|
sehen dann so aus:
|
|
.DS L
|
|
/* page layout */
|
|
columns 60
|
|
lines 56
|
|
all lines 66
|
|
big
|
|
.DE
|
|
Die Behandlung des Seitenendes muss entsprechend obiger Definition
|
|
auf
|
|
.DS L
|
|
on pageend do
|
|
if ! ^last_page then
|
|
set $next_page = page + 1
|
|
\e36 'Es folgt Seite: ' integer $next_page
|
|
end if
|
|
'-' 60 \en
|
|
end
|
|
.DE
|
|
ge\o'a"'ndert werden und die Zeilenende und -anfangsbehandlung
|
|
sieht jetzt so aus:
|
|
.DS L
|
|
on lineend do 'I' end
|
|
on linebegin do 'I' end
|
|
.DE
|
|
.LP
|
|
Falls sie in der Zeile
|
|
.DS L
|
|
char batch 10 @20 #d_name
|
|
.DE
|
|
die L\o'a"'ngenangabe @20 vergessen, werden in der 2. Zeile exakt
|
|
soviele Zeichen nicht ausgegeben, wie in der 1. gespart wurden.
|
|
Es steht dann beispielsweise:
|
|
.DS L
|
|
Thoms,
|
|
R
|
|
Schmidt,
|
|
Petr
|
|
.DE
|
|
.NH 3
|
|
.ft B
|
|
Systemvariable
|
|
.ft R
|
|
.LP
|
|
Systemvariable werden automatisch dem Nutzer zur Verf\o'u"'gung
|
|
gestellt. Sie besitzen einen definierten Anfangswert und k\o'o"'nnen
|
|
durch den Nutzer beliebige Werte zugewiesen bekommen.
|
|
.LP
|
|
Die Variablen haben folgende Bedeutung:
|
|
.LP
|
|
.ft B
|
|
PAGE
|
|
.ft R
|
|
.IP
|
|
Nummer der aktuellen Seite
|
|
.br
|
|
Mit 1 beginnend, wird bei jedem Vorschub auf eine
|
|
neue Seite der Wert PAGE um eins erh\o'o"'ht. PAGE kann
|
|
vom Nutzer ein beliebiger Wert zwischen 0 und 32767
|
|
zugewiesen werden.
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
TUPLE
|
|
.ft R
|
|
.IP
|
|
Nummer des aktuellen Tupels
|
|
.br
|
|
Mit 1 beginnend, wird bei jedem Einlesen eines neuen
|
|
Tupels dieser Wert um eins erh\o'o"'ht. TUPLE kann vom
|
|
Nutzer ein beliebiger Wert zwischen 0 und 32767
|
|
zugewiesen werden.
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
LINE
|
|
.ft R
|
|
.IP
|
|
aktuelle Zeilennummer auf der Seite
|
|
.br
|
|
Ist LINE das Ziel einer Wertzuweisung, wird nicht nur
|
|
die neue Zeilennummer in LINE eingetragen, sondern
|
|
tats\o'a"'chlich auch die angegebene Zeile der Seite
|
|
positioniert.
|
|
Ist die aktuelle Zeilennummer bereits gr\o'o"'sser oder
|
|
gleich der berechneten, erfolgt automatisch der
|
|
Vorschub auf eine neue Seite und danach die
|
|
Positionierung auf die gew\o'u"'nschte Zeile.
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
COLUMN
|
|
.ft R
|
|
.IP
|
|
aktuelle Schreibposition (Spalte, mit 1 beginnend) in
|
|
der Zeile
|
|
.br
|
|
Ist COLUMN Ziel einer Wertzuweisung, wird der
|
|
gew\o'u"'nschte Wert in COLUMN eingetragen und auf die
|
|
Spalte positioniert.
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
VAR
|
|
.ft R
|
|
.IP
|
|
allgemeine Variable
|
|
.br
|
|
Dem Nutzer stehen 126 Variable (VAR0 - VAR125) zur freien Verf\o'u"'gung
|
|
Der Nummer kann mit
|
|
.ft B
|
|
define
|
|
.ft R
|
|
ein entsprechender Name zugeordnet werden.
|
|
Sie werden im Gegensatz zu Dom\o'a"'nenwerten (#)
|
|
mit $NAME oder $number (mit 0 beginnend) gerufen.
|
|
Den verf\o'u"'gbaren Variablen k\o'o"'nnen
|
|
Integer- und Realwerte zugewiesen werden.
|
|
Am Anfang sind alle Variablen mit dem Wert 0
|
|
initialisiert.
|
|
.br
|
|
Die allgemeinen Variablen sollten nicht mit den
|
|
Boolschen Variablen verwechselt werden,
|
|
hier sind ebenfalls 126 Variable verf\o'u"'gbar,
|
|
die den Wert TRUE oder FALSE annehmen k\o'o"'nnen
|
|
(s. Abschnitt "Boolsche Variable").
|
|
.LP
|
|
Alle Systemvariablen beinhalten numerische Werte und k\o'o"'nnen als
|
|
solche in die Liste eingetragen werden.
|
|
.LP
|
|
Zeichenkettenvariablen gibt es im Reportgenerator
|
|
nicht.
|
|
.NH 3
|
|
.ft B
|
|
Systemkonstante, Datum, Uhrzeit
|
|
.ft R
|
|
.LP
|
|
Die Systemkonstanten werden dem Nutzer f\o'u"'r die Ausgabe und
|
|
Verwendung in arithmetischen Ausdr\o'u"'cken zur Verf\o'u"'gung gestellt.
|
|
Sie k\o'o"'nnen nicht Ziel einer Wertzuweisung sein:
|
|
.DS L
|
|
|
|
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).
|
|
.DE
|
|
Die Konstanten werden beim Start des Report-Generators neu aus der Systemzeit
|
|
des Rechners ermittelt.
|
|
.LP
|
|
Der Reportgenerator f\o'u"'r \*(yy\ stellt zwei spezielle
|
|
Funktionen f\o'u"'r die Ausgabe von Datum und Uhrzeit zur Verf\o'u"'gung:
|
|
.DS I
|
|
|
|
DATE in der Form tt-mmm-jj
|
|
TIME in der Form hh:mm:ss.
|
|
.DE
|
|
|
|
.ft B
|
|
Beispiel
|
|
.ft R
|
|
.DS I
|
|
'DATUM UND UHRZEIT:' date ' ' time
|
|
.DE
|
|
erzeugt den Text
|
|
.DS I
|
|
DATUM UND UHRZEIT: 27-JAN-86 11:13:25
|
|
.DE
|
|
.NH 3
|
|
.ft B
|
|
Ausgabe von numerischen Werten
|
|
.ft R
|
|
.LP
|
|
In diesem Abschnitt werden die Ausgabem\o'o"'glichkeiten von
|
|
numerischen Werten vorgestellt. Daf\o'u"'r stehen die drei Funktionen
|
|
.DS I
|
|
- INTEGER
|
|
- REAL
|
|
- GRAPHIC
|
|
.DE
|
|
zur Verf\o'u"'gung. Welche numerische Wertart die auszugebenden Werte
|
|
intern besitzen, ist f\o'u"'r die Funktionen ohne Bedeutung. Welcher
|
|
Wert ausgegeben werden soll, wird unmittelbar hinter der Funktion
|
|
angegeben.
|
|
.LP
|
|
Der erste Parameter dieser Funktionen ist die
|
|
.ft B
|
|
laenge .
|
|
.ft R
|
|
.DS I
|
|
[LENGTH number]
|
|
oder
|
|
[@number]
|
|
.DE
|
|
"laenge" legt die Anzahl der Zeichen fest, die f\o'u"'r die Ausgabe
|
|
des Wertes in der Listenzeile zur Verf\o'u"'gung gestellt werden.
|
|
Diese Anzahl kann den Funktionen mit Angabe von Number
|
|
vorgegeben werden.
|
|
Die Zahlen werden dann rechtsb\o'u"'ndig in den
|
|
bereitgestellten Platz eingetragen. Fehlt die L\o'a"'ngenangabe, wird genau
|
|
so viel Platz in der Zeile beansprucht, wie f\o'u"'r die Darstellung
|
|
des Wertes notwendig ist. Die Zahl wird also linksb\o'u"'ndig ab der
|
|
aktuellen Schreibposition eingetragen. Die n\o'a"'chste Ausgabe
|
|
erfolgt dann unmittelbar hinter dem Wert.
|
|
.NH 4
|
|
.ft B
|
|
Ausgabe als Integer-Zahl
|
|
.ft R
|
|
.LP
|
|
Die Darstellung eines Wertes erfolgt als ganze Zahl.
|
|
.DS L
|
|
_ _
|
|
| |
|
|
INTEGER laenge | SCALE real | num daten
|
|
| PIC zeichenkette |
|
|
~ ~
|
|
|
|
.DE
|
|
Wahlweise kann ein Skalierungsfaktor und eine
|
|
Druckaufbereitungsmaske spezifiziert werden.
|
|
.LP
|
|
Der Wert wird mit dem Skalierungsfaktor multipliziert. Damit
|
|
lassen sich bequem Massstabsver\o'a"'nderungen, Zinsberechnungen,
|
|
Prozentrechnungen u.a. realisieren. Der auszugebende Wert wird
|
|
eventuell gerundet.
|
|
|
|
.ft B
|
|
Beispiel
|
|
.ft R
|
|
.DS L
|
|
integer @18
|
|
scale 0.0325
|
|
pic 'ZINSEN: 00009.99 M'
|
|
#p_guthab
|
|
.DE
|
|
Hat #p_guthab den Wert 20000, wird in die Liste
|
|
eingetragen:
|
|
|
|
ZINSEN: 6.50 M
|
|
.LP
|
|
Die Symbole einer Druckaufbereitungsmaske PIC haben fest
|
|
zugeordnete Bedeutungen. Diese sind im einzelnen:
|
|
.IP <
|
|
linksb\o'u"'ndiges Eintragen der aufbereiteten Maske
|
|
in die verf\o'u"'gbare Spalte
|
|
.IP >
|
|
rechtsb\o'u"'ndiges Eintragen der aufbereiteten Maske
|
|
in die verf\o'u"'gbare Spalte
|
|
.IP =
|
|
zentriertes Eintragen der aufbereiteten Maske
|
|
in die verf\o'u"'gbare Spalte
|
|
.IP 9
|
|
Eintragen einer Ziffer
|
|
.IP 0
|
|
Eintragen einer Ziffer, falls es sich nicht um eine
|
|
Vornull handelt.
|
|
Bei Vornullen wird ein Leerzeichen bzw. das Vorzeichen
|
|
(falls gew\o'u"'nscht) eingetragen.
|
|
.IP +
|
|
unbedingte Darstellung des Vorzeichens unmittelbar vor
|
|
der ersten Ziffer;
|
|
.IP -
|
|
Darstellung nur des negativen Vorzeichens unmittelbar vor
|
|
der ersten Ziffer (Standard);
|
|
.RE
|
|
sonst unver\o'a"'nderte \o'U"'bernahme in das Ausgabebild.
|
|
Um die Symbole f\o'u"'r die Druckaufbereitung als normale Zeichen
|
|
verwenden zu k\o'o"'nnen, m\o'u"'ssen sie mit dem Zeichen '\e' kaschiert
|
|
(gesch\o'u"'tzt) werden. Das Zeichen '\\' ist durch die
|
|
Umschreibung '\\\\' verf\o'u"'gbar.
|
|
.LP
|
|
Die Symbole f\o'u"'r die Positionierung der
|
|
Druckaufbereitungsmaske k\o'o"'nnen an beliebiger Stelle stehen,
|
|
das zuletzt gegebene Symbol wird f\o'u"'r die
|
|
Druckaufbereitung verwendet, alle anderen werden "verschluckt".
|
|
.LP
|
|
Das Symbol f\o'u"'r das Vorzeichen kann an drei Stellen
|
|
angegeben werden:
|
|
.IP -
|
|
vor dem ersten '0'-Symbol
|
|
.br
|
|
Darstellung des Vorzeichens an dieser Position;
|
|
.IP -
|
|
vor dem ersten '9'-Symbol
|
|
.br
|
|
Darstellung des Vorzeichens unmittelbar vor der
|
|
ersten Ziffer;
|
|
.IP -
|
|
nach dem letzten '9'-Symbol
|
|
.br
|
|
Darstellung des Vorzeichens nach der letzten Ziffer
|
|
.LP
|
|
.ft B
|
|
Beachte:
|
|
.ft R
|
|
Das zuletzt verwendete Vorzeichensymbol wird f\o'u"'r die
|
|
Aufbereitung verwendet.
|
|
.NH 4
|
|
.ft B
|
|
Ausgabe als Real-Zahl
|
|
.ft R
|
|
.LP
|
|
Die Darstellung eines Wertes erfolgt als Gleitkommazahl.
|
|
.DS L
|
|
_ _
|
|
| |
|
|
| SCALE real |
|
|
| BEFORE number |
|
|
REAL laenge | POINT number | num daten
|
|
| NORM number |
|
|
| IGNORE |
|
|
| EXP zeichenkette |
|
|
~ ~
|
|
|
|
.DE
|
|
Die wahlweise anzugebenden Parameter haben folgende Bedeutung:
|
|
.LP
|
|
.ft B
|
|
SCALE real
|
|
.ft R
|
|
.IP
|
|
Der Attributwert wird vor der Aufbereitung mit
|
|
dem Skalierungsfaktor multipliziert.
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
BEFORE number
|
|
.ft R
|
|
.IP
|
|
Anzahl der Stellen vor dem Komma
|
|
.br
|
|
Standard: 0
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
POINT number
|
|
.ft R
|
|
.IP
|
|
Anzahl der Stellen nach dem Komma
|
|
.br
|
|
Die letzte Stelle ist gerundet.
|
|
.br
|
|
Standard: 6
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
NORM number
|
|
.ft R
|
|
.IP
|
|
Die Zahl soll mit einem bestimmten Exponenten
|
|
dargestellt werden. Beispielsweise wird bei
|
|
NORM 5 die Zahl mit dem Exponenten E+05
|
|
dargestellt. Der Parameter BEFORE wird dabei
|
|
unwirksam.
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
IGNORE
|
|
.ft R
|
|
.IP
|
|
Die Angabe des Exponenten soll unterdr\o'u"'ckt
|
|
werden. Der Parameter BEFORE wird dabei unwirksam.
|
|
Ist die Darstellung des Wertes ohne Exponenten
|
|
nicht m\o'o"'glich, gelten die anderen Parameter.
|
|
.RE
|
|
.sp 1
|
|
.ft B
|
|
EXP zeichenkette
|
|
.ft R
|
|
.IP
|
|
Es wird die Zeichenkette vor dem Exponentenwert
|
|
definiert.
|
|
.br
|
|
Standard: 'E'
|
|
.LP
|
|
.ft B
|
|
Beispiel
|
|
.ft R
|
|
.LP
|
|
Es sollen verschiedene Darstellungsm\o'o"'glichkeiten der Variablen $1
|
|
mit dem Wert 123.45 veranschaulicht werden:
|
|
.DS L
|
|
|
|
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
|
|
.DE
|
|
Die Darstellung nocheinmal zum besseren Vergleich:
|
|
.DS L
|
|
1) 0.123450E 03
|
|
2) 246.90 EXP 03
|
|
3) 246900.00
|
|
4) 12345.000000E-02
|
|
5) 0.1*10** 03
|
|
.DE
|
|
.NH 4
|
|
.ft B
|
|
Pseudographische Ausgabe
|
|
.ft R
|
|
.LP
|
|
Der Reportgenerator
|
|
erm\o'o"'glicht die einfache
|
|
Darstellung von Diagrammen.
|
|
.DS L
|
|
_ _
|
|
|_ _ _ _ |
|
|
|| | | | |
|
|
|| FROM | | VAR int| |
|
|
GRAPHIC laenge || TO | | real | | num daten
|
|
|~ ~ ~ ~ |
|
|
| WITH zeichenkette |
|
|
~ ~
|
|
.DE
|
|
.LP
|
|
Der durch die Grenzen FROM und TO definierte Wertebereich wird
|
|
auf den mit 'laenge' angegebenen Darstellungsbereich abgebildet.
|
|
Die Abbildung erfolgt mit dem bei WITH angegebenen Zeichen.
|
|
Ist FROM < TO erfolgt eine linksb\o'u"'ndige und
|
|
ist FROM > TO eine rechtsb\o'u"'ndige Darstellung der
|
|
Pseudografik in der Spalte.
|
|
.DS I
|
|
Standards: laenge = 50
|
|
FROM 0
|
|
TO 0
|
|
WITH '*'
|
|
.DE
|
|
.ft B
|
|
Beispiel
|
|
.ft R
|
|
.LP
|
|
Es soll das Attribut "menge" grafisch dargestellt werden. Vor der
|
|
grafischen Darstellung soll der Wert als Integer-Zahl ausgegeben
|
|
werden.
|
|
.DS L
|
|
for one do
|
|
integer @3 #menge
|
|
\e6
|
|
graphic @20 from 0 to 10 with '+' #menge
|
|
\en
|
|
end one
|
|
.DE
|
|
.DS L
|
|
Darstellung:
|
|
|
|
7 ++++++++++++++
|
|
3 ++++++
|
|
4 ++++++++
|
|
8 ++++++++++++++++
|
|
1 ++
|
|
0
|
|
11 ++++++++++++++++++++
|
|
.DE
|
|
.NH 3
|
|
.ft B
|
|
Ausgabe von Zeichenkettenwerten
|
|
.ft R
|
|
.LP
|
|
F\o'u"'r die Ausgabe von Zeichenkettenwerten steht die Funktion CHAR
|
|
zur Verf\o'u"'gung:
|
|
.DS L
|
|
|
|
_ _
|
|
| _ _ | _ _
|
|
| | FROM | | | LAST |
|
|
CHAR laenge | | TO | number| | VALUE | number
|
|
| | BATCH | | | NEXT |
|
|
~ ~ ~ ~ ~ ~
|
|
.DE
|
|
.LP
|
|
Ist die L\o'a"'nge angegeben, wird die Zeichenkette linksb\o'u"'ndig in
|
|
den bereitgestellten Platz eingetragen. Sollte die Zeichenkette
|
|
l\o'a"'nger sein, wird rechts abgeschnitten. Mit FROM und TO kann die
|
|
auszugebende Zeichenkette eingeschr\o'a"'nkt werden. Ist keine L\o'a"'nge
|
|
angegeben, wird die Zeichenkette in ihrer Originall\o'a"'nge
|
|
eingetragen. Die Tupelwerte d\o'u"'rfen nicht numerischer Wertart sein.
|
|
.LP
|
|
Die Zeichenketten k\o'o"'nnen mit der Funktion BATCH \o'u"'ber mehrere
|
|
Zeilen verteilt werden. Zu beachten ist, dass eine
|
|
L\o'a"'ngenangabe nicht die L\o'a"'nge der auszugebenden Zeichenkette
|
|
bestimmt, sondern den bereitgestellten Platz in der Liste. Dieser
|
|
Unterschied existiert, da die Zeichenketten \o'u"'berwiegend in
|
|
ganzen Worten ausgegeben werden und dadurch Platz verloren geht. Mit
|
|
CHAR 110 BATCH 20 werden zum Beispiel genau 5 Zeilen zu 20 und
|
|
eine Zeile mit 10 Zeichen gef\o'u"'llt, unabh\o'a"'ngig davon, wie lang
|
|
die Zeichenkette ist.
|
|
.LP
|
|
.ft B
|
|
Beispiel
|
|
.ft R
|
|
.DS L
|
|
char from 3 #text
|
|
\en
|
|
char from 5 to 12 #text
|
|
.DE
|
|
Hat #text die Zeichenkette
|
|
|
|
'PLATSCH BATCH',
|
|
|
|
erzeugen die Anweisungen die Zeichenketten
|
|
|
|
ATSCH BATCH
|
|
SCH BATC
|
|
|