7.20.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 バイトに過ぎないことを覚えておいてください。
- デバッグ・モードで、配列全体の内容を表示できます。
- 画面パネルまたはレポートに表示できます。ただし、実際の配列の内容がパック 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 以下になるようにしてください。