MOD_DATE
- 1 これらのパラメータ (日、月、年) の少なくとも 1 つを指定する必要があります。
- 1 これらのパラメータ (日、月、年) の少なくとも 1 つを指定する必要があります。
(FASTREXX プロシージャーで使用できます。)
- 有効な日付に変更するだけです。入力および変更される日付は、1582 年 10 月 15 日から 9999 年 12 月 31 日まで (両端の日付を含む) にする必要があります。
- 最後に指定された引数の後のコンマは省略可能です。
MOD_DATE は、テンプレートを使用して、または使用せずに実行できます。また、年、月、日の値を使用して、日付フィールドを設定したり、増やしたり、減らしたりできます。関数呼び出しを有効にするには、fieldname または位置パラメーター (start、length、type)、mask パラメーター、および年、月、日を表す year、month、day の値の少なくとも 1 つを指定する必要があります。入力値は、現在の出力バッファーから取得され、変更値は出力バッファーに保管されます。
- fieldname
- テンプレートはこの形式である必要があり、指定する名前はテンプレートのフィールド名と一致する必要があります。名前が固有でない場合は、groupname.dataname という形式を使用して名前を指定できます。名前の突き合わせでは、大/小文字が区別されません。名前を修飾しなかった場合は、最初に出現する名前が使用されます。次元フィールドの場合、(nn) 形式で接尾部添え字を指定して、個別の配列エレメントを参照できます。ここで、nn は、次元フィールドの有効な添え字です。添字を指定しない場合、配列のすべてのエレメントに関数が適用されます。注:
- コピー・プロセスを実行していて、入力テンプレートと出力テンプレートを指定した場合は、フィールド名を入力テンプレートと出力テンプレートの両方に対して定義する必要があります。
- 複数のレコード・レイアウトをコピーしている場合、MOD_DATE 関数は、このフィールドを含むレコード・レイアウトとして識別されたレコードに適用されます。
- start
- フィールド値の読み取りを開始する入力レコード内の位置 (バイト単位)。以下のように指定できます。
- 絶対位置
- 正の整数である必要があります。デフォルト値は 1 です。start が入力レコードの現在の長さより大きければ、この関数は無効になります。
- 現行 INPOS からの相対位置
- IPx または INx、または Px または Nx として指定できます。結果の値がゼロ以下になる場合、または入力レコードの現在の長さより大きくなる場合、この関数は無効になります。
- 現行 OUTPOS からの相対位置
- OPx または ONx として指定する必要があります。結果の値がゼロ以下になる場合、または入力レコードの現在の長さより大きくなる場合、この関数は無効になります。
- length
- フィールドの長さ (バイト数)。
2 進数フィールドの場合、長さを省略するか、4 を指定します。
パック 10 進フィールドでは、長さを指定する場合には 1 から 16 の範囲内でなければなりません。長さを省略すると、MOD_DATE はレコード・データからパック・フィールドの長さを決定して、そのフィールドだけを戻します。
- type
- フィールドのデータ・タイプ。有効な値は、以下のとおりです。
- B
- 2 進数。
- C
- 文字。これは、デフォルトです。
- P
- パック 10 進数。
- mask
- 日付を記述するピクチャー・ストリング。File Manager では、「z/OS®Language Environment® Programming Services」の付録 B『Date and time services tables』で説明されているすべてのピクチャーがサポートされます。このマスクのほかに、File Manager では、古い世紀値のユリウス日付を処理する CYYDDD がサポートされます。「C」の値が「0」の場合、「19」と解釈され、「C」の値が「1」の場合、「20」と解釈されます。デフォルトで、2 桁の年は、LE マスクによってカバーされるシステム日付の 80 年前から始まる 100 年の間になります。デフォルトの範囲は、century パラメーターを指定することで変更できます。注: 日付属性と時刻属性が fieldname のテンプレートで定義されている場合、mask パラメーターは省略できます。File Manager は、テンプレートで定義されている内部日付形式を使用します。
- day
- 日付の調整。
- month
- 月の調整。
- year
- 年の調整。
day、month、および year の調整値で、日付フィールドの対応する値を設定したり、増やしたり、減らしたりできます。正記号または負記号があると、現在の値に対して指定された数値を増やすまたは減らすことを示します。正記号または負記号がないと、現在の値を数値で置き換えることを示します。最初の非ブランク文字がアスタリスクの場合、現在の日、月、または年の値を使用して現在値が設定されます。それ以外の場合、このレコードから派生されます。month 値または year 値には、値に接尾部「E」を付けて、月の末日への調整を示すことができます。入力日付が月の末日の場合、日の演算も実行されている場合を除いて、結果の日付は月の末日になります。
'*+10'
- 現在の日、月、または年を設定し、それに 10 を加算します。
'*-10'
- 現在の日、月、または年を設定し、そこから 10 を減算します。
'+10'
- レコードで検出された現在値に 10 を加算します。
'-10'
- レコードで検出された現在値から 10 を減算します。
'+3E'
- 3 カ月を加算し、必要な場合、月の末日に調整します。
'22'
- 対応する日、月、または年の値を 22 に設定します。
月と年の演算
入力日付が月の末日で、月または年の値に接尾部「E」を指定した場合、または、結果として得られた月の日数が入力日付の日コンポーネントより小さい場合、その結果は、結果として得られた月の末日になります。それ以外の場合、結果の日コンポーネントは入力日付の日コンポーネントと同じになります。
- 今日が 2007 年 1 月 31 日であるとします。1 カ月を加算すると、結果は 2 月の末日である 2007-02-28 になります。
- month に「+3E」が指定され、入力日付が 2007 年 2 月 28 日であるとします。結果は、2007 年 5 月 31 日になります。
- month に「+3」が指定され、入力日付が 2007 年 2 月 28 日であるとします。結果は、2007 年 5 月 28 日になります。
- century
- 2 桁の年を解釈する 100 年の範囲の定義に使用する 0 から 100 の値を指定します。デフォルト値は、システム日付の 80 年前です。このパラメーターを使用して、値を調整します。
- error_report
- 「Y」を指定すると、入力日付または結果の日付が不正なため、関数が日付を変更できない場合に、エラー・メッセージが表示されます。デフォルトでは、このような日付は無視されます。
- tally_literal
- 関数が正常に動作した回数を示す TALLY 報告書に表示するリテラルを指定します。
例(X)
01 DATE-REC.
03 DATE-YYYYMMDD pic x(8).
03 DATE-MM-DD-YYYY pic x(10).
03 DATE-DD-MM-YYYY pic x(10).
03 DATE-YYYYDDD pic x(7).
03 DATE-YYYYDDDp pic 9(7) packed-decimal.
03 DATE-YYYYMMDDb pic 9(8) binary.
03 DATE-CYYDDD pic 9(6) packed-decimal.
03 DATE-DDMMYYYY pic 9(8).
03 DATE-YYMMDD OCCURS 6 times pic 9(6) packed-decimal.
03 filler pic x.
例 1
すべての日付フィールドに 60 日を加算して、エラーを報告します。すべての配列フィールドが変更されることに注意してください。
$$FILEM DSC INPUT=DDIN,
$$FILEM IGNLEN=YES,
$$FILEM TCIN=hlq.COBOL(SAMPLE),
$$FILEM OUTPUT=DDOUT,PROC=*
MOD_DATE('DATE-YYYYMMDD','YYYYMMDD','+60',,,,Y)
MOD_DATE('DATE-YYYYMMDDB','YYYYMMDD','+60',,,,Y)
MOD_DATE('DATE-MM-DD-YYYY','MM/DD/YYYY','+60',,,,Y)
MOD_DATE('DATE-DD-MM-YYYY','DD/MM/YYYY','+60',,,,Y)
MOD_DATE('DATE-YYYYDDD','YYYYDDD','+60',,,,Y)
MOD_DATE('DATE-YYYYDDDP','YYYYDDD','+60',,,,Y)
MOD_DATE('DATE-CYYDDD','CYYDDD','+60',,,,Y)
MOD_DATE('DATE-DDMMYYYY','DDMMYYYY','+60',,,,Y)
MOD_DATE('DATE-YYMMDD','YYMMDD','+60',,,,Y)
/*
例 2
例 1 と同じですが、コピーブックを使用しません。
$$FILEM DSC INPUT=DDIN,
$$FILEM OUTPUT=DDOUT,PROC=*
MOD_DATE(1,8,C,'YYYYMMDD','+60',,,,Y)
MOD_DATE(40,4,B,'YYYYMMDD','+60',,,,Y)
MOD_DATE(9,10,C,'MM/DD/YYYY','+60',,,,Y)
MOD_DATE(19,10,C,'DD/MM/YYYY','+60',,,,Y)
MOD_DATE(29,7,C,'YYYYDDD','+60',,,,Y)
MOD_DATE(36,,P,'YYYYDDD','+60',,,,Y)
MOD_DATE(44,,P,'CYYDDD','+60',,,,Y)
MOD_DATE(48,8,C,'DDMMYYYY','+60',,,,Y)
MOD_DATE(56,,P,'YYMMDD','+60',,,,Y)
MOD_DATE(60,,P,'YYMMDD','+60',,,,Y)
MOD_DATE(64,,P,'YYMMDD','+60',,,,Y)
MOD_DATE(68,,P,'YYMMDD','+60',,,,Y)
MOD_DATE(72,,P,'YYMMDD','+60',,,,Y)
MOD_DATE(76,,P,'YYMMDD','+60',,,,Y)
/*
例 3
すべての日付フィールドに 2 カ月 20 日を加算して、エラーを無視します。
$$FILEM DSC INPUT=DDIN,
$$FILEM IGNLEN=YES,
$$FILEM TCIN=hlq.COBOL(SAMPLE),
$$FILEM OUTPUT=DDOUT,PROC=*
MOD_DATE('DATE-YYYYMMDD','YYYYMMDD','+20','+2')
MOD_DATE('DATE-YYYYMMDDB','YYYYMMDD','+20','+2')
MOD_DATE('DATE-MM-DD-YYYY','MM/DD/YYYY','+20','+2')
MOD_DATE('DATE-DD-MM-YYYY','DD/MM/YYYY','+20','+2')
MOD_DATE('DATE-YYYYDDD','YYYYDDD','+20','+2')
MOD_DATE('DATE-YYYYDDDP','YYYYDDD','+20','+2')
MOD_DATE('DATE-CYYDDD','CYYDDD','+20','+2')
MOD_DATE('DATE-DDMMYYYY','DDMMYYYY','+20','+2')
MOD_DATE('DATE-YYMMDD','YYMMDD','+20','+2')
/*
例 4
すべての日付フィールド値を、現在の日付に 1 年 1 カ月 1 日加算した値に設定します。DATE-YYMMDD フィールドに使用する世紀ウィンドウを 60 に変更します。
$$FILEM DSC INPUT=DDIN,
$$FILEM IGNLEN=YES,
$$FILEM TCIN=hlq.COBOL(SAMPLE),
$$FILEM OUTPUT=DDOUT,PROC=*
MOD_DATE('DATE-YYYYMMDD','YYYYMMDD','*+1','*+1','*+1')
MOD_DATE('DATE-YYYYMMDDB','YYYYMMDD','*+1','*+1','*+1')
MOD_DATE('DATE-MM-DD-YYYY','MM/DD/YYYY','*+1','*+1','*+1')
MOD_DATE('DATE-DD-MM-YYYY','DD/MM/YYYY','*+1','*+1','*+1')
MOD_DATE('DATE-YYYYDDD','YYYYDDD','*+1','*+1','*+1')
MOD_DATE('DATE-YYYYDDDP','YYYYDDD','*+1','*+1','*+1')
MOD_DATE('DATE-CYYDDD','CYYDDD','*+1','*+1','*+1')
MOD_DATE('DATE-DDMMYYYY','DDMMYYYY','*+1','*+1','*+1')
MOD_DATE('DATE-YYMMDD','YYMMDD','*+1','*+1','*+1','60')
/*