変数変更 (CHGVAR)

変数変更(CHGVAR)コマンドは,制御言語(CL)変数の値または文字変数の一部を変更します。この値は固定情報の値,別の変数の値,または式あるいは組み込み関数の評価の結果として得られた値に変更することができます。式と組み込み関数については,IBM i Information Center(http://www.ibm.com/systems/i/infocenter/)の「プログラミング」カテゴリーの「制御言語(CL)」トピック・コレクションの「CLコマンド内の式」を参照してください。また,10進値と文字値の間の暗黙変換は,VALUEパラメーターの説明に記載されている規則によって実行されます。

2進組み込み関数(%BINARYまたは%BIN)は, CL変数名 (VAR)パラメーターまたは新しい値 (VALUE)パラメーターの中で10進変数の代わりに使用することができます。文字変数の指定された部分は,VARパラメーターと一緒に使用されると,VALUEパラメーターに指定された算術式の符号付き2進整数等価値に変更されます。文字変数の指定された部分は,VALUEパラメーター内で使用されると,VALUEパラメーターの値の評価に使用された時に10進数に変換される符号付き2進整数とみなされます。2バイトの2進整数は10進(5 0)数に変換され,4バイトの2進数は10進(10 0)数に変換されます。そうすると,評価された式の結果は,VARに指定された変数に割り当てられます。

サブストリング組み込み関数(%SUBSTRINGまたは%SST)は,VARまたはVALUEパラメーターの中で文字変数の代わりに使用することができます。文字変数の指定された部分は,VARパラメーターと一緒に使用されると,VALUEパラメーターに指定された式の値に変更されます。文字変数の指定された部分は,VALUEパラメーター内で使用されると,VALUEパラメーターの値の評価に使用されます。2バイトの2進整数は10進(5 0)数に変換され,4バイトの2進数は10進(10 0)数に変換されます。そうすると,評価された式の結果は,VARに指定された変数に割り当てられます。

サブストリング組み込み関数を使用して,ジョブと関連した内部データ域の全部または一部を,検索したり変更したりすることができます。

%SWITCH組み込み関数は,VALUEパラメーターの中で,プログラム内で宣言された論理変数の代わりに使用することができます。%SWITCHには,ジョブ内の8個のジョブ・スイッチのどれが1と0のテストをされるかを示す8文字のマスクがあります。VALUEパラメーターに%SWITCHが指定されると,VARパラメーターで指定された論理変数は,この組み込み関数の論理結果がすべて真の場合に'1'に設定されます。テストされたジョブ・スイッチのどれかが偽条件を示すと,変数は'0'に設定されます。

10進変数に10進値をコーディングする場合

10進変数に数値を指定する場合:

例えば,10進変数が5桁の10進値(そのうち2桁は小数部分)として定義されている場合は,次のような値をコーディングすることができます。

  指定             仮定
  値               値
  ------------   --------
  2.7または2,7     2.70
  27または27.00    27.00
  -27              -27.00

10進変数に文字値をコーディングする場合

10進変数に文字値を指定する場合:

以下の例は,文字変数&Aの示されている文字値を10進変数&Bの10進値に変換した場合の結果を示しています。

 CHGVAR   VAR(&B)  VALUE(&A)

|     文字変数&A         |     文字変数&B          |
|                        |                         |
|---------+--------------+--------+----------------|
|長さ     |指定          |長さ    |変換            |
|         |値            |        |結果            |
|---------+--------------+--------+----------------|
| 10      | '+123.1'     | 5, 2   | 123.10         |
| 10      | '+123.00'    | 5, 0   | 123            |
| 10      | '-123'       | 5, 2   | -123.00        |
|---------+--------------+--------+----------------|

10進変数&Bの代わりに2進組み込み関数が使用されると,10進値は符号付き2進数に変換されます。

文字変数に文字値をコーディングする場合

文字変数に文字ストリングを指定する時,文字ストリングが特殊文字を含んでいたり,すべて数字からなっていたりする場合は,文字ストリングを単一引用符で囲む必要があります。例えば,'ABC 67'や'37.92'などです。前者はブランクを含んでおり,後者は小数点を含み,すべて数字からなっています。37.92をアポストロフィで囲まないと,文字値ではなく10進値として扱われます。

文字変数の場合は,VALUEパラメーターの文字ストリングがVARパラメーターで指定した変数より短いと,右側にブランクが埋め込まれ,長いと,右側が切り捨てられます。

ある文字変数を別の文字変数の一部と等しく設定する場合は,そのサブストリングを含む変数の名前,開始文字位置,および置き換える文字の数を,サブストリング組み込み関数のパラメーターとして指定してください。開始位置と文字数はCL変数で指定することができます。

文字変数に10進値をコーディングする場合

文字変数に10進値を指定する場合:

以下の例は,10進変数&Bの示されている10進値を文字変数&Aの文字値に変換した場合の結果を示しています。

 CHGVAR   VAR(&A)  VALUE(&B)

10進変数&Bの代わりに2進組み込み関数が使用されると,符号付き2進数は10進数に変換されます。

|       10進変数&B  |      文字変数&A      |
|                       |                          |
|--------+--------------+---------+----------------|
|長さ    |指定          |長さ     |変換            |
|        |値            |         |結果            |
|--------+--------------+---------+----------------|
| 5, 2   | 23.00 OR +23 | 7       | 0023.00        |
| 5, 2   | -3.9         | 7       | -003.90        |
| 5, 2   | -123.67      | 7       | -123.67        |
|--------+--------------+---------+----------------|

注: 値が小数点と負の値を含むことができる場合は,小数点と符号文字を入れられるだけの十分な長さが文字変数に必要です。最後の例では,10進値が(5, 2)と定義されていますが,示されている値を入れるためには文字変数の長さが少なくとも7文字なければなりません。最後から2番目の例では,文字変数の長さが5文字しかなければ,変換結果-3.90が有効になります。

サブストリング組み込み関数を使用して,VARパラメーターに指定された文字変数のサブストリングを,VALUEパラメーターの10進値に変更することができます。

論理変数に論理値または文字値をコーディングする場合

論理変数の値は,'1'か'0'いずれかの論理値でなければなりません。指定する場合には,単一引用符で囲まなければなりません。ただし,VALUEパラメーターの中では,論理変数の代わりに%SWITCH組み込み関数を使用することができます。%SWITCH組み込み関数については,該当箇所を参照してください。

整変数に数値または文字値をコーディングする場合

整変数の規則は,小数桁を指定できないという点を除いて,10進変数の規則と同じです。符号なし整変数への割り当てでは,定数値を負の数値にすることはできません。

ポインター変数にヌル値を割り当てる場合

CLモジュールの作成(CRTCLMOD)コマンドまたはバインドCLプログラムの作成(CRTBNDCL)コマンドを使用してCLソースをコンパイルする場合は,CLポインター変数をヌル値に設定するために,特殊値*NULLを使用できます。CLプログラム作成(CRTCLPGM)コマンドを使用してCLソースをコンパイルする場合は,ADDRESS(*NULL)で宣言されていて,変更されていない別のCLポインター変数からCLポインター変数を設定します。

注: 10進変数および文字変数タイプの値は,16進形式で指定することができます(10進値58.0はX'580F')。ただし,文字値を16進形式で指定する場合は,16進数ストリングの妥当性検査は行われないので注意してください。

制約事項:

パラメーター

キーワード 記述 選択項目 ノーツ
VAR CL変数名 CL 変数名 必須, 定位置 1
VALUE 新しい値 文字値 必須, 定位置 2

CL変数名 (VAR)

値が変更されるCL変数を指定します。式が評価されるか,VARパラメーターが論理変数を指定する時以外は,変数のタイプがVALUEパラメーターで指定される定数または変数のタイプと同じである必要はありません。

サブストリング組み込み関数または2進組み込み関数を使用して,VARで指定された文字変数の一部分(つまり,変数内の文字ストリングのサブストリング)を,VALUEパラメーターで指定された値に変更する場合は,文字変数の名前を指定した後,変数名で指定された文字ストリング内の開始位置と変更する文字の数を指定してください。

これは必須パラメーターです。

新しい値 (VALUE)

変数の値を変更するために使用する式を指定します。式の中では,変数,定数,または組み込み関数を使用することができます。式については,IBM i Information Center(http://www.ibm.com/systems/i/infocenter/)の「プログラミング」カテゴリーの「制御言語(CL)」トピック・コレクションの「CLコマンド内の式」を参照してください。

これは必須パラメーターです。

1: 10進変数の変更

CHGVAR   &A  &B

変数&Aの値が変数&Bの値に設定されます。例えば,&Bの値が37.2ならば,&Aの値も37.2になります。

CHGVAR   &Y  (&Y + 1)

変数&Yの値が1だけ増えます。例えば,&Yの値が216であれば,その値は217に変更されます。

2:論理変数の変更

CHGVAR   &X  (&Y *OR &Z)

論理変数&Xの値が,論理変数&Yと論理変数&ZのOR演算の結果の値に設定されます。*ORを使用する時は,両方の変数が論理変数 でなければなりません 。&Yが'0'で,&Zが'1'なら,&Xは'1'に設定されます。

CHGVAR   &A  %SWITCH(10XXXX10)

論理変数&Aの値は,組み込み関数%SWITCHの論理結果によって決まります。8文字からなるマスクの1, 2, 7,および8桁目は,ジョブの対応するジョブ・スイッチがマスクに示された値であるかどうかをテストされることを示します。ジョブ・スイッチ1と7が1かどうかをテストされ,ジョブ・スイッチ2と8が0かどうかをテストされます。(スイッチ3から6はテストされません。)4個のスイッチすべてが%SWITCHマスクに指定された値どおりであれば,組み込み関数の論理結果は真で,変数&Aは'1'に設定されます。4個のスイッチのうちどれか1つでもマスクに示されていない値のものがあると,結果は偽となり,&Aは'0'に設定されます。

3:文字変数の変更

CHGVAR   VAR(&A)  VALUE(AB *CAT CD)
CHGVAR   &A  ('AB' *CAT 'CD')

この2つのコマンドは,変数&Aの値を文字ストリングABCDに等しく設定します。文字ストリングABCDは,2つの文字ストリングABとCDの連結の結果です。第1のコマンドは,引用符なしストリングを含むキーワード形式でコーディングされています。第2のコマンドは,2つの引用符付き文字ストリングを指定するVALUEパラメーターを含む定位置形式でコーディングされています。

CHGVAR   &VAR1  &VAR2

この例は,より短い文字ストリングによって値が変更される6桁の文字変数を示しています。コマンドの処理前は,&VAR1 = ABCDEFおよび&VAR2 = XYZであるとすると,&VAR1内の結果=右側に3個のブランクが埋め込まれたXYZになります。

CHGVAR   &VAR1  '12'

&VAR1が6文字の長さの文字変数であるとすると,&VAR1内の結果=右側に4個のブランクを埋め込まれた12になります。この例ではアポストロフィが必要です。

CHGVAR   VAR(%SUBSTRING(&A 4 3))  VALUE(REP)
または
CHGVAR   VAR(%SST(&A 4 3))  VALUE(REP)

&Aという名前の変数内の文字定数の3文字を変更するために,サブストリング組み込み関数が使用されています。&Aの値がABCDEFGHであるとすると,&A内の4番目,5番目,および6番目の文字がREPに設定されて,結果はABCREPGHとなります。

CHGVAR   VAR(%SST(*LDA 1 512))  VALUE(' ')

内部データ域をすべてブランクに変更するために,サブストリング組み込み関数が使用されています。

CHGVAR  VAR(%BINARY(&A 1 2))  VALUE(20)

または

CHGVAR  VAR(%BIN(&A 1 2))  VALUE(20)

&Aという名前の文字変数の最初の2文字を,数20の符号付き2進値または16進数X'0014'に変更するために,2進組み込み関数が使用されています。&Aという名前の文字変数の長さが10だとすると,変数&Aの3番目から10番目までの文字は変更されません。

エラー・メッセージ

*ESCAPE メッセージ

CPF0816
%SWITCHマスク&1が正しくない。