Allgemeines Statistik System

Benutzerhandbuch

ASS - DataWarehouse

aDokumentationsübersicht

                  AA              SSSSSS          SSSSSS
                 AAAA           SS      SS      SS      SS
                AA  AA         SS              SS
               AA    AA         SS              SS
              AAAAAAAAAA         SSSSSSS         SSSSSSS
             AA        AA              SS              SS
            AA          AA              SS              SS
           AA            AA    SS      SS      SS      SS
          AAAA          AAAA     SSSSSS          SSSSSS

                         ASS - DataWareHouse
                         -------------------

   Bürger

Inhaltsverzeichnis


1 Einführung

pInhaltsverzeichnis
nStichwortverzeichnis

   Mit dem ASS Data-Warehouse steht eine Komponente zur
   Verfügung, die als Erweiterung zum bisherigen ASS zu
   verstehen ist.


   Gegenüber dem bisherigen Einsatz erlaubt diese
   Systemerweiterung insbesondere
   - eine Speicherung von ASS-Daten in offenem Speicherformat
     (SQL) und
   - die Versorgung von ASS-Arbeitsgebieten mittels
     einer eigenen Abfragesprache (Ableitungen), wodurch die
     Programmierung herkömmlicher Schnittstellen vollständig
     ersetzt werden kann.

i

   Abbildung 1:   ASS-Data-Warehouse-Konzept

   Zur direkten Übernahme von Daten aus operativen Systemen
   in das ASS Data-Warehouse müssen diese Daten in einer
   standardisierten Form vorliegen.

   Andernfalls müssen diese Daten mittels Schnittstellen-
   programmierung in diese geeignete Form überführt werden.


   Im ASS-Sprachgebrauch stehen somit sogenannte Basis-
   Arbeitsgebiete zur Verfügung, aus denen mittels
   Ableitungen entweder herkömmliche ASS-Arbeitsgebiete in
   komprimierter Form oder Tabellen mit offener
   Speicherungsform gebildet werden können.

   Ein abgeleitetes Arbeitsgebiet wird aus n Arbeitsgebieten
   versorgt. Daraus resultieren n Ableitungen, die jeweils
   Aktualisierungen ( Differenzen, Deltas ) in das abgeleitete
   Zielarbeitsgebiet einarbeiten.

   Voraussetzung für komplexe Ableitungsregeln ist die
   Vollständigkeit bezüglich der Historie, die insbesondere
   für die Generierung von Bestandswerten in Bewegungsform
   benötigt wird.


2 Beschreibung von Basisarbeitsgebieten

pInhaltsverzeichnis
nStichwortverzeichnis

   Zur Beschreibung der Basisarbeitsgebiete wurde der Dialog
   "ST06" (Verwaltung der ASS-Metadaten) erweitert.



   Art des Arbeitsgebietes

   Bislang sind Basisarbeitsgebiete in folgender Form
   möglich:
              - DB2-Tabellen
              - sequentielle Dateien
              - sequentielle Dateien (CSV: Semikolon separiert)

   Die Datensätze werden offen gespeichert und haben alle den
   gleichen Aufbau.

i

   Abbildung 2:  Beschreibung Basisarbeitsgebiet

   Schlüssel des Basisarbeitsgebietes

   Die zu einem Basisarbeitsgebiet gehörenden Felder werden
   mit ihren Attributen (Format, Länge, Offset, Anzahl
   Kommastellen) definiert.
   Bei einem CSV-Arbeitsgebiet gilt:
     Die Feldnr definiert die Spaltennummer,
     der Offset gibt den Offset innerhalb der Spalte an,
     Länge gibt die maximale Feldlänge an.

i

   Abbildung 3:  Schlüssel des Basisarbeitsgebietes

   Folgende Formate werden derzeit unterstützt:


   char             C    maximal 50 Bytes
   binär            B    maximal 4 Bytes
   dezimal gepackt  P    maximal 8 Bytes (15 Dezimalstellen),
                         Festlegung der Anzahl von Kommastellen
   timestamp        TS   DB2-Format, fixe Länge 26 Bytes
   time             T    DB2-Format, fixe Länge 8 Bytes
   date             D    DB2-Format, fixe Länge 10 Bytes

   Die DB2-Formate werden intern wie das Char-Format
   behandelt. Beim Abspeichern müssen die Inhalte den
   entsprechenden DB2-Konventionen genügen.


   Durch Anhängen von Postfix-Z in der Eingabemaske (z.B. CZ)
   wird das entsprechende Feld als Zeitstempel ausgewiesen.

i

   Abbildung 4:  Attribute von Schlüsseln des
                 Basisarbeitsgebietes


   Bei DB2-Tabellen kann gewöhnlich auf die Beschreibung der
   Felder verzichtet werden. Die hierfür nötigen
   Informationen (Feldname, Feldformat, Feldlänge) werden in
   diesem Fall aus dem IBM-Systemkatalog ermittelt. Das
   Arbeitsgebiet selbst (Tabellenname, Art des Arbeitsgebiet)
   muss jedoch auch in diesem Fall in der ST06 bekanntgegeben
   werden.

   Soll ein Feld der Tabelle als Zeitstempel verwendet
   werden, so ist genau dieses Feld anzugeben. Die
   entsprechende Eigenschaft wird auf die gelesenen Angaben
   des Systemkatalogs gehoben.


   Hinweis: Existieren Feldbeschreibungen in der ST06, so
            gelten diese (abgesehen von obiger Ausnahme). Es wird
            dann nicht auf den Systemkatalog zugegriffen.


3 Definition von Ableitungsregeln

pInhaltsverzeichnis
nStichwortverzeichnis

3.1 Grundideen der Funktionsweise

pInhaltsverzeichnis
nStichwortverzeichnis

   - Aufbau von Schnittstellensätzen durch sukzessives Besetzen
     von Feldern. Bei ASS-Ziel-Arbeitsgebieten ist das Resultat
     eine kurze Schnittstelle mit Bewegungssätzen.

   - Eine Ableitungsregel wird unterteilt in einzelne
     Anreicherungsschritte (SELECT / JOIN).

   - Jede Ableitungsregel beginnt mit einem Select-Step optional
     gefolgt von einem oder mehreren (weiteren) Select- oder
     Join-Steps.

   - Durch den ersten Select-Step wird aus einem Arbeitsgebiet heraus
     eine zu verarbeitende Grundmenge festgelegt.

   - In jedem Join-Step werden die bis zu diesem Zeitpunkt
     ermittelten Daten um die Informationen genau eines
     Arbeitsgebietes ergänzt. Diese Datenmanipulation
     resultiert in
     - Besetzen von Feldern
     - Hinzufügen oder Weglassen von Sätzen

   - Durch die zwischenzeitlichen Select-Steps können die zu diesem
     Zeitpunkt ermittelten Daten (Select auf den aktuellen Zustand
     des Zielarbeitsgebietes) modifiziert und gefiltert werden.

i

   Abbildung: Kunde / Vertrag

   Beispiel:
   - AG  Kunde
     mit Feldern Kundennummer, Adresse, Änderungsdatum

   - AG  Vertrag
     mit Feldern Kundennummer, Vertragsnummer, Bearbeitungsdatum

   - AG  Kunde_Vertrag
     mit Feldern Kundennummer, Adresse, Vertragsnummer

       ASS;

         ZIELAG     = KUNDE_VERTRAG;
         ABLEITUNG  = ABL_KUNDE_VERTRAG;

         SELECT (AG = KUNDE),
           KUNDENNUMMER   = KUNDENNUMMER,
           ADRESSE        = ADRESSE;

         JOIN (AG = VERTRAG),
           JOINKRITERIUM  = (
             ZIELFELDER   = (KUNDENNUMMER),
             JOINFELDER   = (KUNDENNUMMER),
             SORT (BEARBEITUNGSDATUM ASC),
             DUP = LAST      ),

           VERTRAGSNUMMER = VERTRAGSNUMMER;
       END;

3.2 Interne Verarbeitungsweise

pInhaltsverzeichnis
nStichwortverzeichnis

 --> Aufgrund der zu besetzenden Felder des Zielarbeitsgebietes
     wird für die Verarbeitung ein (maximales) Satzformat
     festgelegt. Dieses ändert sich während der gesamten
     Ableitungsregel nicht. Neben den Feldern des
     Zielarbeitsgebietes können dort auch Hilfsfelder (lokal
     für die Ableitungsregel definiert) enthalten sein.

 --> Bilden einer Grundmenge (WORK1) der zu verarbeitenden Daten
     aufgrund des angegebenen SELECT. Dabei Besetzen von Feldern
     / Hilfsfeldern.

 --> Sortieren der Sätze der WORK1 nach Joinkriterium
     Selektieren und Sortieren der Sätze des Join-
     Arbeitsgebietes. Dieser Schritt kann u. U. entfallen.

 --> P r o  Satz der WORK1 Bilden einer Joinmenge (WORK3). Alle
     Sätze dieser Datei erfüllen das Joinkriterium und
     gegebenenfalls angegebene Filterbedingungen. Das Resultat
     kann in Abhängigkeit von der Duplikatsbedingung (first,
     last, all)
     - eine leere Datei
     - ein Satz
     - mehrere Sätze
     sein.

 --> Durchführen der im JOIN angegebenen Feldzuweisungen.
     Aufgrund der WORK3 kann der aktuelle WORK1-Satz wegfallen
     oder vervielfältigt werden. Für den Fall der leeren Menge
     wurde daher eine feldspezifische Behandlung geschaffen.

 --> Alle im Zielarbeitsgebiet definierten Felder müssen durch
     die Ableitungsregel versorgt werden und dementsprechend
     angegeben werden. Einzige Ausnahme ist das Zeitstempel-
     Feld, welches nicht angegeben werden darf, da es durch die
     Ableitungsregel automatisch versorgt wird (Deltas).

 --> Schaukeltechnik bei Verwendung mehrerer JOINs

 --> Diverse Cache-Techniken zur Erhöhung der Performance

3.3 Filterbedingungen

