Verarbeitung von Datumsinformationen

#### Search Results

Search

# Verarbeitung von Datumsinformationen

Dieses Dokument behandelt verschiedene Aspekte der Behandlung von Datumsinformationen in Ihren Natural-Anwendungen.

Folgende Themen werden behandelt:

- Editiermasken für Datumsfelder und Datumssystemvariablen

- Standard-Editiermaske für Datum — der DTFORM-Parameter

- Datumsformat für alphanumerische Darstellung — der DF-Parameter

- Datumsformat für Ausgabe — der DFOUT-Parameter

- Datumsformat für Stack — der DFSTACK-Parameter

- Gleitendes Jahr-Fenster — der YSLW-Parameter

- Kombinationen von DFSTACK und YSLW

- Festes Jahr-Fenster

- Datumsformat für Standard-Seitenüberschriften — der DFTITLE-Parameter

## Editiermasken für Datumsfelder und Datumssystemvariablen

Wenn Sie den Wert eines Datumsfeldes in einer bestimmten Form ausgeben möchten, geben Sie normalerweise für das Feld eine Editiermaske an. Mit der Editiermaske bestimmen Sie Zeichen für Zeichen, wie die Ausgabe aussehen soll.

Falls Sie das aktuelle Datum in einer bestimmten Form verwenden möchten, brauchen Sie hierfür kein Datumsfeld mit einer entsprechenden Editiermaske zu definieren; stattdessen können Sie einfach eine Datumssystemvariable verwenden. Natural bietet verschiedene Datumssystemvariablen, die alle das aktuelle Datum in unterschiedlichen Darstellungsformen enthalten. Bei manchen dieser Darstellungsformen ist die Jahreszahl zweistellig, bei manchen vierstellig.

Weitere Informationen sowie eine Liste aller Datumssystemvariablen finden Sie in der Systemvariablen-Dokumentation.

## Standard-Editiermaske für Datum — der DTFORM-Parameter

Der Profilparameter `DTFORM` bestimmt das Standardformat, das für Datumsangaben als Teil von Natural-Standard-Reporttiteln, für Datumskonstanten und für Datumseingaben gilt.

Dieses Datumsformat bestimmt die Reihenfolge der Angaben für Tag, Monat und Jahr sowie die Trennzeichen, die zwischen diesen Angaben stehen müssen.

Mögliche `DTFORM`-Einstellungen sind:

Setting | Datumsformat1 | Beispiel2
--- | --- | ---
`DTFORM=I` | `yyyy-mm-dd` | `2014-01-31`
`DTFORM=G` | `dd.mm.yyyy` | `31.01.2014`
`DTFORM=E` | `dd/mm/yyyy` | `31/01/2014`
`DTFORM=U` | `mm/dd/yyyy` | `01/31/2014`

1 `dd` = day/Tag, `mm` = month/Monat, `yyyy` = year/Jahr
2 Es wird angenommen, dass `DF` oder `DFTITLE` auf `L` gesetzt ist.

Der `DTFORM`-Parameter kann im Natural-Parametermodul oder dynamisch beim Aufruf von Natural gesetzt werden. Standardmäßig gilt `DTFORM=I`.

## Datumsformat für alphanumerische Darstellung — der DF-Parameter

Wenn eine Editiermaske angegeben ist, wird die Darstellung des Feldwertes durch die Editiermaske bestimmt. Wenn keine Editiermaske angegeben ist, wird die Darstellung des Feldwertes durch den Session-Parameter `DF` in Kombination mit dem `DTFORM`-Profilparameter bestimmt.

Mit dem `DF`-Parameter können Sie eine der folgenden Datumsdarstellungen wählen:

`DF=S` | 8-Byte-Darstellung mit 2-stelliger Jahreszahl und Begrenzungszeichen. Beispiel: `yy-mm-dd`
`DF=I` | 8-Byte-Darstellung mit 4-stelliger Jahreszahl ohne Begrenzungszeichen. Beispiel: `yyyymmdd`
`DF=L` | 10-Byte-Darstellung mit 4-stelliger Jahreszahl und Begrenzungszeichen. Beispiel: `yyyy-mm-dd`).

