Cognos Dynamic CubeでのCubeデータの差分更新

##概要
Cognos BIにはDynamic Cubeという、Cognos BIノード上のメモリーに、Cubeの形で集約済みデータを保持しておいて、データソースとして使用できる機能があります。
Dynamic Cubeの内容は以下のマニュアルをご参照頂ければと思いますが、メモリー上にデータを載せる仕組みの常として、データソース上の元データの更新時に、反映に時間がかかる事が多いですが、Dynamic Cubeでは差分更新ができるかと最近質問を受けたので投稿します。

**Cognos Dynamic Cubes の概要**
https://www.ibm.com/support/knowledgecenter/ja/SSEP7J_10.2.2/com.ibm.swg.ba.cognos.ug_cog_rlp.10.2.2.doc/c_cubingconcepts.html


##内容
Dynamic Cubeの場合、元データが「追加」された場合は、Cubeへの差分更新ができる、というのが回答になります。
元データが「削除」や「更新」の場合は、残念ながらDynamic Cubeの再起動が必要です。

検証した画面と共に動きをご説明します。

任意のファクト表とディメンション表を作成。
TIDという列は、どこまで反映されたかの管理するための列で、追加する必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/faaae7b0-a188-2635-71e5-2055ce54279a.png)

とりあえずこの表を元に集約済みのDynamic Cubeを作り、クロス集計として出力しました。
Cube DesignerでDynamic Cubeを作成する際に、プロパティの「トランザクションID」の項目に、このTID列を指定しておく必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/094934b8-c7a3-3a9e-47e2-26ed6cc96509.png)

DBの元表にデータを追加します。
TID列の値は、これまでの他の行に入っていた「1」より大きい数「2」を入れています。
**C:\>db2 "insert into SA1FACT values('a1','b1','c1','d2',101,102,103,2)"**

Cognos Administrationから「インクリメンタル更新データ」を実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/fcf12ccf-8e05-1270-14e9-236c901d7126.png)

再度レポートを実行すると、表示されるデータが更新されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/66406dd6-33d9-87d2-b52d-ab26e8d308b8.png)

と、まあ、こんな感じで、TID列を追加しておく、「データの追加」のみへの対応、というレベルなのですが、この制限を理解しておけば、環境によってはちゃんと使う事もできると思います。

また、じゃあこれをJP1などのジョブ管理ツールで、実際にジョブスケジュールして反映とかできるのか、と質問を受ける事もあります。

これは、DCAdmin コマンド行ツールで、コマンドラインから「インクリメンタル更新データ」を呼び出す事ができるので、ジョブ管理ツールとの連携も可能という回答になります。

実際にやってみた結果です。

FACT表に1行追加。
**C:\>db2 "insert into SA1FACT values('a1','b1','c1','d3',101,102,103,3)"**

コマンドラインから、DCAdminツールを用いて、「インクリメンタル更新データ」をコマンドで実行。

**C:\Program Files\IBM\cognos\c10_64\bin64>dcadmin.bat -p <PORTNO> -s <HOSTNAME> -l "ApacheDS,cogadmin,password" incrementallyLoadCubes SADCube1**
Executing command 'incrementallyLoadCubes' on cube(s) [SADCube1]
Finished executing command 'incrementallyLoadCubes' on cube(s) [SADCube1]

SADCube1 : SUCCESS : キューブ "SADCube1" に対するコマンド "incremental cube load
" の実行が成功しました。


再度レポートを実行すると、表示データが更新されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/97d70c41-0aea-55a1-ce4b-e21db74df244.png)


ジョブ管理ツールと連携するためには、エラーハンドリングができるかも重要ですが、DCAdminコマンド実行時のリターンコードは以下の通りで、エラーハンドリングも大丈夫です。

・エラー時は1が返る。

**C:\Program Files\IBM\cognos\c10_64\bin64>dcadmin.bat -p <PORTNO> -s <HOSTNAME> -l "ApacheDS,cogadmin,password" incrementallyLoadCubes SADCube2**
Executing command 'incrementallyLoadCubes' on cube(s) [SADCube2]
Error: XQE-ROL-0002 キューブ "SADCube2" が見つかりません。キューブが Cognos Cont
ent Manager に存在することを確認してください。 : The server did something wrong

**C:\Program Files\IBM\cognos\c10_64\bin64>echo %ERRORLEVEL%**
**1**

・正常完了時は0が返る。

**C:\Program Files\IBM\cognos\c10_64\bin64>dcadmin.bat -p <PORTNO> -s <HOSTNAME> -l "ApacheDS,cogadmin,password" incrementallyLoadCubes SADCube1**
Executing command 'incrementallyLoadCubes' on cube(s) [SADCube1]
Finished executing command 'incrementallyLoadCubes' on cube(s) [SADCube1]

SADCube1 : SUCCESS : キューブ "SADCube1" に対するコマンド "incremental cube load
" の実行が成功しました。

**C:\Program Files\IBM\cognos\c10_64\bin64>echo %ERRORLEVEL%**
**0**

機能としては簡易的なものなので、どうしても使える環境は限られてしまいますが、要件が合う環境であれば、Dynamic Cubeが差分更新できるというのはメリットが大きいので、是非覚えておいて頂ければと思います。

##参考情報
**動的キューブ・データの準リアル・タイムの更新**
https://www.ibm.com/support/knowledgecenter/ja/SSEP7J_10.2.2/com.ibm.swg.ba.cognos.ug_cog_rlp.10.2.2.doc/c_cog_rlp_nrt_ovw.html