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

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:

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:

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.