動的変数制御文
本章では、動的変数制御文と各オペランドについて説明します。
2. %%制御文
%%制御文は、JCLで「%%」で始まるすべての変数を示します。JCL構文とは関係なく、インストリーム・データを含むどの位置にも記述できます。変数の前に「%%」が記述されている構文を、OpenFrameでは%%制御文として認識します。
%%制御文が含まれたJCLを実行するには、textrunツールを使用してジョブをサブミットする必要があります。textrunを実行する場合は、textrunサブジェクトのAUTOEDITセクションのUSEキーの値をYESに設定する必要があります。
|
以下は、%%制御文についての説明です。
-
使用方法
%%変数名
項目 説明 変数名
特定の文字列の前に「%%」が記述されている場合、その構文は%%制御文として扱われます。
変数名は、単純な変数、またはOpenFrameでサポートするオペレーションになります。オペレーションおよびシステム変数の種類は下で説明します。
オペレーション
以下は、変数名に記述できるオペレーションの一覧です。各オペレーションの詳細については、各節で説明します。
オペレーション | 説明 |
---|---|
変数に値を指定します。 |
|
特定のパスのファイルに記述された変数リストを呼び出します。 |
|
条件を指定し、条件の結果に従って実行する構文を記述します。 |
OpenFrameでは、上記のオペレーション以外はサポートされません。 |
システム変数
以下は、%%制御文で定義しているシステム変数の一覧です。OpenFrameでサポートしている%%制御文のシステム変数は以下のとおりです。
システム変数 | 説明 |
---|---|
TIME |
システムの現在の時間を hhmmss形式で出力します。 |
DAY |
システムの現在の日付の日(day)を dd形式で出力します。 |
ODAY |
入力された日付の日(day)を dd形式で出力します。 |
RDAY |
システムの現在の日付の日(day)を dd形式で出力します。 |
RWDAY |
システムの現在の曜日を1桁の数字で出力します。
|
OJULDAY |
入力された日付をユリウス日付形式(nnn)で出力します。 |
DATE |
システムの現在の日付を yymmdd形式で出力します。 |
$DATE |
システムの現在の日付を yyyymmdd形式で出力します。 |
ODATE |
入力された日付を yymmdd形式で出力します。 |
$ODATE |
入力された日付を yyyymmdd形式で出力します。 |
$RDATE |
入力された日付を yyyymmdd形式で出力します。 |
RDATE |
入力された日付を yymmdd形式で出力します。 |
OMONTH |
入力された日付の月(month)を mm形式で出力します。 |
RMONTH |
入力された日付の月(month)を mm形式で出力します。 |
OYEAR |
入力された日付の年度(year)を yy形式で出力します。 |
$OYEAR |
入力された日付の年度(year)を yyyy形式で出力します。 |
RYEAR |
入力された日付の年度(year)を yy形式で出力します。 |
$RYEAR |
入力された日付の年度(year)を yyyy形式で出力します。 |
OCENT |
入力された日付の年度(year)の最初の2桁を yy形式で出力します。 |
BLANKn |
n個の空白を出力します。 |
RN |
OpenFrameではエラーを防ぐために構文のみサポートしています。 |
2.1. SET
SET文の後に指定された%%変数に値を指定します。
-
使用方法
%%SET %%変数名 = 演算式
項目 説明 変数名
SET文の後ろに「%%変数名」形式で指定します。値を代入する変数名を記述します。
演算式
変数名に代入する演算式を指定します。
整数の変数または演算式を記述することができます。変数に接頭辞の「%%」が付いていない場合は、数字または文字列として認識します。
以下は、演算式でのみ使用できるシステム変数です。
-
CALCDATE : 日付を計算して6桁(yymmdd)で出力します。
-
$CALCDTE : 日付を計算して8桁(yyyymmdd)で出力します。
-
$WCALC : 日付を計算して8桁(yyyymmdd)で出力します。
-
$JULIAN : グレゴリオ暦の日付(yyyymmdd)をユリウス暦の日付(yyyyddd)に変更します。
-
SUBSTR : 指定した文字列で部分文字列を抽出します。
-
PLUS : 前の値と後ろの値を足します。
-
MINUS : 前の値から後ろの値を引きます。
演算式には、数字・文字形式の変数、およびシステム指定の変数を記述できます。
-
-
使用例
-
以下は、SET文で変数A、Bに値を指定する例です。A、Bに代入される値はそれぞれ100、300になります。
%%SET %%A = 100 %%SET %%B = %%A + 200
-
以下は、SET文で変数C、D、Eに値を指定する例です。入力された日付が「20191231」である場合、C、D、Eに代入される値はそれぞれ「20191226」、「191226」、「191229」になります。
%%SET %%C = %%CALCDATE %%$ODATE - 5 %%SET %%D = %%$CALCDTE %%$ODATE - 5 %%SET %%E = %%D %%PLUS 3
-
以下は、SET文で変数F、Gに値を指定する例です。変数Fには「OPENFRAME」という文字列が保存されます。変数Gには変数Fに保存された文字列の最初のバイトから4桁の値の「OPEN」が保存されます。
%%SET %%F = OPENFRAME %%SET %%G = %%SUBSTR %%F 1 4
-
2.2. GLOBAL
GLOBAL文を使用して、変数リストを保存したファイルを呼び出して使用することができます。この機能を使用すると、JCLに同じSET文を記述する必要はなくなります。
-
使用方法
%%GLOBAL ファイル名
項目 説明 ファイル名
変数リストが定義されたファイルの名前をGLOBAL文の後ろに指定します。
2.3. IF/ELSE/ENDIF
条件を指定し、条件の結果に従って実行する構文を記述します。ELSE文はIF文が先に記述された場合にのみ使用することができ、IF文はENDIF文で終了する必要があります。IF文を重複して使用することもできます。
-
使用方法
%%IF %%変数名 条件文 AAA %%ELSE BBB %%ENDIF
項目 説明 条件文
IF文で指定可能な条件は以下のとおりです。
-
EQ : 左辺と右辺が等しい場合に真になります。
-
NE : 左辺と右辺が等しくない場合に真になります。
-
GT : 左辺が右辺より大きい場合に真になります。
-
GE : 左辺が右辺以上の場合に真になります。
-
LT : 左辺が右辺より小さい場合に真になります。
-
LE : 左辺が右辺以下の場合に真になります。
-
-
使用例
以下は、IF/ELSE/ENDIF文の使用例です。入力日付が「yyyymmdd」である場合、変数Sには最初の2文字のyyが保存されます。yyの値が20より大きい場合は、変数Xの値が1になり、そうでない場合は0になります。
%%SET %%T = %%$ODATE %%SET %%S = %%SUBSTR 1 2 %%IF %%S GT 20 %%SET %%X = 1 %%ELSE %%SET %%X = 0 %%ENDIF
3. OPC制御文
OPC制御文は、JCLで「//*%OPC」で始まり、JCL構文とは関係なく、どの位置にも記述できます。
OPC制御文が含まれたJCLをサブミットするには、textrunツールを使用してジョブをサブミットする必要があります。textrunを実行する場合は、OpenFrame環境設定のtextrunサブジェクトのTWSセクションのUSEキーのValue項目の値をYESに設定する必要があります。
|
以下は、OPC制御文についての説明です。
-
使用方法
//*%OPC △¹オペレーション △¹オペランド
項目 説明 オペレーション
「//*%OPC」の後ろに1つ以上の空白を入れてオペレーションを記述します。サポートされるオペレーションについては、オペレーションを参照してください。
オペランド
オペレーションの後ろに1つ以上の空白を入れてオペランドを記述します。オペランドはオペレーションによって異なります。
オペレーション
以下は、上記で説明したオペレーションについての説明です。OpenFrameでサポートしているオペレーションは以下のとおりです。
オペレーション | 説明 |
---|---|
SCAN文の後に記述されたオペレーションのみ動作し、SCAN文の前に記述されたオペレーションは動作しません。 |
|
日付変数の形式を指定します。 |
|
変数の値を指定します。 |
|
ドメインの始めを指定します。 |
|
ドメインの最後を指定します。 |
OpenFrameでは、上記で説明していないオペレーションはサポートされません。 |
3.1. SCAN
SCAN文の後に記述されたオペレーションのみ動作し、SCAN文の前に記述されたオペレーションは動作しません。JCLのどの位置にも記述できますが、1つのJCLにSCAN文を2回記述すると、エラーが発生します。
-
使用方法
//*%OPC SCAN
3.2. SETFORM
日付変数の形式を指定します。
-
使用方法
//*%OPC SETFORM 日付変数=(文字列形式)
項目 説明 日付変数
形式を指定する日付変数を指定します。現在OpenFrameでサポートしている日付変数はOCDATEです。
文字列形式
日付変数に適用する形式を指定します。
現在OpenFrameでサポートしているキーワードは以下のとおりです。以下のキーワード以外の文字はすべて文字列として処理されます。
-
CC: 日付の年度4桁のうち前の2桁の数字を示します。必ずYYキーワードと組み合わせて使用される必要があります。
-
YY : 日付の年度4桁のうち後ろの2桁の数字を示します。
-
MM : 日付の月を示します。
-
DDD : ユリウス日付を示します。文字列の中でD文字が連続して3つ以上出現する場合、DDDキーワードが優先して適用され、残りの文字は文字列かDDキーワードとして処理されます。
-
DD : 日付の日を示します。
-
-
使用例
以下は、SETFORM文でOCDATEの形式を指定する例です。入力された日付が「19980201」である場合、OCDATEの結果は「032011998」になります。
//*%OPC SETFORM OCDATE=(DDDDDCCYY)
3.3. SETVAR
変数の値を指定します。現在、OpenFrameでサポートしている形式は次の2つです。SETVAR文を使用する際、日付変数と単位が一致しない場合は、エラーが発生します。
-
使用方法
//*%OPC SETVAR 変数=(日付変数 {+|-} nnnTT) //*%OPC SETVAR 変数=('文字列')
項目 説明 変数
変数の名前を指定します。変数名は必ず「T」で始まる必要があります。
日付変数
日付変数を指定します。現在OpenFrameでサポートしている日付変数は、OCDATE、OYYY、OYY、OMM、ODDです。
nnn
0から999までの数字を指定します。
TT
単位を指定します。
現在OpenFrameでサポートしている単位は以下のとおりです。
-
YR: 年
-
MO : 月
-
CD : カレンダーの基準日
-
-
使用例
以下は、SETVAR文で変数を指定する例です。入力されたOCDATE変数の値が「19980507」の場合、TAAの値は「19990507」になります。
//*%OPC SETVAR TAA=(OCDATE+1YR)
3.4. BEGIN
ドメインの始めを指定します。BEGIN文を使用する場合は、END文とペアで使用する必要があります。BEGIN-ENDドメインは他のBEGIN-ENDドメインと重複したり、入り交じって使用されることができません。COMPパラメータに記述された条件式が真の場合はドメインが動作し、偽の場合はドメインが動作しません。
-
使用方法
//*%OPC BEGIN ACTION={INCLUDE|EXCLUDE|NOSCAN},COMP((式1).{EQ|NE|GE|GT|LE|LT}.(式2))
項目 説明 INCLUDE
ドメインをジョブに含めます。
EXCLUDE
ドメインをジョブから除外します。現在はサポートしていません。指定する場合は、INCLUDEを指定した場合と同様に動作します。
NOSCAN
ドメインに含まれた領域が置換されないようにします。現在はサポートしていません。指定する場合は、INCLUDEを指定した場合と同様に動作します。
EQ
EQ比較演算子。左辺と右辺が等しい場合に真になります。
NE
NE比較演算子。左辺と右辺が等しくない場合に真になります。
GE
GE比較演算子。左辺が右辺以上の場合に真になります。
GT
GT比較演算子。左辺が右辺より大きい場合に真になります。
LE
LE比較演算子。左辺が右辺以下の場合に真になります。
LT
LT比較演算子。左辺が右辺より小さい場合に真になります。
-
使用例
以下は、BEGIN文の使用例です。入力されたOCDATEの値が「19980507」の場合に、COMPパラメータの条件式が真になってドメインが動作し、SETVARに指定したTBB変数が設定されます。
//*%OPC BEGIN ACTION=INCLUDE,COMP(&OCDATE..EQ.(19980507)) //*%OPC SETVAR TBB=(OCDATE+1YR) //*%OPC END ACTION=INCLUDE