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