【クエリビルダ】JSON として保存、JSONの形式を拡張してみる

クエリビルダを使用してデータセットを作成し、`CSV`、`XML`、`JSON`などのさまざまな形式で保存することができます。 クエリビルダで作成されたデータセットはフラットなテーブルであるため、通常フィールドレコードは`JSON`配列として保存され、フィールド名にはクエリで指定した出力名が使用されます。 `JSON`オブジェクトで**サブクラス**または**サブ配列**が必要な場合は、**出力名拡張属性**を使用して、`JSON`レンダリング機能を補助することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b0ab9368-9685-6ecb-48f1-97661fdf225e.png)
ここでは、製品（データモデル）に`SunSystems`を使用してクエリを作成しデータセットを抽出し、JSONとして保存する場合のいくつかのパターンを見ていきます。
下図のようなクエリを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/aabe8446-77ea-d8ab-ae67-808f8d461327.png)
### JSONとして保存 - 通常 ###
上記クエリをプレビューしてみます。このような結果が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0dffc634-8c9b-f172-7872-2c7204f52445.png)
これをJSONとして保存します。グリッド上の右クリックメニューから**JSONとして保存**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/1de8dad7-3f29-516f-c12f-e31b120d381e.png)
このようにサブクラスやサブ配列を持たない単純なJSON形式として出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/1818f300-dbde-c53f-62f3-4c6dd59f9863.png)
### JSONとして保存 - サブクラス ###
今度は**サブクラス**を設定してみます。クエリの出力アイテムのうち **Account Code**、**Account Type**、**Account Description**は、Join先テーブル**Chart Of Account**のフィールドなので、これらを使用してみます。
このようなを**出力名拡張属性**使用します。
```
{フィールド名}_JsonObjStart_{サブクラス名}
{フィールド名}_JsonObjMiddle
{フィールド名}_JsonObjEnd
```
出力領域の右クリックメニューから`名前の変更`を使用して、これらの出力名を拡張します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b5253a69-e241-73cb-b0bd-ad585caef336.png)
最終的にはこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0f352466-f4f8-4b12-1c6d-fc961327cb92.png)
ではプレビューをして、JSONとして保存します。サブクラスが作成されているのが分かりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f1d45ef7-e587-c2f7-0015-732d2922b96d.png)
### JSONとして保存 - サブ配列 ###
サブ配列を作成してみます。クエリの出力アイテムのうち **Base Amount**、**Memo Amount**、**Trans. Amount**の三つの金額フィールドを配列として出力させます。
このような**出力名拡張属性**を使用します。
```
{サブ配列名}_JsonArrayStart
{サブ配列名}_JsonArrayMiddle
{サブ配列名}_JsonArrayEnd
```
サブクラスの時のように出力名を拡張します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0fac0db8-fcd8-84b8-0f5e-baa561906839.png)
最終的にはこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7067c513-3d7d-7696-9de5-24f6adbe0a54.png)
ではプレビューをして、JSONとして保存します。サブ配列が作成されているのが分かりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c7c117fd-8f50-950c-3479-71a5b0c6bfe5.png)
### JSONとして保存 - 列の追加 ###
最後に拡張表現を記述してJSONレコードに列を追加する方法を見てみます。
記述した拡張表現には、このような**出力名拡張属性**を使用します。
```
{FieldName}_JsonRaw
```
出力領域の右クリックメニューから`拡張表現を追加`を選び、このような記述をしてみます。
```
"{"
+ ChQuote() + "属性1" + ChQuote()
+ ":" + ChQuote() + JSONEncode( "値1" ) + ChQuote()
+ "," + ChQuote() + "属性2" + ChQuote()
+ ":" + ChQuote() + JSONEncode( "値2" ) + ChQuote()
+ "}"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9c02819e-22bf-ee24-b8f3-221b3e51a3eb.png)
**ChQuote**関数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5f02e577-c35f-d109-4943-bdf7f87efdfe.png)
**JSONEncode**関数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/132be7d2-ec6f-5a47-d39e-77eb8d9fa751.png)
拡張表現の出力名を以下のように拡張します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0b4df70b-0907-5759-b6b5-595c24ffac03.png)
ではプレビューをして、JSONとして保存します。拡張表現で追加した列が作成されているのが分かりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/df1f8898-4d58-c7a4-84d8-f0474232159a.png)

以上このようにしてクエリビルダを用いてデータセットを設計し、必要なJSON形式で出力することが簡単に行えます。
### 応用 ###
Sharperlightスケジューラでタスクを作成し、JSONデータファイルを自動生成してみます。
スケジューラ -> **クエリの組み合わせ**アクションの追加を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ced982be-66f2-ff0a-921d-b336796f7c52.png)
`クエリーを編集`をクリックし、Period（会計期）を返すクエリを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/971824ec-5b5a-1d03-f1e6-0ce3880ab7b8.png)
**2005/001**から**2005/012**期までの会計期が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b8f594e8-47e0-c11a-7729-468c82e6350e.png)
次に、**クエリー**アクションを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0fd24230-e182-f83d-f550-25e47451809a.png)
先ほどクエリビルダで作成したJSON出力用のクエリをクリップボードにコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/8201b484-0590-3397-5224-7ebecc13e4c9.png)
**クエリー**アクションの`クエリーを編集`をクリックしてクエリビルダを開き、クリップボードにコピーたクエリをインポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/fc06e6bc-6374-17bb-16cf-21ac8e908b71.png)
インポートしたクエリの**Account Period**フィルターの名前を**Period**に変更します。`OK`ボタンで保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/33f72a88-9633-9d4a-842f-ce967b7e9ce6.png)
**クエリの組み合わせ**アクションで返される会計期を一つ一つ**クエリー**アクションに渡し、会計期単位でJSONファイルをCドライブのTempフォルダに保存するように、**クエリー**アクションのパラメータの設定を以下のように行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/8487ba42-bdb6-db30-a85d-8ef32db037a0.png)
最後に**クエリの組み合わせ終了**アクションを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/475e3b16-e2ba-7929-76e5-487d6f412945.png)
タスクを保存し、右クリックメニューから`実行`を選択し、タスクを走らせてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/54b7b406-b2ad-7978-75cb-6e07d70c6c1b.png)
異常なく終了した場合は、C:\Tempフォルダに12個のJSONファイルが確認できると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3e1a1d83-dad5-b0cb-c4ab-28837b13fc35.png)
JSONの形式も設定したとおり、会計期もちゃんと同期してますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7231c588-389a-3a81-ddb9-778fe56a4567.png)
もちろんJSON出力用のクエリをWebレポートでも使えるので、RESTfulサービス経由でJSONデータを取得することもできます。
Sharperlightは、単なるレポーティングツールではないのです。
是非お試しあれ。
では、失礼します。