     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 XLYK 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 13L11K   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
