日付、時刻、およびタイム・スタンプのフィールド

ILE COBOL プログラムでは、次の 2 つの方法で、DDS の日付、時刻、およびタイム・スタンプのフィールドを使用することができます。

日時クラス

DDS の日付、時刻、およびタイム・スタンプのフィールドは、CRTCBLMOD または CRTBNDCBL の CVTOPT パラメーターの *DATETIME オプションによって、ILE COBOL の FILLER 項目として、 あるいはその DDS 名によって宣言することができます。 *NODATETIME が指定された場合、DDS の日付、時刻、およびタイム・スタンプのフィールドは、ILE COBOL の FILLER 項目として宣言されます。 *DATETIME が指定された場合、DDS の日付、時刻、およびタイム・スタンプの項目は、ILE COBOL の DDS 名で宣言されます。

デフォルトでは、DDS の日付、時刻、およびタイム・スタンプのフィールドは、COBOL 英数字データ項目を作成します。 すなわち、COPY DDS は、DDS の日付、時刻、またはタイム・スタンプのフィールドごとに、PIC X(n) を生成します。 FORMAT 文節を生成し、したがって COBOL 日時クラス項目を作成するには、以下のように CVTOPT 値を指定しなければなりません。

上記 CVTOPT パラメーター値に相当する PROCESS ステートメント・オプションは、それぞれ DATE、TIME、および TIMESTAMP です。

日時クラスの項目の処理に関する詳細については 日時データ・タイプを処理するを参照してください。

DDS のゾーン、パック、および文字のフィールドは、DATFMT キーワードを持つことができます。 一般に、この種のフィールドは、COPY DDS の発生時に PICTURE 文節を生成します。 その結果の COBOL 項目は、数値ゾーン、数値パック、または英数字データ・タイプです。 ただし、これらの項目には、COPY DDS を用いて FORMAT 文節を生成することができます (この場合は、日時クラスの COBOL 日付データ項目が作成されます)。 CVTOPT パラメーターの *CVTTODATE 値を指定すると、DATFMT キーワードを指定した DDS のゾーン、パック、および文字のフィールドで日付データ項目が生成されます。 CVTOPT パラメーターの *NOCVTTODATE 値は、それぞれ数値ゾーン、数値パック、または英数字フィールドを生成します。 これらの 2 つの値は、CVTTODATE および NOCVTTODATE オプションとして、PROCESS ステートメントにも存在します。

表 21 および 表 22 には、ゾーン、パック、および文字の DDS フィールドに許可された DATFMT パラメーター、 および CVTOPT(*CVTTODATE) 変換パラメーターが指定されている場合に COPY DDS から生成される DATFMT パラメーターと同等の ILE COBOL の形式がリストされています。

表 21 は、文字およびゾーンのフィールドです。 USAGE DISPLAY を想定しています。

表 21. 文字およびゾーンのフィールドに使用できる DATFMT パラメーター
i5/OS形式 COBOL 生成の形式 説明 形式 長さ
*MDY %m%d%y 月日年 mmddyy 6
*DMY %d%m%y 日月年 ddmmyy 6
*YMD %y%m%d 年月日 yymmdd 6
*JUL %y%j 年間通算日 yyddd 5
*ISO @Y%m%d ISO (国際標準化機構) yyyymmdd 8
*USA %m%d@Y IBM USA 標準規格 mmddyyyy 8
*EUR %d%m@Y IBM 欧州標準規格 ddmmyyyy 8
*JIS @Y%m%d JIS (日本工業規格) 西暦 yyyymmdd 8
*CMDY @C%m%d%y 世紀月日年 cmmddyy 7
*CDMY @C%d%m%y 世紀日月年 cddmmyy 7
*CYMD @C%y%m%d 世紀年月日 cyymmdd 7
*MDYY %m%d@Y 月日年 mmddyyyy 8
*DMYY %d%m@Y 日月年 ddmmyyyy 8
*YYMD @Y%m%d 年月日 yyyymmdd 8
*YM %y%m 年月 yymm 4
*MY %m%y 月年 mmyy 4
*YYM @Y%m 年月 yyyymm 6
*MYY %m@Y 月年 mmyyyy 6
*LONGJUL @Y%j 年間通算日 yyyyddd 7

表 22 は、パック・フィールド用です。 USAGE PACKED-DECIMAL が生成されます。

表 22. パック・フィールドに使用できる DATFMT パラメーター
i5/OS形式 COBOL 生成の形式 説明 形式 長さ
*MDY %m%d%y 月日年 mmddyy 4
*DMY %d%m%y 日月年 ddmmyy 4
*YMD %y%m%d 年月日 yymmdd 4
*JUL %y%j 年間通算日 yyddd 3
*ISO @Y%m%d ISO (国際標準化機構) yyyymmdd 5
*USA %m%d@Y IBM USA 標準規格 mmddyyyy 5
*EUR %d%m@Y IBM 欧州標準規格 ddmmyyyy 5
*JIS @Y%m%d JIS (日本工業規格) 西暦 yyyymmdd 5
*CMDY @C%m%d%y 世紀月日年 cmmddyy 4
*CDMY @C%d%m%y 世紀日月年 cddmmyy 4
*CYMD @C%y%m%d 世紀年月日 cyymmdd 4
*MDYY %m%d@Y 月日年 mmddyyyy 5
*DMYY %d%m@Y 日月年 ddmmyyyy 5
*YYMD @Y%m%d 年月日 yyyymmdd 5
*YM %y%m 年月 yymm 3
*MY %m%y 月年 mmyy 3
*YYM @Y%m 年月 yyyymm 4
*MYY %m@Y 月年 mmyyyy 4
*LONGJUL @Y%j 年間通算日 yyyyddd 4

