.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