pInhaltsverzeichnis
nStichwortverzeichnis

   Einschränkung auf die relevanten Sätze sowohl bei der
   Bildung der Grundmenge (Select) als auch der Join-Mengen.

       ASS;

         ZIELAG      = KUNDE_VERTRAG;
         ABLEITUNG   = ABL_KUNDE_VERTRAG;

         SELECT (AG = KUNDE)
           WHERE (    KUNDENNUMMER = '4711'
                   !  KUNDENNUMMER = '4712'),
           KUNDENNUMMER   = KUNDENNUMMER,
           ADRESSE     = ADRESSE;

         JOIN (AG = VERTRAG),
           JOINKRITERIUM =    (
             ZIELFELDER = (KUNDENNUMMER),
             JOINFELDER = (KUNDENNUMMER),
             SORT (BEARBEITUNGSDATUM ASC),
             DUP = LAST        ),
           VERTRAGSNUMMER = VERTRAGSNUMMER;

       END;

   Allgemein umfasst die WHERE-Bedingung im Select-Step
   Sortier- und Filterkriterien:

     SELECT (AG = arbeitsgebietsbezeichnung)
       WHERE (  bedingung1,
           SORT (  FELD1 ASC oder DESC,
                     ...
                   FELDk ASC oder DESC),
           LAST (  FELD1 , ..., FELDl)
                 ...
           bedingungr,
           SORT (  FELD1 ASC oder DESC,
                     ...
                   FELDk ASC oder DESC),
           LAST (  FELD1 , ..., FELDl)
           )

   Die aus dem angegebenen Arbeitsgebiet zu betrachtenden
   Sätze werden in maximal 5 Teilschritten jeweils durch eine
   Bedingung gefiltert, sortiert und anschließend bezüglich
   des unter LAST angegebenen Gruppenwechselbegriffs nochmals
   gefiltert. Dabei können gegebenenfalls Teilangaben fehlen.

   Beispiel für die Funktionsweise einer LAST-Angabe
            auf einer sortierten Datei:

                     Satznummer  Kundennummer
                       1           4711
                       2           4711
                       3           4712
                       4           4713
                       5           4713

   Die Angabe LAST (Kundennummer) bewirkt die Ausgabe der
   Sätze mit den Satznummern 2, 3 und 5.

   Um das Bilden von Join-Mengen beschreiben zu können, sind
   im allgemeinen komplexe Bedingungen erforderlich. Die
   Ableitungsregel unterscheidet drei Arten von Filtern:

   -  Globale Joinbedingung auf alle Sätze des Join-
      Arbeitsgebietes, z.B. nur alle Sätze mit einem bestimmten
      Bearbeitungsdatum. Es dürfen nur Felder aus dem aktuellen
      Join-Arbeitsgebiet angesprochen werden. Aus
      Performancegründen sollten globale Joinbedingungen, d.h.
      genauer Bedingungen, deren Operanden sich
      ausschließlich auf das Join-Arbeitsgebiet beziehen, als
      solche auch formuliert werden. Dadurch werden nicht zu
      verarbeitende Sätze schnell gefiltert und fließen nicht
      in eine komplexe Folgeverarbeitung ein.

   -  Joinkriterium mit Angabe von JOINFELDER und ZIELFELDER.
      Feldangaben müssen aus dem entsprechenden Arbeitsgebiet
      bzw. aus den bereits besetzen Zielfeldangaben stammen.
      Werden mehrere Felder angegeben, so werden die zugehörigen
      aktuellen Inhalte konkateniert:
      Beispiel:
              JOINKRITERIUM =    (
                ZIELFELDER = (VSNR),
                JOINFELDER = (VSNR1 !! VSNR2),
                SORT (BEARBEITUNGSDATUM ASC),
                DUP = LAST    )

   -  Filter, der vom aktuellen WORK1-Satz abhängt. Hierbei
      Mehrfachverarbeitung mit Ermittlung des letzten Satzes
      bezüglich eines Gruppenwechselbegriffs möglich. Beispiel:
      Beim JOIN sollen nur alle aktiven Verträge zu einem Kunden
      berücksichtigt werden (siehe oben).

   Beispiel:

       ASS;

         ZIELAG      = KUNDE_VERTRAG;
         ABLEITUNG   = ABL_KUNDE_VERTRAG;

         SELECT (AG = KUNDE),
         KUNDENNUMMER  = KUNDENNUMMER,
         ADRESSE       = ADRESSE,
         AENDERUNGSDATUM (FORMAT=CHAR, LAENGE=6)
                       = AENDERUNGSDATUM;

         JOIN (AG = VERTRAG)
              WHERE (BEARBEITUNGSDATUM > '199801'),
                  JOINKRITERIUM  =  (
                      ZIELFELDER =  (KUNDENNUMMER),
                      JOINFELDER =  (KUNDENNUMMER),
                      SORT (BEARBEITUNGSDATUM ASC),
                      DUP = LAST
                      WHERE   (AENDERUNGSDATUM >=
                               BEARBEITUNGSDATUM)),

         VERTRAGSNUMMER = VERTRAGSNUMMER;

       END;

3.4 Allgemeine Syntax des Joinkriteriums

pInhaltsverzeichnis
nStichwortverzeichnis

   JOINKRITERIUM =(
     ZIELFELDER   =   (FELD1 !! FELD2 !! ... !! FELDn),
     JOINFELDER   =   (FELD1 !! FELD2 !! ... !! FELDm),
     SORT (  FELD1 ASC oder DESC,
               ...
             FELDj ASC oder DESC),
     DUP = FIRST oder LAST oder ALL
     WHERE (  bedingung1,
             SORT (  FELD1 ASC oder DESC,
                         ...
                     FELDk ASC oder DESC)
             LAST (  FELD1 , ..., FELDl)
                         ...
              bedingungr,
             SORT (  FELD1 ASC oder DESC,
                         ...
                     FELDk ASC oder DESC)
             LAST (  FELD1 , ..., FELDl)
            ),
     LEERE_MENGE = LOESCHEN)

   Die Angabe von LEERE_MENGE ist optional.

3.5 Besonderheiten bei DB2-Tabellen

pInhaltsverzeichnis
nStichwortverzeichnis

   JOIN (  AG = VERTRAG,
           DATABASE = TEST,
           LESART = DIREKT)

   In den Fällen, wo die Grundmenge im Vergleich zur Join-Tabelle
   klein ist, kann bei DB2-Tabellen im JOIN die Angabe LESART = DIREKT
   gemacht werden.

   Unter DB2 ist die allgemeine Form eines Tabellennamens
          CREATOR.LOCATION.TBNAME
   wobei CREATOR und LOCATION fehlen können. Werden diese Angaben
   zur genauen Qualifizierung im DB2-System benötigt, so können
   diese in der Ableitungsregeln unter DATABASE erfolgen.

   Die Struktur einer DB2-Tabelle kann ASS auf zwei Weisen übergeben
   werden. Entweder erfolgt in der ST06 eine Beschreibung der Struktur
   analog zu sequentiellen Dateien, wobei wiederum nur die Felder
   angegeben werden müssen, die in der Ableitungsregel angesprochen
   werden, oder ASS ermittelt diese Struktur aus dem Systemkatalog.
   In diesem Fall ist in der ST06 nur das Arbeitsgebiet an sich zu
   deklarieren (ohne Angabe von Feldern).

   Gibt man anstelle einer (globalen) WHERE-Bedingung diese Bedingung
   unter SQLWHERE an, so wird diese Bedingung direkt an DB2
   weitergereicht. Achtung: die Formulierung unterliegt der SQL-Syntax.
   Es erfolgen keinerlei Prüfungen.

   Beispiel:

       ASS;

         ZIELAG      = KUNDE_VERTRAG;
         ABLEITUNG   = ABL_KUNDE_VERTRAG;

         SELECT (AG = KUNDE)
           SQLWHERE (    BEARBEITUNGSDATUM > '199801'
                     AND BEARBEITUNGSDATUM < '200012'),
              KUNDENNUMMER  = KUNDENNUMMER,
              ADRESSE       = ADRESSE,
              AENDERUNGSDATUM (FORMAT=CHAR, LAENGE=6)
                       = AENDERUNGSDATUM;

                        .
                        .
                        .

       END;

3.6 Option NOSORT für sortierte JOIN-Dateien

pInhaltsverzeichnis
nStichwortverzeichnis

   In der Praxis kommt es vor, dass eine Join-Datei bereits nach
   dem gewünschten Join-Kriterium sortiert vorliegt, der interne
   Sort mithin überflüssig ist. Gleiches gilt für den aktuellen
   Stand der Grundmenge. Dieses führt bei großen Datenvolumina
   zu unnötigen Performance-Verlusten. Daher ist es möglich,
   durch entsprechende Angaben in der Ableitungsregel, die interne
   Sortierung nach dem Join-Kriterium zu unterbinden.

   JOIN (  AG = arbeitgebietsbezeichnung,
           NOSORT = nn)

   wobei für nn die folgenden Angaben möglich sind:

        JOIN -> die Join-Datei wird nicht sortiert
        ZIEL -> die aktuelle Grundmenge wird nicht sortiert
        ALL  -> beide Dateien werden nicht sortiert

3.7 Bedingungen innerhalb von SELECT und JOIN

pInhaltsverzeichnis
nStichwortverzeichnis

   Für die Operanden in Bedingungen gilt das gleiche wie
   später für die Operanden in Formeln und Funktionen von
   Feldzuweisungen:

   -  Innerhalb eines Steps darf auf alle bis zu diesem Zeitpunkt
      bekannten Informationen Bezug genommen werden, d.h. alle
      bekannten Felder / Hilfsfelder dürfen angesprochen werden.
      Bei Nichteindeutigkeit von Namen ist die Syntax
      FELD (AG = ZIEL) bzw. FELD (AG = SELECT) bzw.
      FELD (AG = JOIN)  zu verwenden.

   -  Gegebenenfalls ist bei einzelnen Operanden eine
      Typumwandlung vorzunehmen.

3.8 Feldzuweisungen

pInhaltsverzeichnis
nStichwortverzeichnis

   -  Feldbesetzungen ergeben sich allgemein aus Formeln. Als
      Operanden dürfen alle bis zu diesem Zeitpunkt ermittelten
      Felder des Zielarbeitsgebietes und Hilfsfelder, sowie alle
      Felder des aktuellen Join-Arbeitsgebietes verwendet werden.
      Bei Nichteindeutigkeit von Feldbezeichnungen ist Angabe
      einer AG-Anweisung erforderlich.

   -  Die Zuweisung kann in Abhängigkeit von Bedingungen (IF /
      ELSE) erfolgen. Die Bedingungen sind dabei logische
      Ausdrücke. Es werden zwei Arten von Bedingungen
      unterschieden: duplizierend / nicht duplizierend
      (nur einmal pro JOIN).

          IF      bedingung THEN  zuweisung
          ELSEIF  bedingung THEN  zuweisung
                                  ...
          ELSEIF  bedingung THEN  zuweisung
          OTHER                   zuweisung
          ENDIF

          oder

          IF      bedingung THEN  zuweisung
          IF      bedingung THEN  zuweisung
                                ...
          IF      bedingung THEN  zuweisung
          OTHER                   zuweisung
          ENDIF


   -  Anbindung von User-Exits (Individualprogrammierung)
        Feld = Funktion (opcode, operand, ..., operand)
        Feld = Mengenfunktion (opcode, operand, ..., operand)
        Feld = Satzfunktion (opcode, operand, ..., operand)


   -  Mengenfunktionen operieren auf der gesamten WORK3
      (Anzahl, Summe, Minimum, Maximum)

   -  Satzfunktionen liefern zu den aktuellen Eingabedaten in
      Abhängigkeit vom Aufruf unterschiedliche Werte zurück:
      Aufteilen von Jahresbeitrag auf einzelne Monate.

3.9 Syntax der Feldzuweisung

