メニューボタン
サポートチーム便り2010.02.17

キー動作の理解

Question

フリー・フォーマット RPG でキーリストに「値のリスト」構文を使用しています。ミスをして、キーに誤ったフィールド・サイズを指定しても、RPG がその間違いを見つけません。この動作を説明している資料が見つかりませんでした。どうなっているのでしょうか。

Answer

RPG のネイティブ入出力操作では、従来の KLIST、キー・データ構造 (%KDS)、値のリストの 3 種類のフォーマットでキーリストがサポートされています。値のリストというフォーマットの大きな利点の 1 つは、キーリスト内で式を使用できる点です。式で 5,0 数値変数の値を 6,0 数値に割り当てられることができるように、サイズが外部定義と一致しないキーを使用することもできます。状況によっては、これは非常に便利です。

ILE RPG リファレンス・マニュアルは、CHAIN や SETLL などのネイティブ入出力操作の検索引数を指定するのに 4 通りの方法があると説明しています。これらのうち 3 つは、すでに説明したキーリストを指定する 3 種類の方法です。この資料は tinyurl.com/ljxa4yin でご覧いただけます。

マニュアルで列挙されているオプションの 1 つは、値のリストと呼ばれています。前述のマニュアル・ページには以下のように記載されています。

「3. "(a:b:c+2)" などの値のリスト。複合キーの各部分は任意の式になることができます。データ型は対応するキー・フィールドと一致する必要がありますが、長さとデータ・フォーマットは一致する必要はありません。」

例えば、この値のリスト構文を使用する CHAIN 演算は以下のようになります。

chain (custno: shipDate) SALESTOT;

この例では、キー・リストに custno と shipDate の 2 つのキーがあります。資料では、データ型は一致する必要がありますが、長さとフォーマットは一致する必要がないと記載されています。この動作は非常に便利だと思います。

フィールド長に一貫性がないファイルがあります。例えば、あるファイルでは GL 番号は 5,0 で、別のファイルでは 6,0 です。IBM による「値のリスト」キーリストの実装方法のおかげで、数字を一時フィールドに移動する必要がありません。ただ、一時フィールドにチェーンするだけです。

chain (inputGL) GLMAST;

この例では、inputGL は 5,0 ですが、GLMAST へのキーは 6,0 です。(KLIST ではしたように) 一時変数にコピーする必要はありません。RPG が代わりにフィールド長を調整してくれます。これらのキー・フィールドにはどんな式も使用できるため、EVAL が動作するように動作します。これは非常に直感的に理解できると思います。EVAL である変数を別の変数に割り当てる場合、変数のデータ型は一致する必要はありません。(数字が 5,0 フィールドに当てはまる限り、6,0 フィールドを 5,0 フィールドに割り当てることができます。) また式は、多少の操作ができることを意味しています。例えば、日付フィールドをあるフォーマットから別のフォーマットに正にキーリスト上で変換できます。

setll (%dec(%date(inputField:*USA):*ISO)) Calendar;

上記のコードは、フィールドを MMDDYYYY フォーマットから YYYYMMDD にキーリスト上で変換し、これにより一時フィールドをコーディングする手間が省けます。

さらに、「ロケーション」がウェアハウス番号 (1A) とロケーション (7A) で表現されるインベントリー・ファイルがいくつかあります。また、ロケーションが 1 つの 8A フィールドのインベントリー・ファイルがあります。ご心配なく。以下のようにすれば可能です。

chain (WHSE + LOCATION) MyFile;

この場合、2 つのフィールド (WHSE および LOCATION) が連結されており、出力が MyFile への第 1 キーとして使用されています。ここでも、一時フィールドをコーディングする手間が省けます。フィールド・サイズが確実に一致するようにしたい場合は、%KDS または KLIST を使用してその動作を取得します。実際、%KDS により、ファイルの外部定義から代わりにキー・リストを構築するよう RPG に指示できるため、不一致になる心配はありません。

D keys      ds            likerec(GLMASTR: *KEY)
   .
   .
   keys.glno = inputGL;
   chain %kds(keys) GLMAST;

それらが同じサイズになるよう RPG に保証させたい場合は、この方法が、非常に効き目があります。したがって、必要な場合はそれを選択できます。しかし個人的には、%KDS への式とその堅固な値をサポートしている「値のリスト」方法が好みです。コード数行の手間が省け、多少プログラムを簡単にしてくれます。

RPG ではどちらの方法でも可能です。両方の世界の最も優れた部分が利用できます。両方試してみて、どちらが好みか決めてください。

あわせて読みたい記事

PAGE TOP