【データモデル】階層検索ダイアログの設定

今回は、クエリビルダのフィルター検索において、データを階層表示する方法をご紹介します。

### 階層データセットの準備 ###
あるテーブルに`Group`というフィールドが存在し、そのデータが階層構造をもっているとします。例えば住所などがいい例かな。
例）東京都/世田谷区/豪徳寺...
そのようなデータをSELECT文等を使用して下記の形式のデータセットに加工します。Viewにしてもいいですし、新たなテーブルを作成してもいいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/418e3f52-577a-e2b0-ee55-88bf6e8e2f72.png)
本来は、基データが動的データでしょうからViewがいいでしょうね。
Viewが完成したら、対象データモデルに新しいViewを定義し、Sharperlightエンジンがアクセスできるようにします。

### フィルター属性への階層の設定 ###
Sharperlightアプリケーションメニューから**スタジオ**を起動し、対象データモデルを開きます。 
次に、階層検索を設定するフィールド、つまり`Group`フィールドのあるテーブル定義を参照します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/dffe73bb-d6ee-2219-37d7-ac6c8edfc443.png)
`Group`フィールドは、オリジナルもそのまま保存しておきたいので、先ずクローンを作成します。
`Group`フィールドを選択し、右クリックメニューから`Copy`を選択します。そして再度右クリックメニューから`Paste`を選択するとクローンフィールドが挿入されます。
クローンフィールドを選択し、右側の領域に属性一覧を表示し、更新を行います。
`Code`属性には、**GroupHierarchy**と入力。
`Description`属性には、**Group Hierarchy**と入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/552e3797-5f78-6328-f94a-5e45ec8d7651.png)
下方に移動して...、
`Lookup`属性で、オプションボタンをクリックしてLooup属性ダイアログを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bb274592-fe63-a801-9714-9dd3d8812492.png)
`Type`には、**Hierarchy**を選択します。
`Select The Hierarchy Table`ボタンで、先に準備した階層データセットを返すViewもしくはTableを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d68f5070-dbca-4697-fddf-455deb7ae0bb.png)
`Selection`領域にフィールド一覧が表示されます。その一覧から順序に注意しながらフィールドを右側に移動させます。
1番目のフィールドは、階層パスをもつフィールド、2番目は一意のIDやコード、3番目は、階層のレベルを表現するフィールド、その後は順に摘要フィールドを指定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/334d6b45-81e6-2045-1762-eeb14dbef222.png)
`OK`ボタンで保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e67974b6-8ce6-239b-a7f4-16cdb724ff25.png)
次に、`Validation Method`属性に移動します。オプションボタンをクリックしてValidation Method属性ダイアログを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/4e49bf71-0235-d0d3-30b6-08bdc18881c3.png)
`Method`ドロップダウンメニューから**Hierarchy**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b186637f-6f10-706a-34e7-47937eaf1c77.png)
`OK`ボタンで保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b7fa369a-3b67-2f6b-b7ca-a99cb5581df8.png)
以上で完了。
### 検証 ###
では早速検証してみましょう。
データモデルを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f6ae7cf0-af6a-2443-6ff7-ef397a9f72f1.png)
クエリビルダを実行します。（メインアプリケーションメニューからでもいいですよ:thumbsup_tone2:）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/8bf76fb4-3847-6af9-018f-751a4cfbee48.png)
クエリビルダが起動しら、製品に対象データモデル、つまり今回変更を加えたデータモデルを選択します。
テーブルには、今回更新を加えたテーブルを選択します。
下部の選択領域に先ほど追加した`Group Hierarchy`フィールドが拝見できます。
ドラッグ&ドロップでフィルター領域に設定しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/8037a3a2-87cf-3709-406f-cf2c0259dbcd.png)
フィルター領域に設定した`Group Hierarchy`の検索ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ccb48372-c642-edbe-b538-93179a85f227.png)
検索ウインドウが開き、先ほど設定した階層構造が拝見できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e7e822a8-639c-1958-4bb5-e0bc3a5991ac.png)
`<ALL>`を選択し閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c50f9ddf-5de7-f3d8-25cc-5583e7d2af84.png)
下部の選択領域で右クリックメニューから`すべてを出力`を選択し、全フィールドを出力領域に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/edfe9e0d-bdf9-cb4e-bcc1-9c10b39cbeb2.png)
`プレビュー`ボタンでクエリを実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f0127736-fef4-ed68-cd1a-c03d138f7706.png)
全データが返ってきます。
`クエリに戻る`ボタンでクエリ定義に戻ります。
今度は、`Group Hierachy`フィルターで特定の値を選択し、階層検索が正常に動作しているか確認します。
`<ALL>`のチェックをはずし、`東北地方`にチェックを入れます。すると上記テキストフィールドに階層パス`\Japan\Tohoku\%`が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3e0157f5-e530-dcc9-4aa6-528d23fba69b.png)
`OK`を押して確定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0113b900-6fff-4991-a143-8e622d3e9681.png)
プレビューボタンでクエリを再度実行してみます。**青森**と**八戸市**のデータが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5106f814-941f-48da-4c7b-2a808a62ff0a.png)
Sharperlightエンジンで動的に作成されたSQL SELECT文は、このようになっています。
```
SELECT 
    J001.[ID]
    ,J001.[Group]
    ,J001.[Group]
    ,J001.[GroupDescription]
    ,J001.[Amount]
FROM
    [dbo].[SampleJPTransaction] J001
WHERE
    J001.[Group] IN (
            SELECT J001.[UniqueID] FROM [dbo].[SampleJPHierarchy] J001
            WHERE J001.[Path] LIKE N'\Japan\Tohoku\%'
    )
ORDER BY
1,2,3
```
いかがでしたか？是非ためしてみてくださいね。