【スケジューラ】Qiitaの投稿記事情報を利用したレポーティング

以前に投稿した記事:[【スケジューラ】自分の投稿したQiita記事の情報をAPIから取得してみる](https://qiita.com/Miki_Yokohata/items/cb36e87c295d9937d0ed)の続きです。

以前の記事にも書いたように、Qiitaへの投稿記事の情報をスケジューラを利用して定期的に取得し、その情報をデータベースに記録することができました。
しかしながら、その時その時のスナップデータだけでは、どのようにView数が伸びてきたかなどは不明です。
なので、Histroryテーブルを作成して、Histroryデータを残していくことにしました。そうすることで、View数の遷移等をグラフにすることができますね。今回はその過程を記事にします。

### 新規テーブルの作成 ###
History用のテーブルを新たに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5a7d1898-d1f5-9993-a8c9-760bce3285c5.png)
### データベーススキーマの変更をデータモデルに反映 ###
対象データベースの構造の変更をデータモデルに反映させます。Sharperlightアプリケーションメニューより**スタジオ**を起動し、Qiita用のデータモデルを開きます。
`Schema`メニューの`Import Table`アイテムを利用して、スキーマ情報の差分を取り込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/fe53fdb5-73f7-161f-20d2-fa94f4d5896c.png)
専用ダイアログが表示されるので、`Get Tables`ボタンで変更が加わったテーブル情報を取得し、データモデルに取り込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/aa39b358-10d8-4eb4-b679-f39779e39fed.png)
差分が取り込まれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0a8a51bd-25cf-591c-bb48-ded42822bd27.png)
これでSharperlightと対象データベースの会話は上手く運びます。
### Hisitoryテーブルへのデータに移動 ###
以前の記事で作成したスケジューラのタスクで定期的にスナップショットデータがテーブルに保存されるので、その直後にそのデータセットをひとつのグループとしてHsitoryテーブルへ転送記録します。グループを表すコードには、転送開始日時を使用します。
この転送処理を新しいスケジュールタスクとして追加します。
### スケジュールタスクの追加 ###
新規タスクの追加を行い、コード、グループ及び説明をそれぞれ記入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/18196781-8c4a-73e1-2bcc-3fa9ab62a6ff.png)
先ず、このタスク開始時の日時を取得し、タスクパラメータとします。これがグループコードとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/1bab9004-14a2-a2eb-91ef-64360b25074a.png)
次に`アクション`タブに移動し、アクションを追加していきます。
クエリを作成し、キャプチャされたデータが保存されている**posted_items**テーブルから転送に必要なデータを読み込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f3d36525-bce3-782a-3064-05f803b6547e.png)
これで転送に必要なデータは、タスクパラメータとこのクエリで供給されることとなります。
次にJavaScriptアクションを追加して、下記のコードを書きます。
最初の3行に注目、クエリからのデータとタスクパラメータからのデータを参照しています。
これらをHistoryテーブルにSharperlightエンジンの機能を利用して書き込んでいきます。
```
var RowId = lib_task.QueryCombinationValueGet('RowId');
var PageViewCount = lib_task.QueryCombinationValueGet('PageViewCount');
var CaptureDate = lib_task.ParamGet('CaptureDate');


try{
    // Call Writeback Function
    db_Writeback(RowId, PageViewCount,CaptureDate);
}catch (err){
    lib_task.LogMessage('ERROR','main',err);
}


function db_Writeback(xRowId, xPageViewCount, xCaptureDate){
    try{
        console.log(xRowId + '/' + xPageViewCount + '/' + xCaptureDate);
        //タスクログに情報を記録する
        lib_task.LogMessage('INFO','db_Writeback()','db_Writeback start');
        //データモデルのテーブル情報を取得する
        let wb = JSON.parse(lib_app.writeback.MetaDataJsonGet('QiitaStat', 'PostedItemsHistory'));
        if (wb.errorMessage.length > 0) {
            lib_task.LogMessage('ERROR','db_Writeback()',wb.errorMessage);
        }else{
            wb.rows = [];
            let cells = [];
            cells.push({
                "code": 'CapturedAt',
                "value": xCaptureDate
            });
            cells.push({
                "code": 'PostedItemsId',
                "value": xRowId
            });
            cells.push({
                "code": 'PageViewCount',
                "value": xPageViewCount
            });

            wb.rows.push({
                "cells": cells
            });

            //レコード数が処理指定数に到達したら書き込み処理を実行
            wb.mode = 'Update';   //Update,Validate,Delete,Delete-IdentityOnly,Delete-UniqueKeysOnly
            wb.breakOnFirstRowError = true;
            let wbStatus = JSON.parse(lib_app.writeback.Execute(wb));

            if( wbStatus.errorMessage.length > 0 ) {
                //タスクログにエラーを記録する
                lib_task.LogMessage('ERROR','db_Writeback()',wbStatus.errorMessage);
                for( var i=0;i<wbStatus.status.length;i++ ) {
                    var si=wbStatus.status[i];
                    //タスクログにエラーを記録する
                    lib_task.LogMessage('ERROR','db_Writeback()',si.fieldCode + ' - ' + si.message);
                }
            }
            wb.rows = []; //行データの入れ物を空にする
        }
    }catch(err){
        //タスクログにエラーを記録する
        lib_task.LogMessage('ERROR','db_Writeback()',err);
    }    
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d53cfbae-a1dd-7455-7a0e-a39abe53d1df.png)
最後にクエリのループを閉じで終わり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5b8adb4a-a1de-7005-e86c-d7dd65bb8b29.png)
OKでタスクを保存しましょう。
### 親スケジュールタスクの作成 ###
さて、以前の記事で作成したデータをキャプチャするタスクと今回作成したHistory転送タスクがありますが、これらが別々に動作するとHisioryテーブルにデータを転送する前に、次の最新データがキャプチャされてしまうなんてことが発生しかねません。
そういった事を防ぐため、親タスクを作成し、これら二つのタスクを順次、セットで定期的に動作させます。

では、新規タスクを追加し、コード、グループ等を記入し`アクション`タブに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7f5cdcc4-e299-28c9-4af3-d2caf448e175.png)
`アクション`タブでは、**指定タスクを実行**アクションを二つ追加します。
最初は、Qiitaからデータを取得するタスクの実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6c23d150-e0ed-c4fd-fc14-3cad886654af.png)
次にHistoryにデータを転送するタスクの実行です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/2e6eb433-0dd7-b172-c89d-3afbae9b5f6a.png)
`トリガー`タブに移動し、このタスクを実行させるスケジュールを作成します。
この例では、毎日、午前6時から午後9時までの間、1時間おきにこのタスクが実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ac5234b3-577a-4a1f-772e-4a61800d828b.png)
OKでタスクを保存。
お忘れなく、データをキャプチャするタスクのトリガー（スケジュール）は削除しておきます。

以上で、データのキャプチャ及びHistoryへのデータの集積メカニズムが完成です。あとはSharperlightのレポーティング機能を使用し、お好みのレポートを作成できます。

**サンプル**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7a408450-7fff-fa92-7b47-620d1caa62c0.png)
ドリル機能もあるよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3c3101a4-4f88-73d6-a873-d98b93aa02b5.png)
クリックすると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/cf444a2c-cc39-0d3f-f03f-5d58463bd866.png)
グラフにも...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/1c7c91b7-ec45-49a3-ba40-d2f52a42a806.png)
選択すると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ffc0592c-75e3-8ee9-9eef-8d138dbeafac.png)
といった感じです。

では失礼いたします。