仮想フィールドの応用例

実フィールドと仮想フィールドの違い」では、仮想フィールドを使う非常に簡単な例を3つ示しました。実フィールドと仮想フィールドの対応関係も単純でした。

ここでは、仮想フィールドの機能を活かした、実際にもよく使われる例を紹介します。発想次第でこれ以外にも応用範囲は拡がるでしょう。

部分文字列の抽出、文字列の連結

文字列を3つに分割し、それぞれを仮想フィールドに対応づける例を先に示しました。このように、部分文字列を仮想フィールドに対応づけるやり方は、さまざまに応用できます。ひとつの実フィールドを複数の仮想フィールドに分割する方法のほか、文字列を連結することにより、逆に複数の実フィールドからひとつの仮想フィールドを作ることも可能です。

外部フィールド記述のないファイルへのアクセス

S/38用の旧アプリケーションや、S/36から移植されたIBM i用アプリケーションの多くは、「外部」フィールド記述のないファイルを使っています。これを「内部記述」ファイルと呼ぶこともあります。こういったファイルは、レコード全体がひとつの巨大なフィールドであるように見えてしまいますが、実際にはいくつかのフィールドに分かれています。

このような場合は、実際には存在するはずのフィールドを仮想フィールドとして定義し、レコード全体に相当する巨大なフィールドから派生させるとよいでしょう。先に示した、部分文字列の抽出により実フィールドを複数の仮想フィールドに分割する方法の例にもなっています。

また、逆にファイルに出力する際には、各仮想フィールドのデータを連結して実フィールドにする処理が必要になるかも知れません。詳しくは、『LANSA/AD ユーザー ガイド』の「仮想フィールドと派生コード」の例 1 および 2 を参照してください。

よく出てくるデータ操作の単純化と標準化

ファイル内のデータを特定のやり方で操作する処理が、いくつものアプリケーションに繰り返し現れる場合があります。

例えば在庫ファイルを考えてみましょう。製品の再注文が必要な条件は、「現在在庫量」+「買い戻しによる再入庫予定量」-「注文による出庫予定量」<「再注文基準量」というような規則で判断するのが普通です。この規則は、在庫管理に関する問い合わせ処理やレポート作成処理に、頻繁に現れます。

そこで仮想フィールドの機能を使えば、記述が簡潔になり、標準化も進むことになります。すなわち、REORDERという仮想フィールドを設け、計算式の評価結果にもとづき値を「YES」または「NO」にするよう定義すればよいのです。
この方法には次のような利点があります。

タイプや長さの変換

フィールドのタイプ(英字型、パック形式の数値型、符号つき数値型など)や長さが不適切であったり、使いにくかったりする場合にも、仮想フィールドの機能は役立ちます。

例えば最大でも999にしかならないフィールドが15桁の数値型である場合、レポート出力すると無駄に12桁分の空白ができてしまいます。このような場合、3桁の仮想フィールドを定義すれば無駄を解消できます。

同様に、英数字型で表した日付フィールドは、編集コード/編集語をつけて出力できないので、使いにくいことがあるかも知れません。これも数値型の仮想フィールドを使えば解決できます。

集約や累算

「配列」構造もデータベース・ファイルには頻繁に現れます。配列は一般に、SAL01、SAL02、SAL03、...、SAL12などといった一連のフィールドで表されます。例えば各月の売り上げはこのような形で表すことになるでしょう。

レポート作成や問い合わせ処理では、このような構造に仮想フィールドを使うと処理が簡潔になる場合があります。

例えばSALYRという仮想フィールドを設け、SAL01~SAL12の合計値を求めるようにしておけば、特別な処理をしなくても、レポートに1年分の売り上げが表示されることになります。

同様に、SALQ1(SAL01~SAL03の合計値を含む)、SALQ2(SAL04~SAL06の合計値を含む)などの、四半期単位の仮想フィールドを定義するのもよいでしょう。

日付の変換

実フィールドにはYYMMDDという書式で日付を保持し、これとは別にDDMMYYという書式の仮想フィールドを定義する、という使い方が考えられます。注文処理では実フィールドの書式、印刷の際は仮想フィールドの書式、というように使い分けができます。

日付から年齢への変換

誕生日を格納した日付型フィールドをもとに、現在の年齢や月齢を表す仮想フィールドを定義できます。この値は1日ごとに変わってしまうので、ある時点の年齢を実データとして格納するやり方は不適切です。

ただし、実際の計算処理は複雑なので、専用のサブルーチンを用意する必要があるでしょう。と言っても、LANSAにはRPGで記述したサブルーチンが付属しているので、これを呼び出すだけで済んでしまいます。

実行時データ変換

実行時にデータ変換を施す必要がある場合も、仮想フィールドを使って実現できます。

例えば、顧客名を次のように変換して印刷したい、という状況を考えてみましょう。

顧客名フィールドCUSNAMをもとに、上記の変換を施した仮想フィールドPRTNAMを定義するのは容易でしょう。

次のトピックも参照してください。

実フィールドと仮想フィールドの違い

仮想フィールドの考え方