pInhaltsverzeichnis
nStichwortverzeichnis

        FELD = feldabbildung, LEERE_MENGE = feldabbildung

   oder falls FELD ein ASS-Wert in einem Monatsarbeitsgebiet ist

        FELD = feldabbildung, ASSZEIT    = zuweisung,
               LEERE_MENGE               = feldabbildung,
               LEERE_MENGE_ASSZEIT       = zuweisung

        (ASSZEIT und LEERE_MENGE_ASSZEIT im Format JJJJMM)

   oder falls FELD ein ASS-Wert in einem Tagesarbeitsgebiet ist

        FELD = feldabbildung, ASSZEIT_TT = zuweisung,
               LEERE_MENGE               = feldabbildung,
               LEERE_MENGE_ASSZEIT_TT    = zuweisung

         (ASSZEIT_TT und LEERE_MENGE_ASSZEIT_TT im Format JJJJMMTT)

   Beispiele:

   GROESSENKLASSE =
     IF      ANZ_VERTRAEGE < 0      THEN   SATZ_LOESCHEN
     ELSEIF  ANZ_VERTRAEGE < 100    THEN   'A'
     ELSEIF  ANZ_VERTRAEGE < 1000   THEN   'B'
     ELSEIF  ANZ_VERTRAEGE < 10000  THEN   'C'
     OTHER                                 'X'
     ENDIF,
     LEERE_MENGE = 'N'

   ANZ_VERTRAEGE = MENGENFUNKTION (ANZAHL)

   ANZ_TAGE = FUNKTION (ANZ_TAGE, DATUM1, DATUM2)
              (falls DATUM1 und DATUM2 Format DATE haben)


   Die Angabe SATZ_LOESCHEN bewirkt, dass der aktuell zu
   verarbeitende Satz aus der WORK-Datei gelöscht wird.

   Hinweis:
   Beim Erzeugen der Schnittstellen werden Operandeninhalte im
   allgemeinen nicht auf Formatkorrektheit überprüft. Eine
   Ausnahme bilden die gepackten Felder.

3.10 Die LEERE_MENGE-Angabe

pInhaltsverzeichnis
nStichwortverzeichnis

   Wie bereits beschrieben, kann das Erzeugen einer aktuellen
   Join-Menge zu unterschiedlichen Resultaten führen:

   - genau ein Treffer (Eindeutigkeit)
   - mehr als ein Treffer (Duplikatsbehandlung)
   - kein Treffer (Leere-Menge-Behandlung)

   Neben der Angabe der globalen Anweisung

   LEERE_MENGE = LOESCHEN

   im Joinkriterium, welche zu einem Löschen des aktuellen
   Satzes, zu dem eine Join-Menge gebildet werden soll, aus
   der Grundmenge führt, existiert eine feldspezifische
   Leere-Menge-Behandlung.

   Beispiel:

        VERTRETER = VERTRETER (AG=JOIN), LEERE_MENGE = '4711'

   Allgemein kann dort eine Formel stehen. Als Operanden
   stehen all diejenigen Felder des Zielarbeitsgebietes zur
   Verfügung, die bis zu diesem Zeitpunkt besetzt wurden. Auf
   Felder des aktuellen Join-Arbeitsgebietes kann nicht Bezug
   genommen werden, da der Inhalt dieser Felder in diesem Fall
   gerade nicht ermittelt werden kann.

   LEERE_MENGE_ASSZEIT = ...  bzw. LEERE_MENGE_ASSZEIT_TT = ...
   ist das Pendant hierzu für das Besetzen der ASS-Zeit
   bei Werte-Feldern, falls das Zielarbeitsgebiet ein ASS-
   Arbeitsgebiet ist.

3.11 Typumwandlung (Cast)

pInhaltsverzeichnis
nStichwortverzeichnis

   - durch Feldzuweisung (via Formel),
     z.B.           binär  -> gepackt,
     jedoch nicht   char   -> gepackt.

   - SUBSTR (FELD, OFFSET, LAENGE)

   - NUM (FELD_CHAR) bzw. CHAR (FELD_NUM):

   Beispiel:
             DATUM_CHAR = CHAR (DATUM_BIN)

   Das Ergebnisformat hängt vom Operanden ab:

   NUM (FELD_CHAR)  ->   dezimal gepackt 8 Bytes,
                         Komma (Anzahl Kommastellen)
                         und Vorzeichen des
                         Characterstrings werden
                         interpretiert.
                         ACHTUNG: Vorzeichen wird
                                  rechts erwartet.
                         Führende und abschließende Blanks sind
                         zulässig. Nur Blanks ergeben 0.

   Beispiel für zulässigen Operandeninhalt: 123,12-

   CHAR (FELD_NUM)
       ->  4   Bytes, falls FELD_NUM 1 Bytes binär
           6   Bytes, falls FELD_NUM 2 Bytes binär
           8   Bytes, falls FELD_NUM 3 Bytes binär
          11   Bytes, falls FELD_NUM 4 Bytes binär
           2 * Feldlänge von FELD_NUM, falls FELD_NUM
                                        dezimal gepackt,
                                        eventuell zusätzlich
                                        ein Byte für Komma

3.12 GRUPPENWECHSEL

pInhaltsverzeichnis
nStichwortverzeichnis

   Es gibt Anwendungsfälle, wo das Besetzen von Feldinhalten
   in Abhängigkeit davon geschehen soll, ob ein zu verarbeitender
   Inhalt zum ersten Mal vorkommt oder nicht. In diesem Zusammenhang
   taucht die Notwendigkeit auf, festzustellen, ob zum Vorgängersatz
   bezüglich bestimmter Felder ein Gruppenwechsel - ein Inhalt hat
   sich geändert - hat oder nicht. Dieses wird durch ein
   entsprechendes Sprachelement erreicht:

       Feld  = IF GRUPPENWECHSEL (FELD1, FELD2, FELD3) THEN 1
               OTHER                                        0
               ENDIF

   Der Gruppenwechsel wird stets bezüglich des Inputs untersucht,
   d.h. genau im ersten Schritt (SELECT) bezüglich des einzulesenden
   SELECT-Arbeitsgebietes (nach Auswertung von WHERE- und SORT-Angaben)
   und im Folgenden bezüglich des aktuellen Stands der Grundmenge.
   Der Gruppenwechsel bezieht sich nie auf Join-Arbeitsgebiete.
   Dementsprechend dürfen auch nur die Felder in der Gruppenwechsel-
   Anweisung gewählt werden.

3.13 Zeitstempel / Deltabildung

pInhaltsverzeichnis
nStichwortverzeichnis

   Aufgrund der Forderung der Vollständigkeit der Historie
   bezüglich komplexer Ableitungen ist es in einigen
   Arbeitsgebieten sinnvoll, dass alte Sätze nie manipuliert
   werden, sondern nur neue Informationen hinzugestellt
   werden. Hieraus ergibt sich die Fragestellung, bis zu
   welchem Punkt (Zeitstempel) die Daten bereits in
   abgeleitete Sichten übernommen wurden.

i

   Beispiel:

       Versorgung des Arbeitsgebietes Kunde / Vertrag:
       - Einarbeitung des Deltas Kunde   ->  Ableitung 1
       - Einarbeitung des Deltas Vertrag ->  Ableitung 2

   Zu jedem (Basis-)Arbeitsgebiet lässt sich hierzu (maximal)
   ein Zeitstempel-Feld (Postfix-Z in Eingabemaske)
   definieren. Beim Zielarbeitsgebiet wird dann pro Ableitung
   vermerkt, wie weit die Datenversorgung erfolgt ist (letzter
   Zeitstempel). Dieser Zeitstempel entspricht dem Zeitstempel
   des im SELECT angegebenen Arbeitsgebietes. Die Berück-
   sichtigung von Deltas bezieht sich dementsprechend
   nur auf das Bilden der Grundmenge und erfolgt automatisch,
   falls im Select-AG ein solcher Zeitstempel existiert.



   Die Delta-Berücksichtigung kann auf zweierlei Weisen
   beeinflusst werden:
   - Unterdrückung durch Angabe der Option NO_DELTA ->
     komplette Datenübernahme
   - Unterdrückung der Pflege des Zeitstempels beim
     Zielarbeitsgebiet durch Angabe der Option NUPDAT
     (nur für Testzwecke sinnvoll)

   Beispiel:

      ASS;
        ZIELAG    = KUNDE_VERTRAG;
        ABLEITUNG = ABL_KUNDE_VERTRAG;
        OPTIONEN  = NO_DELTA;
        SELECT (AG = KUNDE),
              ...
      END;

   Liegt das Zielarbeitsgebiet in offener Speicherungsform
   vor, so kann hierfür ein Feld als Zeitstempel-Feld
   definiert werden, das dann durch die Ableitung automatisch
   versorgt wird. Dieses Feld
   - muss das Format dezimal gepackt der Länge 8 haben (PZ) und
   - darf nicht in der Ableitungsregel angegeben werden.


   Die Ableitung ermittelt aus dem Maschinendatum einen
   Zeitstempel der Form JJJJMMTTHHMMSSZ, der in jedem
   erzeugten Schnittstellensatz eingetragen wird.

3.14 Quasikonstanten / Bezugsdatum / Parameter

pInhaltsverzeichnis
nStichwortverzeichnis

   In der Ableitungsregel kann auf bestimmte Daten Bezug genommen
   werden, die quasi konstant sind. Hierzu zählen
   - das aktuelle Maschinendatum, wobei die Bezugnahme durch die
     Begriffe
     - LAUFENDES_JAHR in der Form JHJJ
     - VORJAHR in der Form JHJJ
     - LAUFENDER_MONAT in der Form MM
     - VORMONAT in der Form MM
     erfolgt
   - LETZTE_VERSORGUNG, die letzte Versorgung des Zielarbeitsgebietes
     durch die aktuelle Ableitung. Format und Feldlänge hängen von
     der Definition des entsprechenden Zeitstempels ab.
   - SATZNUMMER, die aktuelle Satznummer desjenigen Satzes, der durch
     die Ableitungsregel für das Zielarbeitsgebiet aktuell aufgebaut
     wird. Dadurch können die Sätze im Ziel innerhalb jedes
     Select- bzw. Join-Steps numeriert werden. Bei der Satznummer
     handelt es sich um ein 4 Bytes binär Feld. Einschränkung: der
     CAST-Operator CHAR darf nicht (direkt) auf SATZNUMMER angewandt
     werden.


   Das Maschinendatum kann durch eine Angabe im ersten Satz
   der Datei ASSDATE (analog zum Standard-ASS) übersteuert
   werden. Diese Angabe lässt sich wiederum durch
   BEZUGSMONAT = JHJJMM in der Ableitungsregel übersteuern.

   In den Sätzen 2 bis n können in ASSDATE Parameter mit
   Parameterinhalten angegeben werden, die dann in der
   Ableitungsregel nutzbar sind. Parameterbezeichner beginnen
   dabei mit &&.

   Beispiel:
       Inhalt der Datei ASSDATE:
         9805
         &&MONAT = '03'

       Angabe in der Ableitungsregel:
         DATUM_AKT = LAUFENDES_JAHR !! &&MONAT

   Standardmäßig wird für die Ermittlung des Vormonats mit
   12 Monaten pro Kalenderjahr gerechnet. Diese Angabe lässt
   sich in der Ableitungsregel übersteuern.

       ASS;
         ZIELAG      = KUNDE_VERTRAG;
         ABLEITUNG     = ABL_KUNDE_VERTRAG;
         BEZUGSMONAT  = '199812';
         MONATE_MAX    = 13;
                 ...
       END;

3.15 ASS-Bestandsarbeitsgebiete als Zielarbeitsgebiet