Bei jeder Darstellung wird die Reihenfolge von Tag, Monat und Jahr sowie die zu verwendenden Begrenzungszeichen durch den `DTFORM`-Parameter bestimmt.

Standardmäßig gilt `DF=S` (außer bei `INPUT`-Statements; siehe unten).

Der `DF`-Parameter wird bei der Kompilierung ausgewertet.

Der `DF`-Parameter gilt bei folgenden Statements und in folgenden Situationen:

- `FORMAT`

- `INPUT`, `DISPLAY`, `WRITE` und `PRINT` auf Statement- und Elementebene (Feldebene)

- `MOVE`, `COMPRESS`, `STACK`, `RUN` und `FETCH` auf Elementebene (Feldebene)

Bei Angabe in einem dieser Statements hat der `DF`-Parameter folgende Auswirkung:

Statement | Auswirkung des DF-Parameters
--- | ---
`DISPLAY`, `WRITE`, `PRINT` | Wenn der Wert einer Datumsvariablen mit einem dieser Statements ausgegeben wird, wird der Wert in alphanumerische Darstellung umgesetzt, bevor er ausgegeben wird. Der `DF`-Parameter bestimmt, welche Darstellung dafür verwendet wird.
`MOVE`, `COMPRESS` | Wenn der Wert einer Datumsvariablen mit einem `MOVE`- oder `COMPRESS`-Statement in ein alphanumerisches Feld übertragen wird, wird der Wert in alphanumerische Darstellung umgesetzt, bevor er übertragen wird. Der `DF`-Parameter bestimmt, welche Darstellung dafür verwendet wird.
`STACK`, `RUN`, `FETCH` | Wenn der Wert einer Datumsvariablen auf dem Natural-Stack abgelegt wird, wird er in alphanumerische Darstellung umgesetzt, bevor er auf dem Stack abgelegt wird. Der `DF`-Parameter bestimmt, welche Darstellung dafür verwendet wird. Dasselbe gilt, wenn eine Datumsvariable als Parameter in einem `FETCH`- oder `RUN`-Statement angegeben ist (da diese Parameter ebenfalls über den Stack übergeben werden).
`INPUT` | Wenn eine Datumsvariable in einem `INPUT`-Statement verwendet wird, bestimmt der `DF`-Parameter, in welcher Form ein Wert in dieses Feld eingegeben werden muss. Wenn dagegen eine Datumsvariable, für die kein `DF`-Parameter angegeben ist, in einem `INPUT`-Statement verwendet wird, kann das Datum entweder mit 2-stelliger Jahresangabe und Begrenzungszeichen oder mit 4-stelliger Jahresangabe ohne Begrenzungszeichen eingegeben werden. Auch in diesem Fall wird die Reihenfolge von Tag, Monat und Jahr sowie die zu verwendenden Begrenzungszeichen durch den `DTFORM`-Parameter bestimmt.

Anmerkung
Bei `DF=S` stehen nur zwei Stellen für die Jahresangabe zur Verfügung; d.h. selbst wenn der Datumswert das Jahrhundert enthielte, ginge diese Information bei der Umsetzung verloren. Um die Jahrhundertinformation zu behalten, müssen Sie `DF=I` oder `DF=L` setzen.

### Beispiele für DF-Parameter beim WRITE-Statements

