7.17.2 DEF_ARRAYについてのコメント/警告
配列機能を適切に使用するには、IBM iにおける文字、パック10進数、および符号付き/ゾーン10進数のデータ保管形式について理解しておく必要があります。
配列を定義すると、ユーザー自身がDEFINEコマンドで定義したかのように、さまざまなフィールドが自動的にファンクションに定義されます。
RDMLXフィールドをオーバーレイすることはできません。また、RDMLXフィールドで他のフィールドをオーバーレイすることもできません。
以下の例では、#VAL01、#VAL02、および#VAL03がすべて長さ7桁、小数点以下桁数2桁のパック10進数フィールドであるとします。
DEF_ARRAY NAME(#VAL) INDEXES(#II #JJ) OF_FIELDS(#VAL01 #VAL02 #VAL03)
これにより、以下の「フィールド」がファンクションに定義されます。
· #VAL#IIという(7,2)のパック10進数フィールド。このフィールドにより、索引#IIを使用して配列#VALに対して索引による参照を行うことができます。
· #VAL#JJという(7,2)のパック10進数フィールド。このフィールドにより、索引#JJを使用して配列#VALに対して索引による参照を行うことができます。
また、RANGECHECKやSET_ERRORなどのデータ妥当性検査コマンドから#VAL#IIまたは#VAL#JJを参照すると、関連付けられたOF_FIELDフィールドにエラーが設定されます。
例:
CHANGE FIELD(#II) TO(3)
SET_ERROR FOR_FIELD(#VAL#II)
CHANGE FIELD(#JJ) TO(1)
SET_ERROR FOR_FIELD(#VAL#JJ)
DISPLAY FIELDS(#VAL01 #VAL02 #VAL03)
上記のように指定した場合、SET_ERRORコマンドにより、フィールド#VAL01および#VAL03にエラー・フラグが設定されるため、これらのフィールドは反転表示されます。
· これらの要素フィールド#VAL#IIおよび#VAL#JJは、ほぼすべてのコマンドで個別のフィールドとして参照できます。ただし、以下の場所では使用できません。
· 画面パネル上。DISPLAY FIELDS(#VAL#II)は形式に関わらず無効です。使用すると、コンパイルに失敗します。同様に、ブラウズ・リストに含めることもできません。ただし、作業リストには挿入できます。
· EXEC_OS400またはEXEC_CPFコマンド内。代わりに中間作業フィールドを使用してください。詳細については、以下の例を参照してください。
· デバッグ・モードで。デバッグ機能では、#VAL#IIを直接表示することはできません。
· データベース操作で。以下のコード・セクションは等価ではありません。2番目の操作では、結果が生成されません。
FETCH FIELDS(#VAL01) FROM_FILE(.....)
および CHANGE #II 1
FETCH FIELDS(#VAL#II) FROM_FILE(.....)
#VAL#ARRAYという長さ12文字の文字フィールド。このフィールドでは、配列#VALが文字形式ですべて表されます。この場合、3 * P(7,2)では12バイトの記憶域が使用されます。このフィールドが自動的に定義されるのは、配列の長さの合計が256バイト以下の場合のみです。
この完全な配列フィールド#VAL#ARRAYは、以下の処理に使用できるため非常に便利です。
· 配列全体を交換リストによって別のファンクションに、またはパラメータによって3GLプログラムに渡すことができます。当然、他方のファンクション内の配列名が同じで、その他すべての点についても同じである必要があります。また、交換リスト域全体が2Kバイトに過ぎないことを覚えておいてください。
· デバッグ・モードで、配列全体の内容を表示できます。
· 英数字配列を1つのコマンドで初期化できます。
· 画面パネルまたはレポートに表示できます。ただし、実際の配列の内容がパック10進数データの場合は、ワークステーション装置エラーが発生する可能性があります。
· 作業リストに挿入できるため、2次元の配列処理が促進されます。1つの「索引」は作業リストの項目番号、もう1つは実際の配列項目索引です。
· プログラム内では、#VAL#II、#VAL#JJ、#VAL#ARRAYなどのフィールドは実フィールドであるため、OVERRIDEコマンドでその属性をオーバーライドすることが可能です。長さや小数点以下桁数をオーバーライドしないでください。
· RDMLファンクションをRPGコードに変換するときに、最大40個の配列をLANSAで定義して、プログラム処理を促進することができます。配列の数とタイプは、RDMLファンクションの複雑さと、RDMLファンクションで使用される機能によって決まります。
· また、グループ、リスト、データベース操作、または画面パネルの対話ごとに、追加の配列が定義されます。
· 1つのRPGプログラムで使用できる配列数は200個に制限されます。
· RDMLプログラムが自動的に使用する実際の配列数はコンパイル時まで予測できないため、各ファンクションで定義する配列数が50〜100個を超えないようにしてください。1つのRDMLファンクション内では、配列数×索引数が100以下になるようにしてください。