pInhaltsverzeichnis
nStichwortverzeichnis

   Für Bestandsarbeitsgebiete im ASS ist es im allgemeinen
   nicht möglich, beispielsweise bei Zustandsänderungen von
   Verträgen, aus den Quellarbeitsgebieten heraus via
   Anweisungen in der Ableitungsregel die korrekten
   Schnittstellensätze zu erzeugen, da unter Umständen bei
   komplexen Zusammenhängen nicht mehr alle Informationen zur
   Verfügung stehen. Daher existieren Sprachmittel, die die
   Erzeugung von Gegenbuchungen aus dem Zielarbeitsgebiet
   heraus ermöglichen:

       ASS;
         ZIELAG               = BESTAND_NEU;
         ABLEITUNG            = VTR_BESTAND;
         OPTIONEN             = BESTAND;
         ORDNUNGSBEGRIFF      = ( KUNDENNUMMER,
                                 POLICENNUMMER);
         SORT_ORDNUNGSBEGRIFF = (HISTORIENUMMER);

         SELECT (AG = 1001),
           BESTANDSSATZART (FORMAT = CHAR, LAENGE = 1) = '   ',
                     ...
       END;

  -  Zugriff auf ASS-Arbeitsgebiet bzw. Ziel-Arbeitsgebiet über
     den Ordnungsbegriff

  -  Bei Duplikaten im Select-Arbeitsgebiet bezüglich des
     Ordnungsbegriffs, z.B. mehrere Vertragsänderungen seit der
     letzten Übernahme, Sortierung der Sätze nach
     SORT_ORDNUNGSBEGRIFF (z.B. Historiennummer)

  -  Definition eines Hilfsfeldes BESTANDSSATZART

  -  Die Ausgabe der Schnittstellensätze erfolgt zusätzlich in
     einer Datei ASSOUBB, in der Positivbuchungen und
     Negativbuchungen im Feld BESTANDSSATZART unterschiedlich
     gekennzeichnet sind

3.16 ASS-Arbeitsgebiete als Input-Arbeitsgebiet

pInhaltsverzeichnis
nStichwortverzeichnis

   ASS-Arbeitsgebiete werden intern in einer normierten Form
   interpretiert. Diese Form ist unabhängig vom physischen
   Speicherungsprinzip der ASS-Summendaten, insbesondere auch
   vom Verdichtungsstufenkonzept.

i

   In der obigen Tabelle bezeichnen Si Schlüssel und Wj Werte
   im ASS-Sinne. Eine Zeile W(j,tk) steht für einen Wert, der
   nur für den Zeitaspekt tk von Null verschieden ist. Die
   ASSZEIT wird auf eine eigene Spalte abgebildet. Das
   dargestellte Format ist ein maximales Format. In
   Abhängigkeit von den aufgrund der Ableitungsregel
   angeforderten Schlüssel, Werte und Zeiten können einzelne
   Zeilen entfallen.

   In der Ableitungssprache werden analog zu den
   Basisarbeitsgebieten Schlüssel und Werte über ihren
   Bezeichner angesprochen. Die ASS-Zeit wird über den Pseudo-
   Schlüssel ASSZEIT bzw. ASSZEIT_TT ausgewertet, dessen Inhalt
   in der Form JHJJMM bzw. JHJJMMTT betrachtet wird. Innerhalb des
   ASS sind analog zur Auswertung Werte nicht ohne ASS-Zeitangabe
   interpretierbar. In diesem Zusammenhang unterstützt die
   Ableitungssprache zwei Szenarien:

   - Angabe von Werten mit ASS-Zeitaspekt, die Angabe erfolgt
     hinter der Wertebezeichnung in Klammern gesetzt in der Form
              Wert (ASSZEIT    ='199812'  )
         bzw. Wert (ASSZEIT_TT ='20060923')
      oder    Wert (AG = JOIN, ASSZEIT    ='199812'  )
         bzw. Wert (AG = JOIN, ASSZEIT_TT ='20060923').
     Im Select-Step ist dementsprechend JOIN durch
     SELECT zu ersetzen.

   - Angabe von Werten ohne ASS-Zeitaspekt. Die zugehörigen
     Zeitaspekte werden intern aus den Angaben zum Schlüssel
     ASSZEIT bzw. ASSZEIT_TT ermittelt. Fehlen Angaben hierzu, so wird
     der gesamte Einspeicherungszeitraum als angefordert betrachtet.

   Welche Schlüssel, Werte und Zeiten aus dem ASS-
   Arbeitsgebiet im aktuellen SELECT / JOIN-Step betrachtet
   werden, hängt ausschließlich von der Ableitung ab. Alle
   angesprochenen Felder aus dem Arbeitsgebiet, unabhängig
   davon, ob dieses in einer Feldzuweisung oder in einer
   Bedingung ist, gelten als angefordert. Wird ein Wert ohne
   Zeitaspekt angesprochen, so gilt automatisch der Pseudo-
   Schlüssel ASSZEIT bzw. ASSZEIT_TT als angefordert und wird unter
   Umständen ergänzt. ASSZEIT findet bei Monatsarbeitsgebieten,
   ASSZEIT_TT bei Tagesarbeitsgebieten Verwendung.
   Pro Step muss mindestens ein ASS-Wert angegeben werden.

   Aus allen Zeitangaben wird ein maximales Zeitintervall für
   die ASS-Zeit ermittelt. Dieses ist gegebenenfalls das
   gesamte Einspeicherungsintervall des Arbeitsgebietes (siehe
   oben). Bezüglich dieses Zeitintervalls werden die
   Summendaten gelesen.

   Beispiel:

       ASS;

         ZIELAG      = KUNDE_VERTRAG;
         ABLEITUNG   = ABL_KUNDE_VERTRAG;

         SELECT (AG = ASS_DATEN)
           WHERE (ASSZEIT >= '199801' & ASSZEIT <= '199812'),
             KUNDENNUMMER   = KUNDENNUMMER,
             UMSATZ         = UMSATZ;
                   .
                   .

                   .
       END;

   Es wird nur der Zeitaspekt zwischen Januar und Dezember
   1998 betrachtet.

   Beispiel:

       ASS;

         ZIELAG      = KUNDE_VERTRAG;
         ABLEITUNG   = ABL_KUNDE_VERTRAG;

         SELECT (AG = ASS_DATEN),
           KUNDENNUMMER   = KUNDENNUMMER,
           UMSATZ         = UMSATZ (ASSZEIT = '199801');
                   .
                   .
                   .

       END;

   Unabhängig vom Quellarbeitsgebiet kann das
   Zielarbeitsgebiet wiederum ein ASS-Arbeitsgebiet sein. In
   diesem Fall sind (ASS-)Werte mit der zugehörigen ASS-Zeit
   zu versorgen. Bei Monatsarbeitsgebieten ist ASSZEIT und bei
   Tagesarbeitsgebieten ASSZEIT_TT zu verwenden.

   Beispiel:

       ASS;

         ZIELAG      = ASS_DATEN_NEU;
         ABLEITUNG   = ABL_KUNDE_VERTRAG;

         SELECT (AG = ASS_DATEN)
           WHERE (ASSZEIT >= '199801' & ASSZEIT <= '199812'),
           KUNDENNUMMER    = KUNDENNUMMER,
           UMSATZ          = UMSATZ, ASSZEIT = ASSZEIT;
                   .
                   .
                   .

       END;

   Die Versorgung der ASS-Zeit geschieht wie üblich allgemein
   durch eine Formel. Das obige Beispiel stellt hierbei einen
   Sonderfall dar. Es wird Bezug genommen auf den intern
   ergänzten Schlüssel ASSZEIT, der aktuelle Inhalt wird
   übernommen.


   In allen Beispielen werden nur Sätze ausgegeben, wenn der
   Werteinhalt von Null verschieden ist. Allgemein entsteht
   ein Satz nur dann, wenn der Werteinhalt eines angegebenen
   Wertes von Null verschieden ist. Möchte man derartige
   "Nullsätze" bezüglich des angeforderten Zeitaspektes
   erzeugen, so ist die Option NULLAUSGABE anzugeben.

   Beispiel:

       ASS;

         ZIELAG    = KUNDE_VERTRAG;
         ABLEITUNG = ABL_KUNDE_VERTRAG;
         OPTIONEN  = NULLAUSGABE;

         SELECT (AG = ASS_DATEN)
           WHERE (ASSZEIT >= '199801' & ASSZEIT <= '199812'),
             KUNDENNUMMER  = KUNDENNUMMER,
             UMSATZ        = UMSATZ;
                   .
                   .

                   .
       END;

   ACHTUNG:
   Bei Verwendung der Option   NULLAUSGABE   ist das
   Ergebnis abhängig von der / den benutzten
   Verdichtungsstufen aus denen die ASS-Summendaten gelesen
   werden. Es können nur Sätze ausgegeben werden, die auf
   den entsprechenden Verdichtungsstufen vorhanden sind.
   Aufgrund der internen Speicherungslogik von ASS-Summendaten
   ist es möglich, dass auf einer Basisverdichtungsstufe
   Schlüsselinhaltskombinationen existieren, die auf höheren
   Verdichtungsstufen aufgrund der Verdichtung nicht
   vorkommen. Daher ist die Angabe der Option nur dann ratsam,
   wenn gewährleistet ist, dass eine echte
   Basisverdichtungsstufe vorhanden ist und die zu
   selektierenden Daten aufgrund der Ableitungsregel durch
   Anforderung aller Schlüssel des Arbeitsgebietes aus dieser
   Basis gewonnen werden.

3.17 Relative Zeitangaben bei der ASSZEIT

pInhaltsverzeichnis
nStichwortverzeichnis

   Analog zur ASS-Auswertung ist beim Schlüssel ASSZEIT und
   bei den ASSZEIT-Angaben zu ASS-Werten der relative Bezug
   auf das Maschinendatum beziehungsweise auf den
   übersteuernd angegebenen Bezugsmonat möglich.

   Möglich sind

     BMnn:  Bezugsmonat minus nn Monate

     BPnn:  Bezugsmonat plus nn Monate

     nnMm:   Monat nn, Jahresangabe aus Bezugsmonat minus m Jahre

     nnPm:   Monat nn, Jahresangabe aus Bezugsmonat plus  m Jahre

   Die Anzahl Monate im Jahr ist standardmäßig 12. Sie kann
   durch die Angabe von MONATE_MAX auf eine Anzahl zwischen 13
   und 16 erhöht werden.

   Eine relative Zeitangabe beim Schlüssel ASSZEIT muss in
   Hochkommata eingeschlossen werden, also als String
   erfolgen.

   Beispiele:

       ASS;
         ZIELAG      = KUNDE_VERTRAG;
         ABLEITUNG   = ABL_KUNDE_VERTRAG;
         BEZUGSMONAT = '199801';

         SELECT (AG = ASS_DATEN)
           WHERE (ASSZEIT  >= 'BM00' & ASSZEIT <= 'BP11'),
             KUNDENNUMMER   = KUNDENNUMMER,
             UMSATZ         = UMSATZ;
                   .
                   .
                   .

       END;

       ASS;

         ZIELAG    = KUNDE_VERTRAG;
         ABLEITUNG   = ABL_KUNDE_VERTRAG;

         SELECT (AG = ASS_DATEN),
           KUNDENNUMMER   = KUNDENNUMMER,
           UMSATZ         = UMSATZ (ASSZEIT = 01P1);
                   .
                   .
                   .

       END;

