このドキュメントでは、Natural アプリケーションでの日付情報の処理について、さまざまな面から説明します。
次のトピックについて説明します。
日付フィールドの値を特定の表現で出力する場合は、通常、フィールドに編集マスクを指定します。 編集マスクを使用して、1 文字ずつどのように出力するかを指定します。
現在の日付を特定の表現で使用する場合、日付フィールドを定義して編集マスクを指定する必要はありません。代わりに、日付システム変数を使用します。 Natural には、さまざまな日付システム変数が用意されています。その中には、表現の異なる現在日付も含まれています。 これらの表現には 2 桁の年コンポーネントを持つものもあれば、4 桁の年コンポーネントを持つものもあります。
すべての日付システム変数のリストと詳細については、『システム変数』ドキュメントを参照してください。
DTFORM
プロファイルパラメータによって、Natural レポートのデフォルトタイトルの日付部分、日付定数、および日付入力に使用されるデフォルトのフォーマットが決まります。
この日付フォーマットを使用して、日付の年、月、日の各コンポーネントの順序、およびこれらのコンポーネント間で使用するデリミタ文字を指定します。
有効な DTFORM
の設定は、以下のとおりです。
設定 | 日付フォーマット* | 例 |
---|---|---|
DTFORM=I | yyyy-mm-dd | 2005-12-31 |
DTFORM=G | dd.mm.yyyy | 31.12.2005 |
DTFORM=E | dd/mm/yyyy | 31/12/2005 |
DTFORM=U | mm/dd/yyyy | 12/31/2005 |
* dd = 日、mm = 月、yyyy = 年
DTFORM
パラメータは、Natural パラメータモジュール/ファイル内で設定できます。また、Natural を起動するときにダイナミックに設定することもできます。 デフォルトでは、DTFORM=I
が適用されます。
編集マスクが指定されている場合、フィールド値の表現は編集マスクによって決まります。 編集マスクが指定されていない場合、フィールド値の表現は、セッションパラメータ DF
とプロファイルパラメータ DTFORM
の組み合せによって決まります。
DF
パラメータでは、以下の日付表現の 1 つを選択できます。
DF=S | 2 桁の年コンポーネントとデリミタを使用する 8 バイトの表記です(yy-mm-dd)。 |
---|---|
DF=I | デリミタを使用しない、4 桁の年コンポーネントの 8 バイトの表記です(yyyymmdd)。 |
DF=L | 4 桁の年コンポーネントとデリミタを使用する 10 バイトの表記です(yyyy-mm-dd)。 |
各表現に対する、年、月、日の各コンポーネントの順序、および使用するデリミタ文字は、DTFORM
パラメータによって決まります。
デフォルトでは、DF=S
が適用されます(INPUT
ステートメントを除く。下記参照)。
セッションパラメータ DF
は、コンパイル時に評価されます。
このパラメータは、以下のステートメントで指定できます。
上記のステートメントのいずれかで指定すると、DF
パラメータは以下のように適用されます。
ステートメント | DF パラメータの効果 |
---|---|
DISPLAY、WRITE、PRINT | これらのステートメントの 1 つを使用して日付変数の値を出力すると、出力する前に値が英数字表現に変換されます。 DF パラメータにより、使用される表現が決まります。
|
MOVE、COMPRESS | MOVE または COMPRESS の各ステートメントを使用して日付変数の値を英数字フィールドに転送すると、転送する前に値が英数字表現に変換されます。 DF パラメータにより、使用される表現が決まります。
|
STACK、RUN、FETCH | 日付変数の値をスタックに格納すると、スタックに格納する前に値が英数字表現に変換されます。 DF パラメータにより、使用される表現が決まります。
|
INPUT | INPUT ステートメントでデータ変数を使用する場合、DF パラメータによって、値をどのようにフィールドに入力する必要があるかが決まります。
ただし、 |
注意:
DF=S
で提供される年情報は 2 桁のみです。これは、日付の値に世紀が含まれていると、変換時にこの情報が失われることを意味します。 世紀の情報を保持するには、DF=I
または DF=L
を設定します。
これらの例では、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
この例では、DTFORM=E
が適用されると仮定します。
DEFINE DATA LOCAL 1 #DATE (D) INIT <D'31/12/2005'> 1 #ALPHA (A10) END-DEFINE ... MOVE #DATE TO #ALPHA /* Result: #ALPHA contains 31/12/05 MOVE #DATE (DF=I) TO #ALPHA /* Result: #ALPHA contains 31122005 MOVE #DATE (DF=L) TO #ALPHA /* Result: #ALPHA contains 31/12/2005 ...
この例では、DTFORM=I
が適用されると仮定します。
DEFINE DATA LOCAL 1 #DATE (D) INIT <D'2005-12-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 05-12-31 /* #ALPHA2 contains 20051231 /* #ALPHA3 contains 2005-12-31 ...
この例では、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 ...
セッション/プロファイルパラメータ DFOUT
は、編集マスクが指定されておらず、DF
パラメータも適用されていない、INPUT
、DISPLAY
、WRITE
、および PRINT
の各ステートメントの日付フィールドにのみ適用されます。
INPUT
、DISPLAY
、PRINT
、および WRITE
の各ステートメントによって表示され、編集マスクが指定されておらず、DF
パラメータも適用されてない日付フィールドの場合は、プロファイル/セッションパラメータ DFOUT
によって、表示するフィールド値のフォーマットが決まります。
有効な DFOUT
の設定は、以下のとおりです。
DFOUT=S | 日付変数は、2 桁の年コンポーネント、およびパラメータ DTFORM で指定されているデリミタを使用して表示されます(yy-mm-dd)。
|
---|---|
DFOUT=I | 日付変数は、デリミタなしの 4 桁の年コンポーネントで表示されます(yyyymmdd)。 |
デフォルトでは、DFOUT=S
が適用されます。 どちらの DFOUT
設定でも、日付値の年、月、日の各コンポーネントの順序は、DTFORM
パラメータによって決まります。
どちらの日付値表現でも 8 バイトのフィールドに収まるため、日付フィールドの長さは DFOUT
設定の影響を受けません。
DFOUT
パラメータは、Natural パラメータモジュール/ファイル内で、または Natural を起動するときにダイナミックに、あるいはシステムコマンド GLOBALS
を使用して設定できます。 これは、ランタイム時に評価されます。
この例では、DTFORM=I
が適用されると仮定します。
DEFINE DATA LOCAL 1 #DATE (D) INIT <D'2005-12-31'> END-DEFINE ... WRITE #DATE /* Output if DFOUT=S is set ...: 05-12-31 /* Output if DFOUT=I is set ...: 20051231 WRITE #DATE (DF=L) /* Output (regardless of DFOUT): 2005-12-31 ...
セッション/プロファイルパラメータ DFSTACK
は、DF
パラメータが指定されていない、STACK
、FETCH
、および RUN
の各ステートメントで使用されている日付フィールドにのみ適用されます。
DFSTACK
パラメータによって、STACK
、RUN
、FETCH
の各ステートメント経由でスタックに格納される日付変数の値のフォーマットが決まります。
有効な DFSTACK
の設定は、以下のとおりです。
デフォルトでは、DFSTACK=S
が適用されます。 DFSTACK=S
は、世紀の情報なし(つまり、失われます)で日付値がスタックに格納されることを意味します。 その後、値をスタックから読み込んで別の日付変数に格納すると、世紀情報は現在のものであるとみなされるか、または YSLW
パラメータ(下記参照)の設定によって決まります。 この操作によって、元の日付値と異なる世紀が設定される可能性があります。ただし、この場合、Natural はエラーを発行しません。
世紀の情報なしで日付値がスタックに格納されるという点では、DFSTACK=C
は DFSTACK=S
と同じ動作をします。 ただし、(YSLW
パラメータ、または元の世紀が現在の世紀でなかったために)スタックから読み込んだ値の世紀情報が元の日付値と異なった場合、Natural はランタイムエラーを発行します。
注意:
このランタイムエラーは、値をスタックに格納する時点ですでに発行されています。
DFSTACK=I
を使用すると、世紀の情報を失わずに日付値を 8 バイトの長さでスタックに格納できます。
DFSTACK
パラメータは、Natural パラメータモジュール/ファイル内で、または Natural を起動するときにダイナミックに、あるいはシステムコマンド GLOBALS
を使用して設定できます。 これは、ランタイム時に評価されます。
以下の例では、DTFORM=I
および YSLW=0
が適用されているものとします。
DEFINE DATA LOCAL 1 #DATE (D) INIT <D'2005-12-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 05-12-31 /* Result if DFSTACK=I is set .....: #ALPHA1 contains 20051231 /* Result (regardless of DFSTACK) .: #ALPHA2 contains 2005-12-31 ...
プロファイルパラメータ YSLW
を使用すると、2 桁の年の値に対する世紀を指定できます。
YSLW
パラメータは、Natural パラメータモジュール/ファイル内で設定できます。また、Natural を起動するときにダイナミックに設定することもできます。 2 桁の年コンポーネントを持つ英数字の日付値を日付変数に移すと、このパラメータはランタイム時に評価されます。
これは、以下のデータ値に適用されます。
算術関数 VAL(field)
で使用するデータ値
論理条件の IS(D)
オプションで使用するデータ値
入力データとしてスタックから読み込まれたデータ値
入力データとして入力フィールドに入力されたデータ値
YSLW
パラメータによって、"年スライディングウィンドウ" でカバーする年の範囲を特定します。 スラインディングウィンドウのメカニズムは、2 桁の年の日付が 100 年の "ウィンドウ" 内にあるものと仮定します。 この 100 年の範囲で、すべての 2 桁の年の値を特定の世紀に一意に関連付けることができます。
YSLW
パラメータを使用して、その 100 年の範囲を何年前から開始するかを指定します。現在の年から YSLW
の値を引くことにより、ウィンドウ範囲の最初の年が決定します。
YSLW
パラメータの有効な値は、0~99 です。 デフォルト値は YSLW=0
です。これは、スライディングウィンドウメカニズムを使用しないことを意味します。つまり、2 桁の年を持つ日付は、現在の世紀にあるとみなされます。
現在の年が 2005 年の場合に YSLW=40
を指定すると、スラインディングウィンドウは 1965~2064 年をカバーします。 65~99 の 2 桁の年の値 nn は、19nn と解釈されます。一方、00~64 の 2 桁の年の値 nn は、20nn と解釈されます。
現在の年が 2005 年の場合に YSLW=20
を指定すると、スラインディングウィンドウは 1985~2084 年をカバーします。 85~99 の 2 桁の年の値 nn は、19nn と解釈されます。一方、00~84 の 2 桁の年の値 nn は、20nn と解釈されます。
以下の例で、パラメータ DFSTACK
と YSLW
をさまざまに組み合わせて使用することによる効果を説明します。
注意:
これらのすべての例において、DTFORM=I
が適用されているものとします。
以下の例では、現在の年は 2005 年で、パラメータの設定には DFSTACK=S
(デフォルト値)および 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 2056 ... /* Result: #DATE2 contains 2056-12-31 even if #DATE1 is set to <D'2156-12-31'>
この場合、年スライディングウィンドウは適切に設定されないため、世紀の情報は(意図しない値に)変更されます。
以下の例では、現在の年は 2005 年で、パラメータの設定には DFSTACK=S
(デフォルト値)および 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 even if #DATE1 is set to <D'2056-12-31'>
この場合、年スライディングウィンドウは適切に設定されるため、世紀の情報は正しく復元されます。
以下の例では、現在の年は 2005 年で、パラメータの設定には DFSTACK=C
および YSLW=0
(デフォルト値)が適用されているものとします。
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 -> 1956 ... /* Result: RUNTIME ERROR (UNINTENDED CENTURY CHANGE)
この場合、世紀情報は(意図しない値に)変更されます。 ただし、この変更は DFSTACK=C
設定によってインターセプトされます。
以下の例では、現在の年は 2005 年で、パラメータの設定には DFSTACK=C
および 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: RUNTIME ERROR (UNINTENDED CENTURY CHANGE)
この場合、世紀情報は年スライディングウィンドウに従って変更されます。 ただし、この変更は DFSTACK=C
設定によってインターセプトされます。
このトピックの詳細については、プロファイルパラメータ YSLW
の説明を参照してください。
セッション/プロファイルパラメータ DFTITLE
によって、デフォルトのページタイトル(DISPLAY
、WRITE
、PRINT
の各ステートメントの出力)の日付フォーマットが決まります。
DFTITLE=S | 日付は、デリミタ付きの 2 桁の年コンポーネントで出力されます(yy-mm-dd)。 |
---|---|
DFTITLE=L | 日付は、デリミタ付きの 4 桁の年コンポーネントで出力されます(yyyy-mm-dd)。 |
DFTITLE=I | 日付は、デリミタなしの 4 桁の年コンポーネントで出力されます(yyyymmdd)。 |
これらの各出力フォーマットに対する、年、月、日の各コンポーネントの順序、および使用するデリミタ文字は、DTFORM
パラメータによって決まります。
DFTITLE
パラメータは、Natural パラメータモジュール/ファイル内で、または Natural を起動するときにダイナミックに、あるいはシステムコマンド GLOBALS
を使用して設定できます。 これは、ランタイム時に評価されます。
この例では、DTFORM=I
が適用されると仮定します。
WRITE 'HELLO' END /* /* Date in page title if DFTITLE=S is set ...: 05-10-31 /* Date in page title if DFTITLE=L is set ...: 2005-10-31 /* Date in page title if DFTITLE=I is set ...: 20051031
注意:
DFTITLE
パラメータは、WRITE TITLE
ステートメントで指定されているユーザー定義のページタイトルには効果がありません。