はじめに
現在のデータクラスが普及する前のデータベースは、グローバルに直接記述する方法が採用されていました。
そのグローバル構造をSQLで取得する必要が出てきたので、備忘を兼ねて2回に分けて記事にします。
※基礎編
下位ノードのデータを含める
基本編と異なり今回は、更新通番のデータ部に更新情報が格納されており、ノード3「”DATA”」にユーザ情報が格納されているケースをマッピングしてみたいと思います。
また今回は、データ部をリストで作成してみたいと思います。
ノード1 | ノード2 | ノード3 | データ項目 | 備考 | |
---|---|---|---|---|---|
ユーザコード | 更新通番 | 更新日時 | YYYY-MM-DD hh:mm:ss | ||
初回登録日時 | YYYY-MM-DD hh:mm:ss | ||||
登録者コード | |||||
“DATA” | 漢字氏名 | ||||
カナ氏名 | |||||
性別 | |||||
生年月日 | %Date型 |
更新通番のノードを主体に、下位ノードのユーザ情報を取得して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” | キー | 好物 |
上記好物を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” | キー | 電話番号 | ||||
郵便番号 | ||||||
住所 |
住所テーブルを作成したいと思います。
作成後は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が使えるだけでも頑張る価値があると思います。
何かのお役に立てれれば幸いです。