3.18 Der aktuelle Zustand des aufzubauenden Zielarbeitsgebietes als Input-Arbeitsgebiet

pInhaltsverzeichnis
nStichwortverzeichnis

   Innerhalb einer Ableitungsregel ist es möglich, in einem
   Join-Step Bezug auf den aktuellen Zustand des aufzubauenden
   Zielarbeitsgebietes zu nehmen. Diese sequentielle Datei
   wird als Arbeitsgebiet aufgefasst:

   Beispiel:

       ASS;

         ZIELAG     = zielagbezeichnung;
         ABLEITUNG  = bezeichnung_ableitung;

         SELECT (AG = ag_select),
           Feld1    =  Formel1,
               .
               .
               .
           Feldn    =  Formeln;

         JOIN (AG = ZIELAG_NEU_AKT) ,
           JOINKRITERIUM   =  ( ... ),
           Feldn+1  =  Formeln+1,
               .
               .
               .

         SELECT (AG = ZIELAG_NEU_AKT) ,
           Feldm+1  =  Formelm+1,
               .
               .
               .

       END;

   In dem betreffenden Join-Step kann auf alldiejenigen Felder
   Bezug genommen werden, die bis zu diesem Zeitpunkt
   ermittelt wurden (im Beispiel Feld1,..., Feldn). Intern
   wird entsprechend ein künstliches Arbeitsgebiet mit einer
   entsprechenden Arbeitsgebietsbeschreibung angelegt. Der
   Umfang des Arbeitsgebietes (bekannte Felder, Anzahl Sätze)
   ist demnach dynamisch. Insbesondere zu beachten ist die
   zusätzliche Qualifkation der zu besetzenden Felder durch
   die Angaben von AG = JOIN bzw. AG = ZIEL. Die aktuellen
   Inhalte dieser Felder während der Verarbeitung sind im
   allgemeinen verschieden.

3.19 Wesentliche Programme der Ableitungsregeln

pInhaltsverzeichnis
nStichwortverzeichnis

     PCL4003: Steuerung
       MCL4016: Sprachanalyse
       MCL4018: Formeln umsetzen
       MCL4017: Einlesen der Arbeitsgebietsinformationen
       MCL4015: Feldinformation für DB2-AG aus IBM-Systemkatalog
       MCL4009: Erzeugung der Schnittstellendatei
         MCL4003: Erzeugung aktueller Join-Datei (meistens Cache)
         MCL4004: Erzeugung kurzer Schnittstelle für ASS-AG
         MCL4005: Zugriff sequentielle Dateien
         MCL4006: DB2-Zugriff
         MCL4014: Formeln berechnen
         MCL4023: Zugriff aus ASS-Summendatenbanken
         MCL4098: Funktionen berechnen
         MCL4097: USER-Exit



   Gezielte Ansteuerung von Programmteilen per Option:


   NUR_SYNTAX:      nur Sprachanalyse (MCL4016)
   NUR_SEMANTIK:    Sprachanalyse und Konsistenzprüfungen
                    (bis einschließlich MCL4017)



   Zusätzliche Dokumentation von Laufzeiten in MCL4009:


   DISPLAY_ZEIT:    Ausgabe via Cobol-DISPLAY
   PROTO_ZEIT:      Ausgabe auf Protokolldatei

3.20 Allgemeine Verarbeitungsoptionen

pInhaltsverzeichnis
nStichwortverzeichnis



   LINE_SEQUENTIAL: Diese Option ist nur für eine PC-
     Installation gedacht. Gewöhnlich erzeugt die DW-Kompo-
     nente Schnittstellendateien mit variablen Satzlängen
     (Ladebestände für ASS, DB2). Ist das Zielarbeitsgebiet
     ein sequentielles Basisarbeitsgebiet, so wird bei Angabe
     dieser Option eine Datei vom Typ "line sequential" erzeugt.
     In diesem Fall darf das Zielarbeitsgebiet nur Felder vom
     Typ Character enthalten.

3.21 Muster für Job-Control

