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