【IRIS/Cache】【SQL】クラスで構築していないグローバルに対しSQLを実行する(実践編)

はじめに

現在のデータクラスが普及する前のデータベースは、グローバルに直接記述する方法が採用されていました。

そのグローバル構造をSQLで取得する必要が出てきたので、備忘を兼ねて2回に分けて記事にします。

※基礎編

下位ノードのデータを含める

基本編と異なり今回は、更新通番のデータ部に更新情報が格納されており、ノード3「”DATA”」にユーザ情報が格納されているケースをマッピングしてみたいと思います。

また今回は、データ部をリストで作成してみたいと思います。

ノード1ノード2ノード3データ項目備考
ユーザコード更新通番更新日時YYYY-MM-DD hh:mm:ss
初回登録日時YYYY-MM-DD hh:mm:ss
登録者コード
“DATA”漢字氏名
カナ氏名
性別
生年月日%Date型
^Sample.Use

更新通番のノードを主体に、下位ノードのユーザ情報を取得して1つのデータクラスにしてみたいと思います。

下位ノードのデータを取得する場合は、ノード列に固定値「”DATA”」を設定します。
また、データ部がリストの場合は、デリミタはnullにします。

では、確認のために管理ポータルよりSQLを実行してみたいと思います。

バッチリデータが取得出来ていますね。

上位ノードのデータを含める

先ほどとは逆に、下位ノードから上位ノードのデータを含めたいと思います。

この場合、IdKeyが「userCode, ver, “DATA(固定値)”」になります。

上位ノードのデータを取得するには、「(N)D」を入力します。
今回は「3D」になります。

(N)の数値は下記になっているようです。

  • ^Sample.Use → 1D
  • ^Sample.Use(“001”) → 2D
  • ^Sample.Use(“001”,1) → 3D

配列での取り込み

下位ノードの項目を全て1プロパティに配列で格納してみたいと思います。
グローバルのレイアウトは下記になります。

ノード1ノード2ノード3ノード4 データ項目備考
ユーザコード更新通番漢字氏名
カナ氏名
性別
生年月日%Date型
更新日時YYYY-MM-DD hh:mm:ss
初回登録日時YYYY-MM-DD hh:mm:ss
登録者コード
“DATA”キー好物
^Sample.Use

上記好物を1つのプロパティにすべて詰め込みます。

/// 好物
Property favorite As list Of %String;

今回は、「取得コードを使用」にチェックを入れ、データ取得用の処理をテキストエリアに記述します。

s key=""
f {
	s key = $o(^Sample.Use({L1},{L2},"Favorite", key),1,data) q:key=""
	s $li({*}, *+1) = data
}

「{L1}」「{L2}」は、サブスクリプトで設定した項目が該当します。
「{*}」が対象の「favorite」フィールドですね。

処理としては何てことないロジックですが、「L1、L2,*」等のキーワードは覚えておく必要があると思います。

ではコンパイルを行い、管理ポータルで結果を確認してみましょう。

全ての好物が「favorite」フィールドに表示されているのが確認できました。

リレーションシップを行う

最後にリレーションシップで、連絡先テーブルを子テーブルとして構築したいと思います。

ノード1ノード2ノード3ノード4 データ項目備考
ユーザコード更新通番漢字氏名
カナ氏名
性別
生年月日%Date型
更新日時YYYY-MM-DD hh:mm:ss
初回登録日時YYYY-MM-DD hh:mm:ss
登録者コード
“address”キー電話番号
郵便番号
住所
^Sample.Use

住所テーブルを作成したいと思います。
作成後はSQLマッピングを行いたいので、コンパイルは行いません。

Class developer.data.Address Extends %Persistent
{

Index priKey On (userData, keyNum) [ IdKey ];

/// リレーション
Relationship userData As developer.data.UserData [ Cardinality = parent, Inverse = address ];

/// 採番値
Property keyNum As %Integer;

/// 電話番号
Property telephone As %String;

/// 郵便番号
Property postCode As %String;

/// 住所
Property residence As %String;

}

リレーションの設定は、親要素の「userData」を利用して、「{userData.userCode}」「{userData.ver}」を手入力します。

後は、「developer.data.UserData.cls」にもリレーションの設定を追加します。
設定が完了したらコンパイルします。

/// 子テーブル連携
Relationship address As developer.data.Address [ Cardinality = children, Inverse = userData ];

では、子テーブルの「Address」をSQLで取得してみましょう。

親テーブルと連携して子テーブルが取得できました。

※最終的な子テーブルの構成

Class developer.data.Address Extends %Persistent [ StorageStrategy = Address ]
{

Index priKey On (userData, keyNum) [ IdKey ];

/// リレーション
Relationship userData As developer.data.UserData [ Cardinality = parent, Inverse = address ];

/// 採番値
Property keyNum As %Integer;

/// 電話番号
Property telephone As %String;

/// 郵便番号
Property postCode As %String;

/// 住所
Property residence As %String;

Storage Address
{
<SQLMap name="Map1">
<Data name="postCode">
<Piece>2</Piece>
</Data>
<Data name="residence">
<Piece>3</Piece>
</Data>
<Data name="telephone">
<Piece>1</Piece>
</Data>
<Global>^Sample.Use</Global>
<Subscript name="1">
<Expression>{userData.userCode}</Expression>
</Subscript>
<Subscript name="2">
<Expression>{userData.ver}</Expression>
</Subscript>
<Subscript name="3">
<Expression>"address"</Expression>
</Subscript>
<Subscript name="4">
<Expression>{keyNum}</Expression>
</Subscript>
<Type>data</Type>
</SQLMap>
<StreamLocation>^developer.data.AddressS</StreamLocation>
<Type>%Storage.SQL</Type>
}
}

おわりに

旧データをマッピングしてSQLで取得する方法をご紹介いたしました。

設定がかなり複雑なので、思った以上に手間取る事もあるかと思いますが、昔のデータを今風に復活させることが出来る技術は、知っておいて良いかもしれません。

SQLが使えるだけでも頑張る価値があると思います。
何かのお役に立てれれば幸いです。