pInhaltsverzeichnis
nStichwortverzeichnis

   //PG999513 JOB  (PG9999,ASS,E),'ODI  PCL4003',
   //             CLASS=1,
   //             MSGCLASS=X,
   //             NOTIFY=&SYSUID,
   //             REGION=6M,
   //             TIME=(,10),
   //             COND=(0,LT)
   /*JOBPARM  R=33,PROCLIB=PROC09
   //ATECNTL  JCLLIB ORDER=(PG##E.INO.CNTL)
   //*
   //*
   //****    P C L 4 0 0 3    ***************************
   //PCL4003  EXEC §ODI2,
   //             MBR=DSNMTV01,
   //             PSB=PCL4003
   //DDITV02 DD  *
     DB2T,SYS1,DSNMIN10,,R,-,ARIADNE,PAR4000,PCL4003
   //DDOTV02  DD   DISP=(,PASS),
   //             UNIT=SYSDA,
   //             SPACE=(TRK,(1,1)),
   //             DCB=(RECFM=VB,LRECL=4092,BLKSIZE=4096)
   //KARTE    DD   DSN=PG##E.PDS.BUE(KARTE2),DISP=SHR
   //VNRNAME  DD   DSN=PG##E.PDS.BUE(VNRNAME),DISP=SHR
   //LISTE    DD   SYSOUT=*,
   //             DCB=RECFM=FBA
   //ASSDATE  DD   DSN=NULLFILE
   //ASSOUMM  DD   DSN=PG##E.ERE.EX(A4003M),DISP=OLD
   //ASSOUNN  DD   DSN=PG##E.ERE.EX(A4003N),DISP=OLD
   //ASSOUOO  DD   DSN=PG##E.ERE.EX(A4003O),DISP=OLD
   //WORK1    DD   DSN=PG##E.ERE.W1,DISP=OLD
   //WORK2    DD   DSN=PG##E.ERE.W2,DISP=OLD
   //WORK3    DD   DSN=PG##E.ERE.W3,DISP=OLD
   //WORK4    DD   DSN=PG##E.ERE.W4,DISP=OLD
   //WORK5    DD   DSN=PG##E.ERE.W5,DISP=OLD
   //WORK6    DD   DSN=PG##E.ERE.W6,DISP=OLD
   //SORTWK1  DD   UNIT=SYSDA,
   //              SPACE=(CYL,(10,1))
   //SORTWK2  DD   UNIT=SYSDA,
   //              SPACE=(CYL,(10,1))
   //*
   //****    D F S E R A 1 0    ****************************
   //DFSERA10 EXEC PGM=DFSERA10,COND=EVEN
   //STEPLIB  DD   DSN=$$ALL12.Q.NODBRC,DISP=SHR
   //SYSIN    DD   *
   CONTROL  CNTL K=000,H=8000
   OPTION   PRINT
   //SYSPRINT DD   SYSOUT=*
   //SYSUT1   DD   DSN=*.PCL4003.A.DDOTV02,DISP=(OLD,DELETE)

3.22 Ein- und Ausgabedateien

pInhaltsverzeichnis
nStichwortverzeichnis

   KARTE            Ableitungsregel
   ASSDATE          Bezugsdatum und Parameter
   LISTE            Protokoll
   WORK1-WORK6      temporäre Work-Dateien
   SORTWK1, SORTWK2 Arbeitsdateien für Systemsort
   ASSOUMM          Kopfsatz, falls Zielarbeitsgebiet ASS-AG
   ASSOUNN          Schnittstellendatei bzw. Summensätze
   ASSOUOO          Endesatz, falls Zielarbeitsgebiet ASS-AG
   ASSOUBB          nur Option BESTAND
   VNRNAME          Daten des Arbeitsgebietes VNRNAME,
                    Satzformat: fest oder variabel.

3.23 Beispiel einer komplexen Ableitungsregel

pInhaltsverzeichnis
nStichwortverzeichnis

 ASS;
  ABLEITUNG = VTRBST;
  ZIELAG    = BESTAND_NEU;
  OPTIONEN  = BESTAND;
  ORDNUNGSBEGRIFF = KD_NUMMER_1_3,KD_NUMMER_4_6,KD_NUMMER_7_9,
                    POL_LFD_NR,VTR_LFD_NR,MANDANT);
  SORT_ORDNUNGSBEGRIFF = (VTRHISTNR);

  /*** BEARBEITEN DER NEU HINZUGEKOMMENEN ZUSTAENDE/VORGAENGE */
  SELECT(AG = 1002),
  BESTANDSSATZART (FORMAT=CHAR, LAENGE=1)
                       = ' ',
  KDNR (FORMAT=BIN, LAENGE=4)
                       = KD_NUMMER,
  URLDATUM (FORMAT=DATE,LAENGE=10)
                       = '&&URLDATUM',
  STATDATUM (FORMAT=DATE, LAENGE=10)
                       = IF BEARBEITUNGSDATUM > AENDERUNGSDATUM
                         &  BEARBEITUNGSDATUM > URLDATUM
                           THEN BEARBEITUNGSDATUM
                         ELSEIF BEARBEITUNGSDATUM <= AENDERUNGSDATUM
                         &  AENDERUNGSDATUM > URLDATUM
                           THEN AENDERUNGSDATUM
                         OTHER URLDATUM
                         ENDIF,
  BEARBDAT_JJJJMM (FORMAT=CHAR, LAENGE=6)
                       = SUBSTR(BEARBEITUNGSDATUM,7,4) !!
                         SUBSTR(BEARBEITUNGSDATUM,4,2),
  VTRNR (FORMAT=PACKED, LAENGE=8)
                       = VTR_NR,
  VTRHISTNR (FORMAT=PACKED, LAENGE=3)
                       = VTR_HIST_NR,
  POLLFDNR (FORMAT=BIN,LAENGE=2)
                       = POL_LFD_NR,
  VTRHNR (FORMAT=PACKED, LAENGE=3)
                       = VTR_HIST_NR,   /* WEGEN KD_BST */
  LEISCHL (FORMAT=PACKED, LAENGE=8)
                       = LEISTUNGSSCHL,
  STATDAT   (FORMAT=DATE, LAENGE=10)
                       = STATDATUM,
  VORGANG(FORMAT=CHAR, LAENGE=4) = VORGANG,
  TEILVORGANG(FORMAT=CHAR, LAENGE=4) = TEILVORGANG,
  STORNOART  (FORMAT=CHAR, LAENGE=3)
                       = IF STORNOART = ' ' THEN '#'
                         OTHER STORNOART
                         ENDIF,
  STORNOGRUND(FORMAT=CHAR, LAENGE=3)
                       = IF STORNOGRUND = ' ' THEN '#'
                         OTHER STORNOGRUND
                         ENDIF,
  AENDERDAT_JJJJMM  (FORMAT=CHAR, LAENGE=6)
                       = SUBSTR(STATDAT,7,4) !!
                         SUBSTR(STATDAT,4,2),
  ANTRAGSART   (FORMAT=CHAR, LAENGE=6) = ANTRAGSART,
  ANTRAGSDATUM (FORMAT=CHAR, LAENGE=4) = ANTRAGSDATUM,
  ANZTAGE (FORMAT=BIN, LAENGE=4)
                             = FUNKTION(ANZ-TAGE,
                                VERTRAGSBEGINN_VTR,
                                STATDATUM ),
  BEWEGUNGSJAHR_VTR (FORMAT=CHAR, LAENGE=1) =
                       IF ANZTAGE < 365 THEN '0'
                   ELSEIF ANZTAGE < 730 THEN '1'
                   OTHER                     '2'
                   ENDIF,
  GESELLSCHAFT         = SUBSTR(CHAR(GESELLSCHAFT),4,2),
  HAUPTFAELL_POL       = SUBSTR(CHAR(HAUPTFAELL_POL),4,2),
  LAUFZEIT             = SUBSTR(CHAR(LAUFZEIT),1,3),
  LEISTUNGSSCHL        = SUBSTR(CHAR(LEISTUNGSSCHL),10,6),
  MANDANT              = MANDANT,
  MITARBEITER_KNZ      = MITARBEITER_KNZ,
  KD_NUMMER_1_3        = SUBSTR(CHAR(KD_NUMMER),2,3),
  KD_NUMMER_4_6        = SUBSTR(CHAR(KD_NUMMER),5,3),
  KD_NUMMER_7_9        = SUBSTR(CHAR(KD_NUMMER),8,3),
  POL_LFD_NR           = SUBSTR(CHAR(POL_LFD_NR),3,3),
  SPARTE               = SPARTE,
  STATUS_VTR           = STATUS_VTR,
  VTR_LFD_NR           = SUBSTR(CHAR(VTR_LFD_NR),2,4),
  VERTRAGSBEG_V_JJJJ   = SUBSTR(VERTRAGSBEGINN_VTR,7,4),
  VERTRAGSBEG_V_JJJJMM = VERTRAGSBEG_V_JJJJ !!
                         SUBSTR(VERTRAGSBEGINN_VTR,4,2),
  VERTRAGSBEG_P_JJJJ   = SUBSTR(VERTRAGSBEGINN_POL,7,4),
  VERTRAGSBEG_P_JJJJMM = VERTRAGSBEG_P_JJJJ !!
                         SUBSTR(VERTRAGSBEGINN_POL,4,2),
  WARTEZEITENTFALL     = WARTEZEITENTFALL,
  WERBESCHLUESSEL      = IF WERBESCHLUESSEL = ' ' THEN '#'
                         OTHER WERBESCHLUESSEL
                         ENDIF,
  ZAHLWEISE            = ZAHLWEISE,
  ZU_NACHLASSART       = IF ZU_NACHLASSART  = ' ' THEN '#'
                         OTHER ZU_NACHLASSART
                         ENDIF,
  ZU_NACHLASSNR        = SUBSTR(CHAR(ZU_NACHLASSNR),1,5),
  ABSCHLUSSGRUPPE      = '#',
  VERTRIEBSSTELLE      = '#',
  ANZAHL_VERTRAEGE     = IF VORGANG(AG=SELECT) = '0000'
                         &  TEILVORGANG(AG=SELECT) ^= '0090'
                           THEN 0
                         ELSEIF  (  VORGANG(AG=SELECT)='0000'
                                  & TEILVORGANG(AG=SELECT) = '0090')
                               ! VORGANG(AG=SELECT) = '2900'
                               ! VORGANG(AG=SELECT) = '2950'
                               ! VORGANG(AG=SELECT) = '3000'
                               ! VORGANG(AG=SELECT) = '5000'
                               ! VORGANG(AG=SELECT) = '5100'
                           THEN SATZ_LOESCHEN
                         OTHER 1
                         ENDIF,
                         ASSZEIT = SUBSTR(STATDAT,7,4) !!
                                   SUBSTR(STATDAT,4,2);

  /*** ERGAENZEN DER KUNDENMERKMALE */
  JOIN (AG = 1000 /* KUNDENDATEI */,LESART=DIREKT),
  JOINKRITERIUM = ( ZIELFELDER = ( MANDANT !! KDNR ),
                    JOINFELDER = ( MANDANT !! KD_NUMMER ),
                    SORT (BEARBEITUNGSDATUM ASC),
                    DUP = LAST
                    WHERE ( BEARBEITUNGSDATUM <= STATDAT,
                            SORT (BEARBEITUNGSDATUM ASC),
                            LAST (KD_NUMMER),
                            STATUS_MGL = ' '
                          )
                  ),
  EINTRITTSJAHR_KD     = EINTRITTSJAHR_KD,
                         LEERE_MENGE = '$',
  FAELLIGKEIT_KD       = FAELLIGKEIT_KD,
                         LEERE_MENGE = '$',
  GESCHLECHT           = GESCHLECHT,LEERE_MENGE = '$',
  GEBURTSJAHR          = SUBSTR(GEBURTSDATUM,7,4),
                         LEERE_MENGE = '$',
  INKASSOART           = IF STATUS_BANK_R = '1' THEN 'A'
                         OTHER 'I'
                         ENDIF,
  TARIF                = TARIF, LEERE_MENGE = '$',
  WOHNSITZ             = WOHNSITZ, LEERE_MENGE = '$';

  /*** ERGAENZEN WERBEMERKMALE */
  JOIN (AG = 1008 /*WERBESCHL*/),
  JOINKRITERIUM = ( ZIELFELDER = ( WERBESCHLUESSEL !! MANDANT ),
                    JOINFELDER = ( WERBESCHLUESSEL !! MANDANT ),
                    DUP = LAST
                  ),
  WERBEGRUPPE          = IF WERBEGRUPPE     = ' ' THEN '#'
                         OTHER WERBEGRUPPE
                         ENDIF,
  WERBEMEDIUM          = IF WERBEMEDIUM     = ' ' THEN '#'
                         OTHER WERBEMEDIUM
                         ENDIF;

  /*** ERMITTELN DER WERTE */
  JOIN (AG = 1003 /*VO_LVB*/),
  JOINKRITERIUM = ( ZIELFELDER = ( MANDANT !! VTRNR  !! VTRHISTNR),
                    JOINFELDER = ( MANDANT !! VTR_NR !!
                                   VTR_HIST_NR ),
                    SORT ( VO_NR ASC,
                           LVB_NR ASC
                         ),
                    DUP = LAST
                    WHERE ( STATUS_VO = 'A' )
                  ),
  STEUERPROZSATZ       = SUBSTR(CHAR(STEUERPROZSATZ),3,8),
  BRUTTO (FORMAT=PACKED, LAENGE=6, KOMMASTELLEN=3)
                       = MENGENFUNKTION (SUMME,BRUTTOBEITRAG),
  NETTO (FORMAT=PACKED, LAENGE=6, KOMMASTELLEN=3)
                       = MENGENFUNKTION (SUMME,NETTOBEITRAG),

  BRUTTO_BEITRAG       = BRUTTO,
                         ASSZEIT = SUBSTR(STATDAT,7,4) !!
                                   SUBSTR(STATDAT,4,2),
                         LEERE_MENGE_ASSZEIT = SUBSTR(STATDAT,7,4) !!
                                               SUBSTR(STATDAT,4,2),
  NETTO_BEITRAG        = NETTO,
                         ASSZEIT = SUBSTR(STATDAT,7,4) !!
                                   SUBSTR(STATDAT,4,2),
                         LEERE_MENGE_ASSZEIT = SUBSTR(STATDAT,7,4) !!
                                               SUBSTR(STATDAT,4,2),
  RABATT               = MENGENFUNKTION (SUMME,RABATT_DM),
                         ASSZEIT = SUBSTR(STATDAT,7,4) !!
                                   SUBSTR(STATDAT,4,2),
                         LEERE_MENGE_ASSZEIT = SUBSTR(STATDAT,7,4) !!
                                               SUBSTR(STATDAT,4,2),
  STEUER               = BRUTTO - NETTO,
                         ASSZEIT = SUBSTR(STATDAT,7,4) !!
                                   SUBSTR(STATDAT,4,2),
                         LEERE_MENGE_ASSZEIT = SUBSTR(STATDAT,7,4) !!
                                               SUBSTR(STATDAT,4,2);
   END;


4 Sprache

pInhaltsverzeichnis
nStichwortverzeichnis

4.1 Rahmen für Ableitungsregel

pInhaltsverzeichnis
nStichwortverzeichnis

   ASS;

     ZIELAG               =  ag;
     DATABASE             =  database;
     ABLEITUNG            =  regel;
     MONATE_MAX           =  monat;
     BEZUGSMONAT          =  bezugsmonat;
     OPTIONEN             =  option, ..., ..., option;
     ORDNUNGSBEGRIFF      =  ( feldname_einfach, ..., ...,
                                     feldname_einfach );
     SORT_ORDNUNGSBEGRIFF =  ( feldname_einfach );

     SELECT   ( selectangabe )   WHERE  ( selectbedingung )
       ,feldzuweisung
       ,...
       ,...
       ,...
       ,feldzuweisung
       ;

     JOIN     ( joinangabe )   WHERE  ( joinbedingung )
       ,JOINKRITERIUM = joinkriterium
       ,feldzuweisung
       ,...
       ,...
       ,...
       ,feldzuweisung
       ;

     SELECT   ( AG = ZIELAG_NEU_AKT )   WHERE  ( selectbedingung )
       ,feldzuweisung
       ,...
       ,...
       ,...
       ,feldzuweisung
       ;

     END;

   Die Join-Steps und Select-Steps außer dem ersten sind optional
   und dürfen in beliebiger Reihenfolge angegeben werden. Die
   Feldzuweisungen bei Folge-Select-Steps dürfen fehlen.

4.2 Operanden ( in logischer Reihenfolge )