Diese Beispiele basieren auf der Annahme, dass `DTFORM=G`.

    /* DF=S (default)
    WRITE *DATX   /* Output has this format: dd.mm.yy
    END

    FORMAT DF=I
    WRITE *DATX   /* Output has this format: ddmmyyyy
    END

    FORMAT DF=L
    WRITE *DATX   /* Output has this format: dd.mm.yyyy
    END

### Beispiel für DF-Parameter beim MOVE-Statement

Dieses Beispiel basiert auf der Annahme, dass `DTFORM=E`.

    DEFINE DATA LOCAL
      1 #DATE  (D) INIT <D'31/01/2014'>
      1 #ALPHA (A10)
    END-DEFINE
    ...
    MOVE #DATE        TO #ALPHA /* Result: #ALPHA contains 31/01/14
    MOVE #DATE (DF=I) TO #ALPHA /* Result: #ALPHA contains 31012014
    MOVE #DATE (DF=L) TO #ALPHA /* Result: #ALPHA contains 31/01/2014
    ...

### Beispiel für DF-Parameter beim STACK-Statement

Dieses Beispiel basiert auf der Annahme, dass `DTFORM=I`.

    DEFINE DATA LOCAL
      1 #DATE  (D) INIT <D'2014-01-31'>
      1 #ALPHA1(A10)
      1 #ALPHA2(A10)
      1 #ALPHA3(A10)
    END-DEFINE
    ...
    STACK TOP DATA #DATE (DF=S) #DATE (DF=I) #DATE (DF=L)
    ...
    INPUT #ALPHA1 #ALPHA2 #ALPHA3
    ...
    /* Result: #ALPHA1 contains 14-01-31
    /*         #ALPHA2 contains 20140131
    /*         #ALPHA3 contains 2014-01-31
    ...

### Beispiel für DF-Parameter beim INPUT-Statement

Dieses Beispiel basiert auf der Annahme, dass `DTFORM=I`.

    DEFINE DATA LOCAL
      1 #DATE1 (D)
      1 #DATE2 (D)
      1 #DATE3 (D)
      1 #DATE4 (D)
    END-DEFINE
    ...
    INPUT #DATE1 (DF=S) /* Input must have this format: yy-mm-dd
          #DATE2 (DF=I) /* Input must have this format: yyyymmdd
          #DATE3 (DF=L) /* Input must have this format: yyyy-mm-dd
          #DATE4        /* Input must have this format: yy-mm-dd or yyyymmdd
    ...

## Datumsformat für Ausgabe — der DFOUT-Parameter

Der Session- bzw. Profilparameter `DFOUT` gilt nur für Datumsfelder in `INPUT`-, `DISPLAY`-, `PRINT`- und `WRITE`-Statements, für die keine Editiermaske angegeben ist und für die kein `DF`-Parameter gilt.

Bei Datumsfeldern, die mit einem `INPUT`-, `DISPLAY`-, `PRINT`- oder `WRITE`-Statement ausgegeben werden und für die weder eine Editiermaske angegeben noch ein DF-Parameter gesetzt ist, bestimmt der Profil/Session-Parameter `DFOUT` die Form, in der die Feldwerte angezeigt werden.

Mit dem `DFOUT`-Parameter können Sie eine der folgenden Datumsdarstellungsarten wählen:

`DFOUT=S` | Datumsvariablen werden mit zweistelligem Jahr und mit durch den `DTFORM`-Parameter bestimmten Begrenzungszeichen angezeigt: Beispiel: `yy-mm-dd`
`DFOUT=I` | Datumsvariablen werden mit mit vierstelligem Jahr und ohne Begrenzungszeichen angezeigt: Beispiel: `yyyymmdd`

Standardmäßig gilt `DFOUT=S`.

Bei beiden `DFOUT`-Einstellungen wird die Reihenfolge von Tag, Monat und Jahr in den Datumswerten durch den `DTFORM`-Parameter bestimmt.

Die Länge eines Datumsfeldes wird durch die `DFOUT`-Einstellung nicht beeinflusst, da jede der beiden Datumswertdarstellungen in ein 8 Byte langes Feld passt.

Der `DFOUT`-Parameter kann im Natural-Parametermodul dynamisch beim Aufrufen von Natural oder mit dem Systemkommando `GLOBALS` gesetzt werden. Er wird zur Laufzeit ausgewertet.

#### Beispiel:

Dieses Beispiel basiert auf der Annahme, dass `DTFORM=I`.

    DEFINE DATA LOCAL
    1 #DATE  (D) INIT <D'2014-01-31'>
    END-DEFINE
    ...
    WRITE #DATE        /* Output if DFOUT=S is set ...: 14-01-31
                       /* Output if DFOUT=I is set ...: 20140131
    WRITE #DATE (DF=L) /* Output (regardless of DFOUT): 2014-01-31
    ...

## Datumsformat für Stack — der DFSTACK-Parameter

Der Session- bzw. Profilparameter `DFSTACK` gilt nur für Datumsfelder, die in `STACK`-, `FETCH`- und `RUN`-Statements verwendet werden und für die kein `DF`-Parameter angegeben ist.

Der `DFSTACK`-Parameter bestimmt die Form, in der die Werte von Datumsvariablen mit einem `STACK`-, `RUN`- oder `RUN`-Statement auf dem Natural-Stack abgelegt werden.

Mögliche `DFSTACK`-Einstellungen sind:

`DFSTACK=S` | 8-Byte-Datumsvariablen werden mit zweistelligem Jahr und mit durch den `DTFORM`-Parameter bestimmten Begrenzungszeichen auf dem Natural-Stack abgelegt: Beispiel: `yy-mm-dd` Diese Einstellung bewirkt, dass die Jahrhundert-Informationen nicht mit abgelegt werden (und verlorengehen), wenn ein Datumswert auf dem Stack abgelegt wird. Wenn dann der Wert vom Natural-Stack gelesen und in einer anderen Datumsvariable abgelegt wird, wird entweder als Jahrhundert das aktuelle Jahrhundert genommen oder das Jahrhundert durch die Einstellung des `YSLW`-Parameters (siehe Gleitendes Jahr-Fenster — der YSLW-Parameter) bestimmt. Das kann dazu führen, dass das Jahrhundert ein anderes ist als im ursprünglichen Datumswert, ohne dass Natural in diesem Fall einen Fehler ausgibt.
`DFSTACK=C` | Wie bei `DFSTACK=S`, aber mit folgendem Unterschied: Natural gibt einen Laufzeitfehler aus, wenn der auf dem Natural-Stack abzulegende Datumswert nicht mit dem des ursprünglichen Datumswerts identisch ist (entweder aufgrund des `YSLW`-Parameters oder weil das ursprüngliche Jahrhundert nicht mit dem aktuellen Jahrhundert übereinstimmt).
`DFSTACK=I` | 8-Byte-Datumsvariablen werden mit vierstelligem Jahr und ohne Begrenzungszeichen auf dem Natural-Stack abgelegt: Beispiel: `yyyymmdd`

Standardmäßig gilt `DFSTACK=S`.

Bei jeder Datumsdarstellung werden die Reihenfolge von Tag, Monat und Jahr und die Begrenzungszeichen (falls vorhanden) in den Datumswerten durch den `DTFORM`-Parameter bestimmt.

#### Beispiel:

Dieses Beispiel basiert auf der Annahme, dass `DTFORM=I` und `YSLW=0`.

    DEFINE DATA LOCAL
      1 #DATE  (D) INIT <D'2014-01-31'>
      1 #ALPHA1(A8)
      1 #ALPHA2(A10)
    END-DEFINE
    ...
    STACK TOP DATA #DATE #DATE (DF=L)
    ...
    INPUT #ALPHA1 #ALPHA2
    ...
    /* Result if DFSTACK=S or =C is set: #ALPHA1 contains 14-01-31
    /* Result if DFSTACK=I is set .....: #ALPHA1 contains 20140131
    /* Result (regardless of DFSTACK) .: #ALPHA2 contains 2014-01-31
    ...

## Gleitendes Jahr-Fenster — der YSLW-Parameter

Mit dem Profilparameter `YSLW` können Sie das Jahrhundert eines zweistelligen Jahr-Wertes bestimmen.

Der YSLW-Parameter kann im Natural-Parametermodul oder dynamisch beim Aufrufen von Natural gesetzt werden. Er wird zur Laufzeit ausgewertet, wenn ein alphanumerischer Datumswert mit einem zweistelligen Jahr in eine Datumsvariable übertragen wird. Dies betrifft Datumswerte, die:

- mit der mathematischen Funktion `VAL(field)` verwendet werden,

- mit der Option `IS(D)` in einer logischen Bedingung verwendet werden,

- vom Natural-Stack als Eingabedaten gelesen werden,

- in ein Feld als Eingabedaten eingegeben werden.

Der `YSLW`-Parameter bestimmt den Bereich von Jahren, der von einem sogenannten "gleitenden Jahr-Fenster" abgedeckt wird. Dieser Mechanismus geht davon aus, dass ein Datum mit einem zweistelligen Jahr innerhalb eines "Fensters" von 100 Jahren liegt. Innerhalb dieser 100 Jahre kann jeder zweistellige Jahr-Wert eindeutig einem bestimmten Jahrhundert zugeordnet werden.

Mit dem `YSLW`-Parameter legen Sie fest, mit wie vielen Jahren in der Vergangenheit der 100-Jahre-Bereich anfangen soll: das erste Jahr des Fensterbereichs ergibt sich aus dem aktuellen Jahr minus dem `YSLW`-Wert.

Mögliche Werte des `YSLW`-Parameters sind 0 bis 99. Der Standardwert ist `YSLW=0`, d.h. der "gleitende Jahr-Fenster"-Mechanismus ist nicht aktiv; bei einem zweistelligen Jahr wird dann angenommen, dass es im aktuellen Jahrhundert liegt.

#### Beispiel 1:

Wenn das aktuelle Jahr 2014 ist und Sie `YSLW=40` angeben, deckt das "gleitende Jahr-Fenster" die Jahre 1974 bis 2072 ab. Ein zweistelliger Jahr-Wert `nn` von `74` bis `99` wird dementsprechend als `19nn` interpretiert, während ein zweistelliger Jahr-Wert `nn` von `00` bis `73` als `20nn` interpretiert wird.

#### Beispiel 2:

Wenn das aktuelle Jahr 2014 ist und Sie `YSLW=20` angeben, deckt das "gleitende Jahr-Fenster" die Jahre 1994 bis 2093 ab. Ein zweistelliger Jahr-Wert `nn` von `94` bis `99` wird dementsprechend als 19nn interpretiert, während ein zweistelliger Jahr-Wert `nn` von `00` bis `93` als 20nn interpretiert wird.

## Kombinationen von DFSTACK und YSLW

Die folgenden Beispiele veranschaulichen die Auswirkung verschiedener Kombinationen der Parameter `DFSTACK` und `YSLW`.

Anmerkung
Alle diese Beispiele basieren auf der Annahme, dass `DTFORM=I`.

#### Beispiel 1:

Dieses Beispiel geht vom aktuellen Jahr 2014 und folgenden Parametereinstellungen aus:

`DFSTACK=S` (Standardeinstellung) und `YSLW=20`

    DEFINE DATA LOCAL
      1 #DATE1 (D) INIT <D'1956-12-31'>
      1 #DATE2 (D)
    END-DEFINE
    ...
    STACK TOP DATA #DATE1 /* century information is lost (year 56 is stacked)
    ...
    INPUT #DATE2          /* year sliding window determines 56 to be 1956
    ...
    /* Result: #DATE2 contains 1956-12-31

In diesem Fall ist das "gleitende Jahr-Fenster" unpassend gesetzt, so dass die Jahrhundert-Informationen sich (unbeabsichtigt) ändern.

#### Beispiel 2:

Dieses Beispiel geht vom aktuellen Jahr 2014 und folgenden Parametereinstellungen aus:

`DFSTACK=S` (Standardeinstellung) und `YSLW=60`

    DEFINE DATA LOCAL
      1 #DATE1 (D) INIT <D'1956-12-31'>
      1 #DATE2 (D)
    END-DEFINE
    ...
    STACK TOP DATA #DATE1 /* century information is lost (year 56 is stacked)
    ...
    INPUT #DATE2          /* year sliding window determines 56 to be 1956
    ...
    /* Result: #DATE2 contains 1956-12-31

In diesem Fall ist das "gleitende Jahr-Fenster" passend gesetzt, so dass die ursprünglichen Jahrhundert-Informationen korrekt wiederhergestellt werden.

#### Beispiel 3:

Dieses Beispiel geht vom aktuellen Jahr 2014 und folgenden Parametereinstellungen aus:

`DFSTACK=C` und `YSLW=0` (Standardeinstellung)

    DEFINE DATA LOCAL
      1 #DATE1 (D) INIT <D'1956-12-31'>
      1 #DATE2 (D)
    END-DEFINE
    ...
    STACK TOP DATA #DATE1 /* century information is lost (year 56 is stacked)
    ...
    INPUT #DATE2          /* 56 is assumed to be in current century -> 2056
    ...
    /* Result: NAT1130 runtime error (Unintended century switch...)

In diesem Fall ändern sich (unbeabsichtigt) die Jahrhundert-Informationen. Allerdings wird diese Änderung durch die Parametereinstellung `DFSTACK=C` abgefangen.

#### Beispiel 4:

Dieses Beispiel geht vom aktuellen Jahr 2014 und folgenden Parametereinstellungen aus:

`DFSTACK=C` und `YSLW=60`

    DEFINE DATA LOCAL
      1 #DATE1 (D) INIT <D'2056-12-31'>
      1 #DATE2 (D)
    END-DEFINE
    ...
    STACK TOP DATA #DATE1 /* century information is lost (year 56 is stacked)
    ...
    INPUT #DATE2          /* year sliding window determines 56 to be 1956
    ...
    /* Result: NAT1130 runtime error (Unintended century switch...)

In diesem Fall ändern sich die Jahrhundert-Informationen aufgrund des "gleitenden Jahr-Fensters". Allerdings wird diese Änderung durch die Parametereinstellung `DFSTACK=C` abgefangen.

## Festes Jahr-Fenster

Informationen zu diesem Thema entnehmen Sie der Beschreibung des Profilparameters `YSLW`.

## Datumsformat für Standard-Seitenüberschriften — der DFTITLE-Parameter

Der Session- bzw. Profilparameter `DFTITLE` bestimmt die Form des Datums in einer Standard-Seitenüberschrift (wie sie mit einem `DISPLAY`-, `WRITE`- oder `PRINT`-Statement ausgegeben wird).

Mit dem `DFTITLE`-Parameter können Sie eine der folgenden Datumsdarstellungsarten wählen:

`DFTITLE=S` | 8-Byte-Datumsdarstellung mit zweistelligem Jahr und Begrenzungszeichen. Beispiel: `yy-mm-dd`.
`DFTITLE=L` | 10-Byte-Datumsdarstellung mit vierstelligem Jahr und Begrenzungszeichen. Beispiel: `yyyy-mm-dd`.
`DFTITLE=I` | 8-Byte-Datumsdarstellung mit vierstelligem Jahr ohne Begrenzungszeichen. Beispiel: `yyyymmdd`.

Bei jeder dieser Ausgabeformen werden die Reihenfolge der Tages-, Monats- und Jahreskomponenten sowie die verwendeten Begrenzungszeichen durch den `DTFORM`-Parameter bestimmt.

Der `DFTITLE`-Parameter kann im Natural-Parametermodul dynamisch beim Aufrufen von Natural oder mit dem Systemkommando `GLOBALS` gesetzt werden. Er wird zur Laufzeit ausgewertet.

#### Beispiel:

Dieses Beispiel geht von `DTFORM=I` aus.

    WRITE 'HELLO'
    END
    /*
    /* Date in page title if DFTITLE=S is set ...: 14-01-31
    /* Date in page title if DFTITLE=L is set ...: 2014-01-31
    /* Date in page title if DFTITLE=I is set ...: 20140131

Anmerkung
Der `DFTITLE`-Parameter hat keine Auswirkungen auf benutzerdefinierte Seitenüberschriften, wie sie mit einem `WRITE TITLE`-Statement angegeben werden.

### On this page

- Editiermasken für Datumsfelder und Datumssystemvariablen
- Standard-Editiermaske für Datum — der DTFORM-Parameter
- Datumsformat für alphanumerische Darstellung — der DF-Parameter
- Datumsformat für Ausgabe — der DFOUT-Parameter
- Datumsformat für Stack — der DFSTACK-Parameter
- Gleitendes Jahr-Fenster — der YSLW-Parameter
- Kombinationen von DFSTACK und YSLW
- Festes Jahr-Fenster
- Datumsformat für Standard-Seitenüberschriften — der DFTITLE-Parameter