Dokumentationsübersicht

Inhaltsverzeichnis

ASS Benutzerhandbuch
ASS Data Warehouse

a

1 Einführung

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

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 Schnittstellenprogrammierung 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

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

Art des Arbeitsgebietes

Bislang sind Basisarbeitsgebiete in folgender Form möglich:

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:

Typ Kürtzel Beschreibung
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

3.1 Grundideen der Funktionsweise

i

Abbildung: Kunde / Vertrag

Beispiel:

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

3.3 Filterbedingungen

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:

SatznummerKundennummer
14711
24711
34712
44713
54713

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:

3.4 Allgemeine Syntax des Joinkriteriums

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

   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

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

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

3.8 Feldzuweisungen

3.9 Syntax der Feldzuweisung

        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

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

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)

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

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

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:

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ücksichtigung 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:

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

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

3.14 Quasikonstanten / Bezugsdatum / Parameter

In der Ableitungsregel kann auf bestimmte Daten Bezug genommen werden, die quasi konstant sind. Hierzu zählen

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

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;

3.16 ASS-Arbeitsgebiete als Input-Arbeitsgebiet

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:

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

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

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

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

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

LINE_SEQUENTIAL: Diese Option ist nur für eine PC-Installation gedacht. Gewöhnlich erzeugt die DW-Komponente 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

//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

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

 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

4.1 Rahmen für Ableitungsregel

   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 )

   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 elementarbedingungen 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 )

   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

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

4.5 Funktionen

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

Stichwortverzeichnis

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