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