Cognosのグラフレポートに表示する項目をプロンプトで制御する

# はじめに
Cognosのグラフレポートを作成して、グラフに表示する項目を選択式にして自由に表示 / 非表示を切り替えたいといった要件があったのでその際に検証した結果をまとめます。

## 最終形のイメージ
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/d9c2f9de-d3c5-0b15-bae8-86f58f693874.jpeg)

# 縦持ちデータの場合
「プロンプトを使用して表示項目を切り替える」を実現するために、ぱっと思いつく実装方式としては、「データが縦持ちになっておりカテゴリ列に対してフィルターをかける」ではないでしょうか。

### 縦持ちデータ
下記のように、カテゴリ列を持っておりグラフ表示項目が入っているようなデータのことです。
![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/99174391-d284-c9b2-3739-077b2de81fb7.jpeg)

### グラフ作成
データアイテムとしても3項目しかないので、難しく考えずグラフの作成もできます。
![003.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/4c148476-b005-606c-f9a8-a7b31429f896.jpeg)
折れ線グラフを使用しているので、X軸の項目(年)に対してソートを追加するなど微調整をしてあげます。

### プロンプトの作成とフィルターの設定
カテゴリの表示 / 非表示はフィルターによる絞込みで実現可能です。
複数選択可能なプロンプトを追加しパラメータ名を設定します。
グラフが使用するクエリーに、詳細フィルターを追加してあげるとレポートの作成完了です！
![004.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/b0508b72-c693-7037-8bf4-ad8cb81b9c72.jpeg)

カテゴリマスタなどを持っている場合は、固定値ではなくマスタからデータを持ってくるのもありです。

# 横持ちデータの場合
データが縦持ちで嬉しいのは開発側の都合であり、取得元のデータが横に持っていることもあります。

### 横持ちデータ
改めて横持ちデータの確認です。先ほどの縦持ちデータと違い、各カテゴリの値を1行の中で横に並んで持っています。全体のレコード数を抑えることもできるしこのほうが多いのではとも思うくらいですね。。
![005.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/e5d821a9-b547-5346-70cf-0aeda5ca378f.jpeg)


横持ちデータを使用して同じ要件の実装方式を検討すると、
表示パターンごとにグラフを事前に作成しておき、条件ブロックを駆使しプロンプトでの選択のパターンごとにグラフを出し分けるといった実装方法もありますが、3項目でもパターンは7つ、「選択がなければ表示しない」を含めると8つとなります。項目が増えるほどパターンが増えるので少し無理がある実装に思えます。

ここでは、実装という点では比較的簡単に要件を実現できる別の方法を紹介させていただきます。





### 複数項目を表示するグラフの作成例
単純に横持ちのデータを使用してグラフを作成すると下記のようになります。
![006.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/c83d1abc-93d2-2838-1004-2a894e235fdf.jpeg)
これでグラフの表示自体はできるのですが、クエリーに対してもフィルターの追加もできないしプロンプトの選択による項目の表示 / 非表示の制御はできません。

### case文の追加
なので、対応するために、表示項目の値を取得するデータアイテムにcase文を追加します。
例えば、「収益」列の項目に対しては下記のようなcase文の追加となります。
![007.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/f336ad0e-0d22-6eec-ffc3-ba1a3582b8d5.jpeg)

```HTML:式の定義
case when 
'収益' in (?pCat?) then [販売 (クエリー)].[販売の実状].[収益]
else Null 
end
```

これで、プロンプトで「収益」が選択されているときには値を取得し、「収益」が選択されていないときは値を取得しないデータアイテムとなります。

### ラベル用項目の追加
各項目のラベル用のアイテムとして下記のcase文が定義されたデータアイテムを追加します。
例えば、「収益」列用のラベル項目として使用する「収益ラベル」に対しては下記のようなcase文を定義します。
![008.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/a8b1ca9a-fd03-eac1-6120-230d847379c8.jpeg)

```HTML:式の定義
case when 
'収益' in (?pCat?) then '収益'
else Null 
end
```

この対応をすることにより、グラフ右側に表示されるカテゴリの名称もプロンプトの選択に合わせて表示 / 非表示が切り替わるようになります。

### グラフの作成
基本的には、複数項目を表示するグラフと同じように、複数の項目を「データ系列」に追加します。
プロパティを開き、各データ系列項目の「テキスト・ソース」を「データ・アイテムの値」を指定し先ほど追加したラベル用のアイテムに変更します。
![009.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/bb57e7a8-d6e7-e6fa-58f7-e468afe07478.jpeg)


### デフォルトの選択肢の追加
縦持ちの時と違い、プロンプトのパラメータの値をデータアイテムの式の定義の中で使用するため、プロンプトが必須選択となってしまいます。その対応として、プロンプトの「デフォルトの選択肢」にも各項目の名称(case文で使用している名称)を追加しておきます。
![010.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/7695c90a-6903-da9c-58d9-402f5c5f2c32.jpeg)

### その他の調整
その他の調整としては、デフォルトの主軸のタイトルのままだと、列名がずらずらと並んでしまうので、任意期のテキストに修正してあげます。ここでは「計測値」としています。
![011.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/ee6395c9-7e41-881b-d0f2-8fa3ba04b806.jpeg)

これで、グラフの作成は完了です。


※実装の簡易さという点での作成方法なので、レコード数が非常に多い場合は各データアイテムに追加したcase文によるパフォーマンス劣化を考えておく必要があります。

# 視覚化で作成すると
ここまで読んでいただいてお気づきになられた方もいるかも知れませんが、この実装方法で使用できるのは従来のグラフとなります。視覚化を使用すると下図のように、グラフ右側にある項目名の表示 / 非表示を制御することができませんでした。

![013.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/554d6e7b-bf09-ed07-28c9-030d3a199c38.jpeg)

これは、視覚化の場合は項目名をラベル用のデータアイテムに置き換えることができないためです。

![012.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/ee70a1ab-56f4-896a-a48e-c7b809ee8781.jpeg)

カテゴリの名称は非表示にはせず、常に表示させておきたいということであれば、視覚化を使用してもいいですね。もし、こんな方法で制御できるというのをご存知の方がいればご教授いただければと思います。