Allgemeines Statistik System
Benutzerhandbuch
ASS - DataWarehouse
DokumentationsübersichtAA SSSSSS SSSSSS AAAA SS SS SS SS AA AA SS SS AA AA SS SS AAAAAAAAAA SSSSSSS SSSSSSS AA AA SS SS AA AA SS SS AA AA SS SS SS SS AAAA AAAA SSSSSS SSSSSS ASS - DataWareHouse ------------------- Buerger
Mit dem ASS Data-Warehouse steht eine Komponente zur Verfuegung, die als Erweiterung zum bisherigen ASS zu verstehen ist. Gegenueber dem bisherigen Einsatz erlaubt diese Systemerweiterung insbesondere - eine Speicherung von ASS-Daten in offenem Speicherformat (SQL) und - die Versorgung von ASS-Arbeitsgebieten mittels einer eigenen Abfragesprache (Ableitungen), wodurch die Programmierung herkoemmlicher Schnittstellen vollstaendig ersetzt werden kann.
Abbildung 1: ASS-Data-Warehouse-Konzept Zur direkten Uebernahme von Daten aus operativen Systemen in das ASS Data-Warehouse muessen diese Daten in einer standardisierten Form vorliegen. Andernfalls muessen diese Daten mittels Schnittstellen- programmierung in diese geeignete Form ueberfuehrt werden. Im ASS-Sprachgebrauch stehen somit sogenannte Basis- Arbeitsgebiete zur Verfuegung, aus denen mittels Ableitungen entweder herkoemmliche ASS-Arbeitsgebiete in komprimierter Form oder Tabellen mit offener Speicherungsform gebildet werden koennen. Ein abgeleitetes Arbeitsgebiet wird aus n Arbeitsgebieten versorgt. Daraus resultieren n Ableitungen, die jeweils Aktualisierungen ( Differenzen, Deltas ) in das abgeleitete Zielarbeitsgebiet einarbeiten. Voraussetzung fuer komplexe Ableitungsregeln ist die Vollstaendigkeit bezueglich der Historie, die insbesondere fuer die Generierung von Bestandswerten in Bewegungsform benoetigt wird.
Zur Beschreibung der Basisarbeitsgebiete wurde der Dialog "ST06" (Verwaltung der ASS-Metadaten) erweitert. Art des Arbeitsgebietes ----------------------- Bislang sind Basisarbeitsgebiete in folgender Form moeglich: - DB2-Tabellen - sequentielle Dateien - sequentielle Dateien (CSV: Semikolon separiert) Die Datensaetze werden offen gespeichert und haben alle den gleichen Aufbau.
Abbildung 2: Beschreibung Basisarbeitsgebiet Schluessel des Basisarbeitsgebietes ----------------------------------- Die zu einem Basisarbeitsgebiet gehoerenden Felder werden mit ihren Attributen (Format, Laenge, Offset, Anzahl Kommastellen) definiert. Bei einem CSV-Arbeitsgebiet gilt: Die Feldnr definiert die Spaltennummer, der Offset gibt den Offset innerhalb der Spalte an, Laenge gibt die maximale Feldlaenge an.
Abbildung 3: Schluessel des Basisarbeitsgebietes Folgende Formate werden derzeit unterstuetzt: char C maximal 50 Bytes binaer B maximal 4 Bytes dezimal gepackt P maximal 8 Bytes (15 Dezimalstellen), Festlegung der Anzahl von Kommastellen timestamp TS DB2-Format, fixe Laenge 26 Bytes time T DB2-Format, fixe Laenge 8 Bytes date D DB2-Format, fixe Laenge 10 Bytes Die DB2-Formate werden intern wie das Char-Format behandelt. Beim Abspeichern muessen die Inhalte den entsprechenden DB2-Konventionen genuegen. Durch Anhaengen von Postfix-Z in der Eingabemaske (z.B. CZ) wird das entsprechende Feld als Zeitstempel ausgewiesen.
Abbildung 4: Attribute von Schluesseln des Basisarbeitsgebietes Bei DB2-Tabellen kann gewoehnlich auf die Beschreibung der Felder verzichtet werden. Die hierfuer noetigen Informationen (Feldname, Feldformat, Feldlaenge) 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.
- 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;
--> 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
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;
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.
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;
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
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.
- 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.
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.
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.
- 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
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.
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.
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;
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
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.
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;
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.
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
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.
//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)
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.
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;
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 ausser dem ersten sind optional und duerfen in beliebiger Reihenfolge angegeben werden. Die Feldzuweisungen bei Folge-Select-Steps duerfen fehlen.
ag: positive ganzzahlige Konstante 1, ..., 1999 oder Char-Konstante der Laenge 1, ..., 20 database: fuer DB2-Tabellen Database regel: positive ganzzahlige Konstante 1, ..., 1999 oder Char-Konstante der Laenge 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 abhaengig 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 verknuepfung von elementar- bedingungen durch ( , ), &, ! oder GRUPPENWECHSEL (feldname_einfach,...,feldnane_einfach) funktionsaufruf: FUNKTION ( opcode, operand , ... ) oder MENGENFUNKTION ( opcode, operand , ... ) elementarbedingung: operand operator operand oder operand operand: feldname1 oder NUM ( feldname1 ) oder CHAR ( feldname2 ) oder SUBSTR ( CHAR ( feldname2 ), offset, laenge2 ) oder KONSTANTE oder 'relative_zeitangabe' (als String) feldname1: feldname2 oder SUBSTR ( feldname_einfach, offset, laenge2 ) oder SUBSTR ( feldname2, offset, laenge2 ) feldname2: feldname_einfach oder feldname_einfach ( ag_angabe ) oder falls ASS-Wert feldname_einfach ( ag_angabe, asszeit-angabe ) ag_angabe: AG = ZIEL oder AG = SELECT ( nur innerhalb SELECT ! ) oder AG = JOIN ( nur innerhalb JOIN ! ) asszeit-angabe: Monatsarbeitsgebiet: ASSZEIT = 'jhjjmm' oder ASSZEIT = relative_zeitangabe Tagesarbeitsgebiet: ASSZEIT_TT = 'jhjjmmtt' relative_zeitangabe: BMnn mit 0 <= nn <= 99 oder BPnn mit 0 <= nn <= 99 oder nnMm mit 01 <= nn <= 16, 0 <= m <= 9 oder nnPm mit 01 <= nn <= 16, 0 <= m <= 9 offset: positive ganzzahlige Konstante 1 ... 500 laenge2: positive ganzzahlige Konstante bei SUBSTR: 1 ... 500 operator: logische Vergleichsoperatoren: =, ^=, <, <=, >, >= zuweisung: FORMEL ( im ASS-Sinne, nur fuer 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! )
ag: positive ganzzahlige Konstante 1, ..., 1999 oder Char-Konstante der Laenge 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 verknuepfung von elementar- bedingungen durch ( , ), &, ! oder GRUPPENWECHSEL (feldname_einfach,...,feldnane_einfach) bezugsmonat: Zeitangabe in der Form 'JHJJMM' BPnn mit 0 <= nn <= 99 database: fuer 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 abhaengig 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 Laenge 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 fuer numerische Felder oder Zeitangaben )
Folgende Mengenfunktionen stehen standardmaessig zur Verfuegung: MENGENFUNKTION ( SUMME, feldname ) Summe der Eintraege unter feldname ( nur fuer numerische Felder ) MENGENFUNKTION ( MAX, feldname ) Maximum der Eintraege unter feldname MENGENFUNKTION ( MIN, feldname ) Minimum der Eintraege unter feldname MENGENFUNKTION ( ANZAHL ) Anzahl Saetze der Arbeitsdatei "work3"
Folgende Funktion steht standardmaessig zur Verfuegung: 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 Laenge 4 bereitgestellt.
--> ZIELAG = ag und ABLEITUNG = regel muessen immer angegeben werden. Dabei ist ag eine gueltige Arbeitsgebietsnummer oder -bezeichnung. Hingegen koennen die Angaben MONATE_MAX = ..., OPTIONEN = ..., BEZUGSMONAT = ..., ORDNUNGSBEGRIFF = ... und DATABASE = ... entfallen. --> Die Optionen bei OPTIONEN = ... muessen nicht alle angegeben werden. Die Reihenfolge der Optionen spielt keine Rolle. --> Wird die Option BESTAND angegeben, so muss auch ORDNUNGSBEGRIFF = ... bzw. SORT ORDNUNGSBEGRIFF = ... angegeben werden und umgekehrt. Beides ist nur fuer ASS- Arbeitsgebiete zulaessig und steuert die Erzeugung von Gegenbuchungen fuer Bestandsarbeitsgebiete. Zusaetzlich ist die Angabe eines Hilfsfeldes BESTANDSSATZART erforderlich. --> Die Arbeitsgebietsangabe AG = ... in Klammern hinter einem Feldnamen kann entfallen und ist innerhalb des Joinkriteriums bei Ziel- und Joinfeldern verboten. Die Angabe von ASSZEIT = ... bzw ASSZEIT_TT = ... an gleicher Stelle ist nur fuer ASS-Arbeitsgebiete als Input erlaubt. --> In Select-Angaben sind bei Feldnamen nur die Angaben AG = SELECT und AG = ZIEL zulaessig, in Join-Angaben nur AG = JOIN und AG = ZIEL. --> Die WHERE-Klauseln bei SELECT, JOIN und im Joinkriterium bei DUP sind optional. --> Mengenfunktionen sind innerhalb der WHERE-Klauseln bei SELECT und JOIN sowie bei LEERE_MENGE = ... und LEERE_MENGE_ASSZEIT = ... bzw. LEERE_MENGE_ASSZEIT_TT = ... nicht zulaessig. --> Im Joinkriterium duerfen die Sortangabe, LEERE_MENGE = LOESCHEN und die WHERE-Klausel fehlen, DUP = ... jedoch nicht. Die Anzahl der Duplikatsbedingungen ist auf 5 beschraenkt. SORT ... und LAST ... in der Duplikatsbedingung muessen immer paarweise auftreten, die Bedingung darf fehlen. --> Die Funktion SUBSTR ist nur auf CHARACTER- oder ASSZEIT- Feldern erlaubt. Eine Schachtelung von SUBSTR ist nicht moeglich. --> Fuer das Besetzen von Zielfeldern, genauer von Werte- Feldern in ASS-Arbeitsgebieten gilt: Die Angaben ASSZEIT = ..., LEERE_MENGE_ASSZEIT = ... und LEERE_MENGE = ... sind optional. Wird jedoch ASSZEIT = ... angegeben, so muss auch LEERE_MENGE_ASSZEIT = ... angegeben werden und umgekehrt. --> Die Angabe von KOMMASTELLEN ist nur bei FORMAT = PACKED erlaubt. --> NUM darf nur auf CHARACTER- oder ASSZEIT-Felder angewendet werden, CHAR nur auf BINAER- oder PACKED-Felder. --> Ein duplizierendes IF darf pro SELECT- bzw. JOIN-Block nur einmal vorkommen. Innerhalb einer Angabe LEERE_MENGE = ... ist ein derartiges IF nicht erlaubt. --> Wird optional MONATE_MAX angegeben, so ist der VORMONAT von 01 (Januar) dieser Wert, sonst 12. --> Mit Hilfe der Datei ASSDATE kann man das Bezugsdatum fuer Zeitangaben festlegen. Dabei enthaelt ASSDATE das Datum in der Form JJMM. Wird in ASSDATE kein Datum festgelegt, so beziehen sich Zeitangaben immer auf das aktuelle Datum. --> Die Angabe von BEZUGSMONAT ist optional. Diese Angabe uebersteuert sowohl das Maschinendatum als auch Angaben in ASSDATE.
A B C D E F G I J K L M N O P R S T U V W Z