pInhaltsverzeichnis
nStichwortverzeichnis

   ag:            positive ganzzahlige Konstante 1, ..., 1999
                  oder
                  Char-Konstante der Länge 1, ..., 20

   database:      für DB2-Tabellen              Database

   regel:         positive ganzzahlige Konstante 1, ..., 1999
                  oder
                  Char-Konstante der Länge 1, ..., 20

   bezugsmonat:   Zeitangabe in der Form 'JHJJMM'

   monat:         positive ganzzahlige Konstante 12, ..., 16

   option:        NUPDAT
                  oder
                  NUR_SYNTAX
                  oder
                  NUR_SEMANTIK
                  oder
                  BESTAND
                  oder
                  NO_DELTA
                  oder
                  NULLAUSGABE
                  oder
                  DISPLAY_ZEIT
                  oder
                  PROTO_ZEIT
                  oder
                  LINE_SEQUENTIAL (nur PC)

   feldname_einfach:
                  Spaltenbezeichner, der syntaktisch ein
                  PLI-Bezeichner sein muss

   selectangabe:  AG = ag
                  oder
                  AG = ag, DATABASE = database
                  oder
                  AG = ag, LESART = DIREKT
                  oder
                  AG = ag, DATABASE = database,
                       LESART = DIREKT

   joinangabe:    AG = ag
                  oder
                  AG = ag, DATABASE = database
                  oder
                  AG = ag, LESART = DIREKT
                  oder
                  AG = ag, NOSORT = nosort
                  oder
                  AG = ag, DATABASE = database,
                     LESART = DIREKT
                  oder
                  AG = ag, DATABASE = database,
                     NOSORT = nosort
                  oder
                  AG = ag, NOSORT = nosort,
                     LESART = DIREKT
                  oder
                  AG = ag, DATABASE = database,
                     LESART = DIREKT, NOSORT = nosort

   nosort:        ALL
                  oder
                  ZIEL
                  oder
                  JOIN

   feldzuweisung: zielfeld = feldabbildung_mit_zeitangabe
                  oder
                  zielfeld, ..., ..., zielfeld =
                         SATZFUNKTION ( opcode, operand, ... ),
                         LEERE_MENGE  ( opcode, operand, ... )

   zielfeld:      feldname_einfach
                  oder
                  feldname_einfach ( arbeitsfeldangabe )

   arbeitsfeldangabe:
                  ASSZEIT  bzw. ASSZEIT_TT
                  oder
                  FORMAT = format, LAENGE = laenge1,
                  KOMMASTELLEN = kommastellen

   format:        CHAR
                  oder
                  BIN
                  oder
                  PACKED

   laenge1:       positive ganzzahlige Konstante
                  bei arbeitsfeldangabe abhängig von FORMAT:
                    bei CHAR:    1 ... 50
                    bei BIN:     1 ... 4
                    bei PACKED:  1 ... 8

   kommastellen:  positive ganzzahlige Konstante  1, ..., 4
                  ( nur bei FORMAT = PACKED erlaubt! )

   feldabbildung_mit_zeitangabe:
        Monatsarbeitsgebiet:
                  feldabbildung,
                  ASSZEIT            = zuweisung
                  LEERE_MENGE        = feldabbildung,
                  LEERE_MENGE_ASSZEIT= zuweisung
                  oder
                  feldabbildung,
                  ASSZEIT            = zuweisung
                  LEERE_MENGE_ASSZEIT= zuweisung
                  oder
                  feldabbildung,
                  LEERE_MENGE        = feldabbildung,
        Tagesarbeitsgebiet:
                  feldabbildung,
                  ASSZEIT_TT            = zuweisung
                  LEERE_MENGE           = feldabbildung,
                  LEERE_MENGE_ASSZEIT_TT= zuweisung
                  oder
                  feldabbildung,
                  ASSZEIT_TT            = zuweisung
                  LEERE_MENGE_ASSZEIT_TT= zuweisung
                  oder
                  feldabbildung,
                  LEERE_MENGE           = feldabbildung,

   feldabbildung: IF     bedingung  THEN  zuweisung
                         ELSEIF  bedingung  THEN  zuweisung
                  ...
                  ...
                  ...
                  ELSEIF  bedingung  THEN  zuweisung
                  OTHER                    zuweisung
                  ENDIF

                  oder

                  IF      bedingung  THEN  zuweisung
                  ...
                  ...
                  ...
                  IF      bedingung  THEN  zuweisung
                  OTHER                    zuweisung
                  ENDIF

                  oder

                  zuweisung

                  oder

                  SATZFUNKTION ( opcode, operand, ... )

   bedingung:     funktionsaufruf
                  oder
                  elementarbedingung
                  oder
                  logische verknüpfung von elementar-
                  bedingungen durch ( , ), &, !
                  oder
                 GRUPPENWECHSEL (feldname_einfach,...,feldnane_einfach)

   funktionsaufruf:
                  FUNKTION ( opcode, operand , ... )
                  oder
                  MENGENFUNKTION ( opcode, operand , ... )

   elementarbedingung:
                  operand  operator  operand
                  oder
                  operand

   operand:       feldname1
                  oder
                  NUM ( feldname1 )
                  oder
                  CHAR ( feldname2 )
                  oder
                  SUBSTR ( CHAR  ( feldname2 ), offset, laenge2 )
                  oder
                  KONSTANTE
                  oder
                  'relative_zeitangabe' (als String)

   feldname1:     feldname2
                  oder
                  SUBSTR   ( feldname_einfach, offset, laenge2 )
                  oder
                  SUBSTR   ( feldname2, offset, laenge2 )

   feldname2:     feldname_einfach
                  oder
                  feldname_einfach ( ag_angabe )
                  oder falls ASS-Wert
                  feldname_einfach ( ag_angabe, asszeit-angabe )

   ag_angabe:     AG = ZIEL
                  oder
                  AG = SELECT   ( nur innerhalb SELECT ! )
                  oder
                  AG = JOIN  ( nur innerhalb JOIN ! )

   asszeit-angabe:
      Monatsarbeitsgebiet:
                  ASSZEIT =        'jhjjmm'
                  oder
                  ASSZEIT = relative_zeitangabe
      Tagesarbeitsgebiet:
                  ASSZEIT_TT =        'jhjjmmtt'

   relative_zeitangabe:
                  BMnn mit 0 <= nn <= 99
                  oder
                  BPnn mit 0 <= nn <= 99
                  oder
                  nnMm mit 01 <= nn <= 16, 0 <= m <= 9
                  oder
                  nnPm mit 01 <= nn <= 16, 0 <= m <= 9

   offset:        positive ganzzahlige Konstante  1 ... 500

   laenge2:       positive ganzzahlige Konstante
                  bei SUBSTR:          1 ... 500

   operator:      logische Vergleichsoperatoren:  =, ^=, <, <=, >, >=

   zuweisung:     FORMEL  ( im ASS-Sinne,  nur für
                  numerische Felder oder Zeitangaben )
                  oder
                  operand
                  oder
                  operand !! operand
                  oder
                  funktionsaufruf
                  oder
                  zeitangabe
                  oder
                  SATZNUMMER
                  oder
                  SATZ_LOESCHEN  ( nur nach THEN in einer
                                   IF-Struktur )

   zeitangabe:    LETZTE_VERSORGUNG
                  oder
                  LAUFENDES_JAHR
                  oder
                  VORJAHR
                  oder
                  LAUFENDER_MONAT
                  oder
                  VORMONAT

   selectbedingung:
                  filterangabe    ( MENGENFUNKTION
                                    nicht erlaubt! )

   joinbedingung: bedingung       ( MENGENFUNKTION
                                    nicht erlaubt! )

   joinkriterium: ( ZIELFELDER  =   zielfelder,
                    JOINFELDER  =   joinfelder,
                    SORT            sortangabe,
                    DUP         =   duplikatsregel
                                     WHERE ( filterangabe ),
                    LEERE_MENGE =   LOESCHEN )

   zielfelder:    ( feldname3 !! feldname3 !! ... !! feldname3 )

   feldname3:     feldname_einfach
                  oder
                  SUBSTR   ( feldname_einfach, offset, laenge2 )

   joinfelder:    ( feldname3 !! feldname3 !! ... !! feldname3 )

   sortangabe:    ( feldname3  ASC  oder  DESC,
                    ...
                    ...
                    ...
                    feldname3  ASC  oder  DESC )

   duplikatsregel:
                  FIRST
                  oder
                  LAST
                  oder
                  PRIOR
                  oder
                  ALL

   filterangabe:  filterbedingung, ..., filterbedingung
                  ( maximal 5 ! )

   filterbedingung:
                  bedingung
                  oder
                  bedingung,
                  SORT  ( feldname3     ASC   oder   DESC,
                        ...
                        ...
                        feldname3     ASC   oder   DESC ),
                  LAST  ( feldname3, ..., feldname3 )
                  oder
                  SORT  ( feldname3     ASC   oder   DESC,
                        ...
                        ...
                        feldname3     ASC   oder   DESC ),
                  LAST  ( feldname3, ..., feldname3 )

                  ( MENGENFUNKTION bei bedingung nicht erlaubt! )

4.3 Operanden ( in alphabetischer Reihenfolge )

