Kapitelübersicht



3 Definition von Ableitungsregeln
  3.1 Grundideen der Funktionsweise
  3.2 Interne Verarbeitungsweise
  3.3 Filterbedingungen
  3.4 Allgemeine Syntax des Joinkriteriums
  3.5 Besonderheiten bei DB2-Tabellen
  3.6 Option NOSORT fuer sortierte JOIN-Dateien
  3.7 Bedingungen innerhalb von SELECT und JOIN
  3.8 Feldzuweisungen
  3.9 Syntax der Feldzuweisung
  3.10 Die LEERE_MENGE-Angabe
  3.11 Typumwandlung (Cast)
  3.12 GRUPPENWECHSEL
  3.13 Zeitstempel / Deltabildung
  3.14 Quasikonstanten / Bezugsdatum / Parameter
  3.15 ASS-Bestandsarbeitsgebiete als Zielarbeitsgebiet
  3.16 ASS-Arbeitsgebiete als Input-Arbeitsgebiet
  3.17 Relative Zeitangaben bei der ASSZEIT
  3.18 Der aktuelle Zustand des aufzubauenden Zielarbeitsgebietes als Input-Arbeitsgebiet
  3.19 Wesentliche Programme der Ableitungsregeln
  3.20 Allgemeine Verarbeitungsoptionen
  3.21 Muster fuer Job-Control
  3.22 Ein- und Ausgabedateien
  3.23 Beispiel einer komplexen Ableitungsregel







    3  Definition von Ableitungsregeln


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis




    3.1  Grundideen der Funktionsweise


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


   - Aufbau von Schnittstellensaetzen durch sukzessives Besetzen
     von Feldern. Bei ASS-Ziel-Arbeitsgebieten ist das Resultat
     eine kurze Schnittstelle mit Bewegungssaetzen.

   - 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 ergaenzt. Diese Datenmanipulation
     resultiert in
     - Besetzen von Feldern
     - Hinzufuegen oder Weglassen von Saetzen

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



   Abbildung: Kunde / Vertrag


   Beispiel:
   - AG  Kunde
     mit Feldern Kundennummer, Adresse, Aenderungsdatum

   - 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


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


 --> Aufgrund der zu besetzenden Felder des Zielarbeitsgebietes
     wird fuer die Verarbeitung ein (maximales) Satzformat
     festgelegt. Dieses aendert sich waehrend der gesamten
     Ableitungsregel nicht. Neben den Feldern des
     Zielarbeitsgebietes koennen dort auch Hilfsfelder (lokal
     fuer die Ableitungsregel definiert) enthalten sein.

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

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

 --> P r o  Satz der WORK1 Bilden einer Joinmenge (WORK3). Alle
     Saetze dieser Datei erfuellen das Joinkriterium und
     gegebenenfalls angegebene Filterbedingungen. Das Resultat
     kann in Abhaengigkeit von der Duplikatsbedingung (first,
     last, all)
     - eine leere Datei
     - ein Satz
     - mehrere Saetze
     sein.

 --> Durchfuehren der im JOIN angegebenen Feldzuweisungen.
     Aufgrund der WORK3 kann der aktuelle WORK1-Satz wegfallen
     oder vervielfaeltigt werden. Fuer den Fall der leeren Menge
     wurde daher eine feldspezifische Behandlung geschaffen.

 --> Alle im Zielarbeitsgebiet definierten Felder muessen 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 Erhoehung der Performance






    3.3  Filterbedingungen


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


   Einschraenkung auf die relevanten Saetze 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
   Saetze werden in maximal 5 Teilschritten jeweils durch eine
   Bedingung gefiltert, sortiert und anschliessend bezueglich
   des unter LAST angegebenen Gruppenwechselbegriffs nochmals
   gefiltert. Dabei koennen gegebenenfalls Teilangaben fehlen.

   Beispiel fuer 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
   Saetze mit den Satznummern 2, 3 und 5.

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

   -  Globale Joinbedingung auf alle Saetze des Join-
      Arbeitsgebietes, z.B. nur alle Saetze mit einem bestimmten
      Bearbeitungsdatum. Es duerfen nur Felder aus dem aktuellen
      Join-Arbeitsgebiet angesprochen werden. Aus
      Performancegruenden sollten globale Joinbedingungen, d.h.
      genauer Bedingungen, deren Operanden sich
      ausschliesslich auf das Join-Arbeitsgebiet beziehen, als
      solche auch formuliert werden. Dadurch werden nicht zu
      verarbeitende Saetze schnell gefiltert und fliessen nicht
      in eine komplexe Folgeverarbeitung ein.

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

   -  Filter, der vom aktuellen WORK1-Satz abhaengt. Hierbei
      Mehrfachverarbeitung mit Ermittlung des letzten Satzes
      bezueglich eines Gruppenwechselbegriffs moeglich. Beispiel:
      Beim JOIN sollen nur alle aktiven Vertraege zu einem Kunden
      beruecksichtigt 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


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


   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


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


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



   In den Faellen, 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 koennen. Werden diese Angaben
   zur genauen Qualifizierung im DB2-System benoetigt, so koennen
   diese in der Ableitungsregeln unter DATABASE erfolgen.


   Die Struktur einer DB2-Tabelle kann ASS aufzwei Weisen uebergeben
   werden. Entweder erfolgt in der ST06 eine Beschreibung der Struktur
   analog zu sequentiellen Dateien, wobei wiederum nur die Felder
   angegeben werden muessen, 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 Pruefungen.

   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 fuer sortierte JOIN-Dateien


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


   In der Praxis kommt es vor, dass eine Join-Datei bereits nach
   dem gewuenschten Join-Kriterium sortiert vorliegt, der interne
   Sort mithin ueberfluessig ist. Gleiches gilt fuer den aktuellen
   Stand der Grundmenge. Dieses fuehrt bei grossen Datenvolumina
   zu unnoetigen Performance-Verlusten. Daher ist es moeglich,
   durch entsprechende Angaben in der Ableitungsregel, die interne
   Sortierung nach dem Join-Kriterium zu unterbinden.


   JOIN (  AG = arbeitgebietsbezeichnung,
           NOSORT = nn)


   wobei fuer nn die folgenden Angaben moeglich 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


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


   Fuer die Operanden in Bedingungen gilt das gleiche wie
   spaeter fuer 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 duerfen 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


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


   -  Feldbesetzungen ergeben sich allgemein aus Formeln. Als
      Operanden duerfen 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 Abhaengigkeit von Bedingungen (IF /
      ELSE) erfolgen. Die Bedingungen sind dabei logische
      Ausdruecke. 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
      Abhaengigkeit vom Aufruf unterschiedliche Werte zurueck:
      Aufteilen von Jahresbeitrag auf einzelne Monate.






    3.9  Syntax der Feldzuweisung


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


        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 geloescht wird.

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






    3.10 Die LEERE_MENGE-Angabe


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


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

   - 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 Loeschen des aktuellen
   Satzes, zu dem eine Join-Menge gebildet werden soll, aus
   der Grundmenge fuehrt, 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
   Verfuegung, 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 fuer das Besetzen der ASS-Zeit
   bei Werte-Feldern, falls das Zielarbeitsgebiet ein ASS-
   Arbeitsgebiet ist.






    3.11  Typumwandlung (Cast)


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


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

   - SUBSTR (FELD, OFFSET, LAENGE)

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

   Beispiel:
             DATUM_CHAR = CHAR (DATUM_BIN)

   Das Ergebnisformat haengt vom Operanden ab:

   NUM (FELD_CHAR)  ->   dezimal gepackt 8 Bytes,
                         Komma (Anzahl Kommastellen)
                         und Vorzeichen des
                         Charakterstrings werden
                         interpretiert.
                         ACHTUNG: Vorzeichen wird
                                  rechts erwartet.
                         Fuehrende und abschliessende Blanks sind
                         zulaessig. Nur Blanks ergeben 0.

   Beispiel fuer zulaessigen Operandeninhalt: 123,12-

   CHAR (FELD_NUM)
       ->  4   Bytes, falls FELD_NUM 1 Bytes binaer
           6   Bytes, falls FELD_NUM 2 Bytes binaer
           8   Bytes, falls FELD_NUM 3 Bytes binaer
          11   Bytes, falls FELD_NUM 4 Bytes binaer
           2 * Feldlaenge von FELD_NUM, falls FELD_NUM
                                        dezimal gepackt,
                                        eventuell zusaetzlich
                                        ein Byte fuer Komma






    3.12  GRUPPENWECHSEL


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


   Es gibt Anwendungsfaelle, wo das Besetzen von Feldinhalten
   in Abhaengigkeit davon geschehen soll, ob ein zu verarbeitender
   Inhalt zum ersten Mal vorkommt oder nicht. In diesem Zusammenhang
   taucht die Notwendigkeit auf, festzustellen, ob zum Vorgaengersatz
   bezueglich bestimmter Felder ein Gruppenwechsel - ein Inhalt hat
   sich geaendert - 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 bezueglich des Inputs untersucht,
   d.h. genau im ersten Schritt (SELECT) bezueglich des einzulesenden
   SELECT-Arbeitsgebietes (nach Auswertung von WHERE- und SORT-Angaben)
   und im Folgenden bezueglich des aktuellen Stands der Grundmenge.
   Der Gruppenwechsel bezieht sich nie auf Join-Arbeitsgebiete.
   Dementsprechend duerfen auch nur die Felder in der Gruppenwechsel-
   Anweisung gewaehlt werden.






    3.13  Zeitstempel / Deltabildung


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


   Aufgrund der Forderung der Vollstaendigkeit der Historie
   bezueglich komplexer Ableitungen ist es in einigen
   Arbeitsgebieten sinnvoll, dass alte Saetze 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 uebernommen wurden.




   Beispiel:


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

   Zu jedem (Basis-)Arbeitsgebiet laesst 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 Berueck-
   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-Beruecksichtigung kann auf zweierlei Weisen
   beeinflusst werden:
   - Unterdrueckung durch Angabe der Option NO_DELTA ->
     komplette Datenuebernahme
   - Unterdrueckung der Pflege des Zeitstempels beim
     Zielarbeitsgebiet durch Angabe der Option NUPDAT
     (nur fuer 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 hierfuer ein Feld als Zeitstempel-Feld
   definiert werden, das dann durch die Ableitung automatisch
   versorgt wird. Dieses Feld
   - muss das Format dezimal gepackt der Laenge 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


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


   In der Ableitungsregel kann auf bestimmte Daten Bezug genommen
   werden, die quasi konstant sind. Hierzu zaehlen
   - 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 Feldlaenge haengen von
     der Definition des entsprechenden Zeitstempels ab.
   - SATZNUMMER, die aktuelle Satznummer desjenigen Satzes, der durch
     die Ableitungsregel fuer das Zielarbeitsgebiet aktuell aufgebaut
     wird. Dadurch koennen die Saetze im Ziel innerhalb jedes
     Select- bzw. Join-Steps numeriert werden. Bei der Satznummer
     handelt es sich um ein 4 Bytes bin„r Feld. Einschraenkung: 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) uebersteuert
   werden. Diese Angabe laesst sich wiederum durch
   BEZUGSMONAT = JHJJMM in der Ableitungsregel uebersteuern.

   In den Saetzen 2 bis n koennen 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

   Standardmaessig wird fuer die Ermittlung des Vormonats mit
   12 Monaten pro Kalenderjahr gerechnet. Diese Angabe laesst
   sich in der Ableitungsregel uebersteuern.

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






    3.15  ASS-Bestandsarbeitsgebiete als Zielarbeitsgebiet


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


   Fuer Bestandsarbeitsgebiete im ASS ist es im allgemeinen
   nicht moeglich, beispielsweise bei Zustandsaenderungen von
   Vertraegen, aus den Quellarbeitsgebieten heraus via
   Anweisungen in der Ableitungsregel die korrekten
   Schnittstellensaetze zu erzeugen, da unter Umstaenden bei
   komplexen Zusammenhaengen nicht mehr alle Informationen zur
   Verfuegung stehen. Daher existieren Sprachmittel, die die
   Erzeugung von Gegenbuchungen aus dem Zielarbeitsgebiet
   heraus ermoeglichen:



       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 ueber
     den Ordnungsbegriff


  -  Bei Duplikaten im Select-Arbeitsgebiet bezueglich des
     Ordnungsbegriffs, z.B. mehrere Vertragsaenderungen seit der
     letzten Uebernahme, Sortierung der Saetze nach
     SORT_ORDNUNGSBEGRIFF (z.B. Historiennummer)


  -  Definition eines Hilfsfeldes BESTANDSSATZART


  -  Die Ausgabe der Schnittstellensaetze erfolgt zusaetzlich in
     einer Datei ASSOUBB, in der Positivbuchungen und
     Negativbuchungen im Feld BESTANDSSATZART unterschiedlich
     gekennzeichnet sind






    3.16  ASS-Arbeitsgebiete als Input-Arbeitsgebiet


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


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



   In der obigen Tabelle bezeichnen Si Schluessel und Wj Werte
   im ASS-Sinne. Eine Zeile W(j,tk) steht fuer einen Wert, der
   nur fuer den Zeitaspekt tk von Null verschieden ist. Die
   ASSZEIT wird auf eine eigene Spalte abgebildet. Das
   dargestellte Format ist ein maximales Format. In
   Abhaengigkeit von den aufgrund der Ableitungsregel
   angeforderten Schluessel, Werte und Zeiten koennen einzelne
   Zeilen entfallen.

   In der Ableitungssprache werden analog zu den
   Basisarbeitsgebieten Schluessel und Werte ueber ihren
   Bezeichner angesprochen. Die ASS-Zeit wird ueber den Pseudo-
   Schluessel 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 unterstuetzt 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 zugehoerigen
     Zeitaspekte werden intern aus den Angaben zum Schluessel
     ASSZEIT bzw. ASSZEIT_TT ermittelt. Fehlen Angaben hierzu, so wird
     der gesamte Einspeicherungszeitraum als angefordert betrachtet.

   Welche Schluessel, Werte und Zeiten aus dem ASS-
   Arbeitsgebiet im aktuellen SELECT / JOIN-Step betrachtet
   werden, haengt ausschliesslich von der Ableitung ab. Alle
   angesprochenen Felder aus dem Arbeitsgebiet, unabhaengig
   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-
   Schluessel ASSZEIT bzw. ASSZEIT_TT als angefordert und wird unter
   Umstaenden ergaenzt. 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 fuer
   die ASS-Zeit ermittelt. Dieses ist gegebenenfalls das
   gesamte Einspeicherungsintervall des Arbeitsgebietes (siehe
   oben). Bezueglich 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;



   Unabhaengig vom Quellarbeitsgebiet kann das
   Zielarbeitsgebiet wiederum ein ASS-Arbeitsgebiet sein. In
   diesem Fall sind (ASS-)Werte mit der zugehoerigen 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 ueblich allgemein
   durch eine Formel. Das obige Beispiel stellt hierbei einen
   Sonderfall dar. Es wird Bezug genommen auf den intern
   ergaenzten Schluessel ASSZEIT, der aktuelle Inhalt wird
   uebernommen.


   In allen Beispielen werden nur Saetze ausgegeben, wenn der
   Werteinhalt von Null verschieden ist. Allgemein entsteht
   ein Satz nur dann, wenn der Werteinhalt eines angegebenen
   Wertes von Null verschieden ist. Moechte man derartige
   "Nullsaetze" bezueglich 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 abhaengig von der / den benutzten
   Verdichtungsstufen aus denen die ASS-Summendaten gelesen
   werden. Es koennen nur Saetze ausgegeben werden, die auf
   den entsprechenden Verdichtungsstufen vorhanden sind.
   Aufgrund der internen Speicherungslogik von ASS-Summendaten
   ist es moeglich, dass auf einer Basisverdichtungsstufe
   Schluesselinhaltskombinationen existieren, die auf hoeheren
   Verdichtungsstufen aufgrund der Verdichtung nicht
   vorkommen. Daher ist die Angabe der Option nur dann ratsam,
   wenn gewaehrleistet ist, dass eine echte
   Basisverdichtungsstufe vorhanden ist und die zu
   selektierenden Daten aufgrund der Ableitungsregel durch
   Anforderung aller Schluessel des Arbeitsgebietes aus dieser
   Basis gewonnen werden.






    3.17  Relative Zeitangaben bei der ASSZEIT


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


   Analog zur ASS-Auswertung ist beim Schluessel ASSZEIT und
   bei den ASSZEIT-Angaben zu ASS-Werten der relative Bezug
   auf das Maschinendatum beziehungsweise auf den
   uebersteuernd angegebenen Bezugsmonat moeglich.

   Moeglich 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 standardmaessig 12. Sie kann
   durch die Angabe von MONATE_MAX auf eine Anzahl zwischen 13
   und 16 erhoeht werden.

   Eine relative Zeitangabe beim Schluessel 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


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


   Innerhalb einer Ableitungsregel ist es moeglich, 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 kuenstliches Arbeitsgebiet mit einer
   entsprechenden Arbeitsgebietsbeschreibung angelegt. Der
   Umfang des Arbeitsgebietes (bekannte Felder, Anzahl Saetze)
   ist demnach dynamisch. Insbesondere zu beachten ist die
   zusaetzliche Qualifkation der zu besetzenden Felder durch
   die Angaben von AG = JOIN bzw. AG = ZIEL. Die aktuellen
   Inhalte dieser Felder waehrend der Verarbeitung sind im
   allgemeinen verschieden.






    3.19  Wesentliche Programme der Ableitungsregeln


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


     PCL4003: Steuerung
       MCL4016: Sprachanalyse
       MCL4018: Formeln umsetzen
       MCL4017: Einlesen der Arbeitsgebietsinformationen
       MCL4015: Feldinformation fuer DB2-AG aus IBM-Systemkatalog
       MCL4009: Erzeugung der Schnittstellendatei
         MCL4003: Erzeugung aktueller Join-Datei (meistens Cache)
         MCL4004: Erzeugung kurzer Schnittstelle fuer 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 Konsistenzpruefungen
                    (bis einschliesslich MCL4017)



   Zusaetzliche Dokumentation von Laufzeiten in MCL4009:
   ----------------------------------------------------


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






    3.20  Allgemeine Verarbeitungsoptionen


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


   LINE_SEQUENTIAL: Diese Option ist nur fuer eine PC-
     Installation gedacht. Gewoehnlich erzeugt die DW-Kompo-
     nente Schnittstellendateien mit variablen Satzlaengen
     (Ladebestaende fuer 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 fuer Job-Control


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


   //PG999513 JOB  (PG9999,ASS,E),'ODI  PST4003',
   //             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 S T 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


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


   KARTE            Ableitungsregel
   ASSDATE          Bezugsdatum und Parameter
   LISTE            Protokoll
   WORK1-WORK6      temporaere Work-Dateien
   SORTWK1, SORTWK2 Arbeitsdateien fuer Systemsort
   ASSOUMM          Kopfsatz, falls Zielarbeitsgebiet ASS-AG
   ASSOUNN          Schnittstellendatei bzw. Summensaetze
   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


Kapitelübersicht
Inhaltsverzeichnis
Stichwortverzeichnis


 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;





Vorheriges Kapitel: 2 Beschreibung von Basisarbeitsgebieten

Nächstes Kapitel:   4 Sprache