英数字クラス

このセクションでは、日付、時刻、およびタイム・スタンプのデータ項目を、ILE COBOL プログラムの英数字フィールドとして使用する方法を説明します。 これを、日時クラスで説明した日時クラスの日付、時刻、およびタイム・スタンプのデータ項目を使用した場合と比較してください。

デフォルトでは、DDS の日付、時刻、またはタイム・スタンプのフィールドは、 固定長文字フィールドとして ILE COBOL プログラムに入れられます。 ILE COBOL プログラムは、有効な、あらゆる文字操作を、固定長フィールドで実行することができます。 これらの操作は、英数字データ項目に関する標準の COBOL 規則に従っています。 CRTCBLMOD および CRTBNDCBL コマンドの *NODATE、 *NOTIME、および *NOTIMESTAMP CVTOPT パラメーター値を使用すると、COPY DDS は英数字 COBOL データ項目を生成します。 これらの CVTOPT パラメーター値も、それぞれ NODATE、NOTIME、および NOTIMESTAMP の PROCESS ステートメント上にあります。

日付、時刻、およびタイム・スタンプのフィールドがプログラムに入るのは、CRTCBLMOD または CRTBNDCBL コマンドの CVTOPT パラメーターの *DATETIME オプションか、PROCESS ステートメントの DATETIME オプションを指定した場合に限られます。 CVTOPT パラメーターの説明とその構文については CVTOPT パラメーターを参照してください。 *DATETIME が指定されていない場合は、日付、時刻、およびタイム・スタンプ・フィールドは無視され、 ユーザーの ILE COBOL プログラムで FILLER フィールドとして宣言されます。

日付、時刻、およびタイム・スタンプのデータ・タイプには、それぞれ独自の形式があります。

日付、時刻、またはタイム・スタンプ情報を含んでいるフィールドがプログラムによって更新され、 その更新された情報がデータベースに戻される場合、フィールドの形式は、そのフィールドがデータベースから取り出されたときの形式と全く同じでなければなりません。 同じ形式を使用しなければ、エラーが発生します。 各データ・タイプの有効な形式については、Web サイト http://www.ibm.com/eserver/iseries/infocenter にある iSeries Information Center の 「データベースおよびファイル・システム」カテゴリーを参照してください。

CL コマンドを使用してソース・ステートメントを入力する方法に関する情報を入手するには、Web サイト http://www.ibm.com/eserver/iseries/infocenter にある iSeries Information Center の「プログラミング」カテゴリーの 中の『CL および API』セクションを参照してください。

日付、時刻、またはタイム・スタンプ・フィールドに適正な値を転送する前にレコードを WRITE しようとすると、WRITE 操作は失敗し、ファイル状況 90 が戻されます。 日付、時刻、またはタイム・スタンプのフィールドでキー・フィールドを使用しようとすると、READ または START 操作でもエラーが発生し、そのフィールドには適切な値が入りません。

プログラムの中の日付、時刻、タイム・スタンプの項目を FILLER として宣言した場合、 このフィールドをシステムで受け入れられる値には設定できないので、 このフィールドを含むレコードには WRITE を実行しないようにしてください。

ILE COBOL の英数字データ・タイプとして生成される DDS の日付、時刻、およびタイム・スタンプのフィールドは、SORT/MERGE キーとして指定することができますが、 日付、時刻、およびタイム・スタンプのデータ項目としてではなく、英数字データ項目として比較されます。

*DATETIME コンパイラー・オプションが *DATE を処理する例

図 106 では、DDS 日付項目 DATEITEM を定義しています。 このセクションでは、DDS 日付項目がどのように影響するかだけを説明します。

図 106. 日時フィールドを定義する DDS ファイル
....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
       A          R DATETIME
       A*
       A            VARITEM      100          VARLEN
       A*
       A            TIMEITEM        T         TIMFMT(*HMS)
       A            DATEITEM        L         DATFMT(*YMD)
       A            TIMESTAMP       Z

以下の例では、CVTOPT パラメーターの *DATE オプションと一緒に CVTOPT パラメーターの *DATETIME オプションを指定する組み合わせと、 その組み合わせが、 DATEITEM をプログラムに入れる方法にどのように影響するかを示します。

例 1

*NODATETIME を *NODATE と一緒に指定すると、DATEITEM は、以下のようにプログラムに入れられます。

05 FILLER    PIC X(8).
例 2

*DATETIME を *NODATE と一緒に指定すると、DATEITEM は、以下のようにプログラムに入れられます。

05 DATEITEM    PIC X(8).
例 3

*DATETIME を *DATE と一緒に指定すると、DATEITEM は、以下のようにプログラムに入れられます。

05 DATEITEM    FORMAT DATE '%y/%m/%d'.
例 4

*NODATETIME を *DATE と一緒に指定すると、DATEITEM は、以下のようにプログラムに入れられます。

05 FILLER    FORMAT DATE '%y/%m/%d'.