pInhaltsverzeichnis
nStichwortverzeichnis

   ag:            positive ganzzahlige Konstante  1, ..., 1999
                  oder
                  Char-Konstante der Länge  1, ..., 20

   ag_angabe:     AG = ZIEL
                  oder
                  AG = SELECT   ( nur innerhalb SELECT ! )
                  oder
                  AG = JOIN     ( nur innerhalb JOIN ! )

   arbeitsfeldangabe:
                  ASSZEIT bzw. ASSZEIT_TT
                  oder
                  FORMAT = format, LAENGE = laenge1,
                  KOMMASTELLEN = kommastellen

                  ASSZEIT = relative_zeitangabe

   asszeit-angabe:
          Monatsarbeitsgebiet:  ASSZEIT    = 'JHJJMM'
          Tagesarbeitsgebiet:   ASSZEIT_TT = 'JHJJMMTT'
                  oder
   bedingung:     funktionsaufruf
                  oder
                  elementarbedingung
                  oder
                  logische verknüpfung von elementar-
                  bedingungen durch ( , ), &, !
                  oder
                 GRUPPENWECHSEL (feldname_einfach,...,feldnane_einfach)

   bezugsmonat:   Zeitangabe in der Form 'JHJJMM'
                  BPnn mit 0 <= nn <= 99

   database:      für DB2-Tabellen        Database

   duplikatsregel:
                  FIRST
                  oder
                  LAST
                  oder
                  PRIOR
                  oder
                  ALL

   elementarbedingung:
                  operand  operator  operand
                  oder
                  operand

   feldabbildung: IF     bedingung  THEN  zuweisung
                  ELSEIF  bedingung  THEN  zuweisung
                  ...
                  ...
                  ...
                  ELSEIF  bedingung  THEN  zuweisung
                  OTHER            zuweisung
                  ENDIF
                  oder
                  IF     bedingung  THEN  zuweisung
                  ...
                  ...
                  ...
                  IF     bedingung  THEN  zuweisung
                  OTHER            zuweisung
                  ENDIF
                  oder
                  zuweisung
                  oder
                  SATZFUNKTION ( opcode, operand, ... )

   feldabbildung_mit_zeitangabe:
          Monatsarbeitsgebiet:
                  feldabbildung,
                  ASSZEIT             = zuweisung
                  LEERE_MENGE         = feldabbildung,
                  LEERE_MENGE_ASSZEIT = zuweisung
          bzw. Tagesarbeitsgebiet:
                  feldabbildung,
                  ASSZEIT_TT             = zuweisung
                  LEERE_MENGE            = feldabbildung,
                  LEERE_MENGE_ASSZEIT_TT = zuweisung
       oder
          Monatsarbeitsgebiet:
                  feldabbildung,
                  ASSZEIT             = zuweisung
                  LEERE_MENGE_ASSZEIT = zuweisung
          bzw. Tagesarbeitsgebiet:
                  feldabbildung,
                  ASSZEIT_TT             = zuweisung
                  LEERE_MENGE_ASSZEIT_TT = zuweisung
       oder
                  feldabbildung,
                  LEERE_MENGE         = feldabbildung,

   feldname_einfach:
                  Spaltenbezeichner, der syntaktisch
                  ein PLI-Bezeichner sein muss

   feldname1:     feldname2
                  oder
                  SUBSTR   ( feldname_einfach, offset, laenge2 )
                  oder
                  SUBSTR   ( feldname2, offset, laenge2 )

   feldname2:     feldname_einfach
                  oder
                  feldname_einfach ( ag_angabe )
                  oder falls ASS-Wert
                  feldname_einfach ( ag_angabe, asszeit-angabe )

   feldname3:     feldname_einfach
                  oder
                  SUBSTR   ( feldname_einfach, offset, laenge2 )

   feldzuweisung: zielfeld = feldabbildung_mit_zeitangabe
                  oder
                  zielfeld, ..., ..., zielfeld =
                    SATZFUNKTION ( opcode, operand, ... ),
                    LEERE_MENGE  ( opcode, operand, ... )

   filterangabe:  filterbedingung, ..., filterbedingung
                  ( maximal 5 ! )

   filterbedingung:
                  bedingung
                  oder
                  bedingung,
                  SORT  ( feldname3     ASC   oder   DESC,
                        ...
                        ...
                        feldname3     ASC   oder   DESC ),
                  LAST  ( feldname3, ..., feldname3 )
                  oder
                  SORT  ( feldname3     ASC   oder   DESC,
                        ...
                        ...
                        feldname3     ASC   oder   DESC ),
                  LAST  ( feldname3, ..., feldname3 )

                  ( MENGENFUNKTION bei bedingung nicht erlaubt! )

   format:        CHAR
                  oder
                  BIN
                  oder
                  PACKED

   funktionsaufruf:
                  FUNKTION ( opcode, operand , ... )
                  oder
                  MENGENFUNKTION ( opcode, operand , ... )

   joinangabe:    AG = ag
                  oder
                  AG = ag, DATABASE = database
                  oder
                  AG = ag, LESART = DIREKT
                  oder
                  AG = ag, NOSORT = nosort
                  oder
                  AG = ag, DATABASE = database,
                    LESART = DIREKT
                  oder
                  AG = ag, DATABASE = database,
                     NOSORT = nosort
                  oder
                  AG = ag, NOSORT = nosort,
                     LESART = DIREKT
                  oder
                  AG = ag, DATABASE = database,
                     LESART = DIREKT, NOSORT = nosort

   joinbedingung: bedingung    ( MENGENFUNKTION
                                 nicht erlaubt! )

   joinfelder:    ( feldname3 !! feldname3 !! ... !! feldname3 )

   joinkriterium: ( ZIELFELDER  =  zielfelder,
                    JOINFELDER  =  joinfelder,
                    SORT           sortangabe,
                    DUP         =  duplikatsregel
                                    WHERE ( filterangabe ),
                    LEERE_MENGE =  LOESCHEN )

   kommastellen:  positive ganzzahlige Konstante    1, ..., 4
                   ( nur bei FORMAT = PACKED erlaubt! )

   laenge1:       positive ganzzahlige Konstante
                  bei arbeitsfeldangabe abhängig von FORMAT:
                       bei CHAR:    1 ... 50
                       bei BIN:     1 ...  4
                       bei PACKED:  1 ...  8

   laenge2:       positive ganzzahlige Konstante
                  bei SUBSTR:        1, ..., 500

   monat:         positive ganzzahlige Konstante   12, ..., 16

                  nnMm mit 01 <= nn <= 16, 0 <= m <= 9
                  oder
                  nnPm mit 01 <= nn <= 16, 0 <= m <= 9
                  oder
                  funktionsaufruf
                  oder
                  zeitangabe
                  oder
                  SATZ_LOESCHEN  ( nur nach THEN in einer
                                   IF-Struktur )
                  oder
                  operand !! operand

   nosort:        ALL
                  oder
                  ZIEL
                  oder
                  JOIN

   offset:        positive ganzzahlige Konstante  1, ..., 500

   operand:       feldname1
                  oder
                  NUM ( feldname1 )
                  oder
                  CHAR ( feldname2 )
                  oder
                  SUBSTR ( CHAR  ( feldname2 ), offset, laenge2 )
                  oder
                  KONSTANTE
                  oder
                  'relative_zeitangabe' (als String)

   operator:      logische Vergleichsoperatoren:  =, ^=, <, <=, >, >

   option:        NUPDAT
                  oder
                  NUR_SYNTAX
                  oder
                  NUR_SEMANTIK
                  oder
                  BESTAND
                  oder
                  NO_DELTA
                  oder
                  NULLAUSGABE
                  oder
                  DISPLAY_ZEIT
                  oder
                  PROTO_ZEIT
                  oder
                  LINE_SEQUENTIAL (nur PC)

   regel:         positive ganzzahlige Konstante  1, ..., 1999
                  oder
                  Char-Konstante der Länge 1, ..., 20

   relative_zeitangabe:
                  BMnn mit 0 <= nn <= 99

   selectangabe:  AG = ag
                  oder
                  AG = ag, DATABASE = database
                  oder
                  AG = ag, LESART = DIREKT
                  oder
                  AG = ag, DATABASE = database,
                    LESART = DIREKT

   selectbedingung:
                  filterangabe    ( MENGENFUNKTION
                                    nicht erlaubt! )

   sortangabe:    ( feldname3  ASC  oder  DESC,
                    ...
                    ...
                    ...
                    feldname3  ASC  oder  DESC )

   zeitangabe:    LETZTE_VERSORGUNG
                  oder
                  LAUFENDES_JAHR
                  oder
                  VORJAHR
                  oder
                  LAUFENDER_MONAT
                  oder
                  VORMONAT

   zielfeld:      feldname_einfach
                  oder
                  feldname_einfach ( arbeitsfeldangabe )

   zielfelder:    ( feldname3 !! feldname3 !! ... !! feldname3 )

   zuweisung:     FORMEL  ( im ASS-Sinne, nur für
                            numerische Felder
                            oder Zeitangaben )

4.4 Mengenfunktionen

pInhaltsverzeichnis
nStichwortverzeichnis

   Folgende Mengenfunktionen stehen standardmäßig zur
   Verfügung:

   MENGENFUNKTION  ( SUMME, feldname )  Summe der Einträge
                                        unter feldname
                                        ( nur für numerische Felder )

   MENGENFUNKTION  ( MAX, feldname )    Maximum der Einträge
                                        unter feldname

   MENGENFUNKTION  ( MIN, feldname )    Minimum der Einträge
                                        unter feldname

   MENGENFUNKTION  ( ANZAHL )           Anzahl Sätze der
                                        Arbeitsdatei "work3"

4.5 Funktionen

pInhaltsverzeichnis
nStichwortverzeichnis

   Folgende Funktion steht standardmäßig zur Verfügung:

   FUNKTION ( ANZ-TAGE , feldname1, feldname2 )

   Wenn feldname1 und feldname2 im Format DATE vorliegen, wird
   die Anzahl der Tage zwischen den Datumsangaben ermittelt.
   Das Resultat wird im Format BINAER in der Länge 4
   bereitgestellt.

4.6 Erläuterungen

pInhaltsverzeichnis
nStichwortverzeichnis



 --> ZIELAG = ag und ABLEITUNG = regel müssen immer angegeben werden.
     Dabei ist ag eine gültige Arbeitsgebietsnummer oder -bezeichnung.
     Hingegen können die Angaben   MONATE_MAX = ...,  OPTIONEN = ...,
     BEZUGSMONAT = ...,  ORDNUNGSBEGRIFF = ... und  DATABASE = ...
     entfallen.

 --> Die Optionen bei OPTIONEN = ... müssen nicht alle angegeben
     werden. Die Reihenfolge der Optionen spielt keine Rolle.


 --> Wird die Option BESTAND angegeben, so muss auch
     ORDNUNGSBEGRIFF = ... bzw. SORT ORDNUNGSBEGRIFF = ...
     angegeben werden und umgekehrt. Beides ist nur für ASS-
     Arbeitsgebiete zulässig und steuert die Erzeugung von
     Gegenbuchungen für Bestandsarbeitsgebiete. Zusätzlich ist
     die Angabe eines Hilfsfeldes BESTANDSSATZART erforderlich.


 --> Die Arbeitsgebietsangabe AG = ... in Klammern hinter einem
     Feldnamen kann entfallen und ist innerhalb des
     Joinkriteriums bei Ziel- und Joinfeldern verboten. Die
     Angabe  von ASSZEIT = ...  bzw  ASSZEIT_TT = ...  an gleicher
     Stelle ist nur für ASS-Arbeitsgebiete als Input erlaubt.


 --> In Select-Angaben sind bei Feldnamen nur die Angaben
     AG = SELECT und AG = ZIEL zulässig, in Join-Angaben nur
     AG = JOIN und AG = ZIEL.


 --> Die WHERE-Klauseln bei SELECT, JOIN und im Joinkriterium
     bei DUP sind optional.


 --> Mengenfunktionen sind innerhalb der WHERE-Klauseln bei
     SELECT und JOIN sowie bei LEERE_MENGE = ... und
     LEERE_MENGE_ASSZEIT    = ...  bzw.
     LEERE_MENGE_ASSZEIT_TT = ...  nicht zulässig.


 --> Im Joinkriterium dürfen die Sortangabe, LEERE_MENGE =
     LOESCHEN und die WHERE-Klausel fehlen, DUP = ... jedoch
     nicht. Die Anzahl der Duplikatsbedingungen ist auf 5
     beschränkt. SORT ... und LAST ... in der
     Duplikatsbedingung müssen immer paarweise auftreten, die
     Bedingung darf fehlen.


 --> Die Funktion SUBSTR ist nur auf CHARACTER- oder ASSZEIT-
     Feldern erlaubt. Eine Schachtelung von SUBSTR ist nicht
     möglich.


 --> Für das Besetzen von Zielfeldern, genauer von Werte-
     Feldern in ASS-Arbeitsgebieten gilt:
     Die Angaben ASSZEIT = ..., LEERE_MENGE_ASSZEIT = ...
     und LEERE_MENGE = ... sind optional.
     Wird jedoch ASSZEIT = ... angegeben, so muss auch
     LEERE_MENGE_ASSZEIT = ... angegeben werden und umgekehrt.


 --> Die Angabe von KOMMASTELLEN ist nur bei FORMAT = PACKED
     erlaubt.


 --> NUM darf nur auf CHARACTER- oder ASSZEIT-Felder angewendet
     werden, CHAR nur auf BINAER- oder PACKED-Felder.


 --> Ein duplizierendes IF darf pro SELECT- bzw. JOIN-Block nur
     einmal vorkommen. Innerhalb einer Angabe LEERE_MENGE = ...
     ist ein derartiges IF nicht erlaubt.


 --> Wird optional MONATE_MAX angegeben, so ist der VORMONAT von
     01 (Januar) dieser Wert, sonst 12.


 --> Mit Hilfe der Datei ASSDATE kann man das Bezugsdatum für
     Zeitangaben festlegen. Dabei enthält ASSDATE das Datum in
     der Form JJMM. Wird in ASSDATE kein Datum festgelegt, so
     beziehen sich Zeitangaben immer auf das aktuelle Datum.


 --> Die Angabe von BEZUGSMONAT ist optional. Diese Angabe
     übersteuert sowohl das Maschinendatum als auch Angaben in
     ASSDATE.

Stichwortverzeichnis

nInhaltsverzeichnis

A B C D E F G I J K L M N O P R S T U V W Z