現在地: Visual LANSA 開発者ガイド > 1. アプリケーション、フィールド、データベース、リポジトリの概要 > 1.6 アプリケーション・データベースの作成 > 仮想列の応用例
仮想列の応用例

実列と仮想列の違い」では、仮想列を使う非常に簡単な例を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という書式の仮想列を定義する、という使い方が考えられます。注文処理では実列の書式、印刷の際は仮想列の書式、というように使い分けができます。

日付から年齢への変換

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

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

実行時データ変換

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

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

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

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

実列と仮想列の違い

仮想列の考え方