EVAL (式の評価)
自由形式構文 | {EVAL{(HMR) } } 結果 = 式 |
{EVAL{(HMR) } } 結果 += 式 | |
{EVAL{(HMR) } } 結果 -= 式 | |
{EVAL{(HMR) } } 結果 *= 式 | |
{EVAL{(HMR) } } 結果 /= 式 | |
{EVAL{(HMR) } } 結果 **= 式 |
コード | 演算項目 1 | 拡張演算項目 2 | ||||
---|---|---|---|---|---|---|
EVAL (H M/R) | 割り当てステートメント |
EVAL 命令コードは、"結果 = 式" または "結果命令 = 式" の形式の割り当てステートメントを評価します。式が評価されると結果が結果に入れられます。 したがって、結果をリテラルまたは定数とすることはできず、 フィールド名、配列名、配列要素、データ構造、データ構造サブフィールド、 または %SUBST 組み込み関数を使用したストリングとしなければなりません。
式では任意の RPG データ・タイプを生成することができます。 式のタイプは結果のタイプと同じでなければなりません。 文字、図形、または UCS-2 の結果は左寄せされ、必要に応じて右側にブランクが埋め込まれるか切り捨てられます。結果が可変長フィールドの場 合、その長さは式の結果の長さに設定されます。
結果が指標のない配列や 配列 (*) として指定された配列を表す場合に は、演算での配列の指定に説明されている規則に従って、 結果のそれぞれの要素に式の値が割り当てられます。 そうでない場合には、式が一度評価されて、その値が配列またはサブ配列のそ れぞれの要素に入れられます。 数値式の場合には、四捨五入の命令コード拡張を使用することができます。 四捨五入の規則は、算術演算の場合の規則と同じです。
自由形式演算仕様においては、拡張が不要である場合、および変数に命令コードと同じ名前がない場合は、命令コード名を省略できます。
割り当て演算子 +=、-=、*=、/=、および **= の場合、該当する演算は結果および式に適用され、
結果は結果に割り当てられます。 例えば、ステートメント X+=Y は X=X+Y とほぼ等しくなります。
この 2 つのステートメントの違いは、これらの割り当て演算子の場合、結果オペランドが評価されるのは 1 回のみであるということです。
これらの違いは、
結果命令を評価するときにサブプロシージャーを呼び出す場合に重要になります (例えば、次のような副産物があります)。
warnings(getNextCustId(OVERDRAWN)) += 1;
式の概要については、式を参照してください。数値式の精度に関する 規則については、数値演算の精度の規則を参照してください。これは、式に除算命令が入っている場合、または EVAL が いずれかの命令拡張を使用する場合には、特に重要です。
図 1. EVAL 命令
*..1....+....2....+....3....+....4....+....5....+....6....+....7...+....
* 前提: FIELD1 = 10
* FIELD2 = 9
* FIELD3 = 8
* FIELD4 = 7
* ARR は DIM(10) で定義されています。
* *IN01 = *ON
* A = 'abcdefghijklmno' (長さ 15 として定義)
* CHARFIELD1 = 'There' (長さ 5 として定義)
/FREE
// 命令の後の RESULT の内容は 20 です
eval RESULT=FIELD1 + FIELD2+(FIELD3-FIELD4);
// 標識 *IN03 は *ON に設定されます
*IN03 = *IN01 OR (FIELD2 > FIELD3);
// 配列 ARR の各要素には値 72 が割り当てられます
ARR(*) = FIELD2 * FIELD3;
// 命令後の A の内容 = 'Hello There '
A = 'Hello ' + CHARFIELD1;
// 命令後の A の内容 = 'HelloThere '
A = %TRIMR('Hello ') + %TRIML(CHARFIELD1);
// 日付の割り当て
ISODATE = DMYDATE;
// 比較式
// 命令後の *IN03 = *ON
*IN03 = FIELD3 < FIELD2;
// 比較式の日付
// 操作後に Date1 の日付が Date2 の日付を過ぎる場合、
// *IN05 が *ON に設定されます。
*IN05 = Date1 > Date2;
// EVAL の後の A の元の値には 'ab****ghijklmno' が入ります。
%SUBST(A(3:4))= '****';
// EVAL の後で PTR は変数 CHARFIELD1 のアドレスを持ちます。
PTR = %ADDR(CHARFIELD1);
// 論理式の結果を表示する例は
// 文字データ・タイプとの互換性を持ちます。
// 以下の EVAL ステートメントは、'+' 演算子を使用して連結された 3 つの、
// 論理式から構成されます。
// 文字フィールド RES の結果の値は '010' です。
RES = (FIELD1<10) + *in01 + (field2 >= 17);
// EVAL を使用してユーザー定義機能を呼び出す例です。
// プロシージャー FormatDate は、日付フィールドを文字ストリングに変換し、
// そのストリングを戻します。この EVAL ステートメントでは、
// フォーマット日付の出力に、フィールド DateStrng1 が割り当てられます。
DateStrng1 = FormatDate(Date1);
// 複雑なデータ構造の値を減算します。
cust(custno).account(accnum).balance -= purchase_amount;
// 文字を可変長の文字変数に付加します
line += '<br />';
/END-FREE