CognosレポートでHTML Itemでレポート遷移動作を実装するJavaScriptコードのサンプル

##概要
Cognos BIやAnalyticsで、レポート間を特定のパラメーターの値を保持しつつ遷移するには、ドリルスルーという機能がありますが、何らかの事情によりドリルスルーではなく、HTML Itemに組み込んだJavaScriptでURLを組み立てて、レポートを遷移するサンプルコードです。

イメージとしては、CSVReportがターゲットで、GETReport及びPOSTReportのレポート上のボタンをクリックするとCSVReportがCSV形式で呼び出されます。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/98774422-91af-82af-e1c4-3c9b748a38a7.png)

GETReportの実行イメージはこんな感じで、製品のプロンプトを選択後、確定し、「ボタン」を押すと、CSVReportが呼び出されます。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/4bca5845-d02e-9d87-0dfa-8fd6d885cdd6.png)

CSVReportの出力イメージはこちらで、製品のプロンプトで選択したパラメーターを引き継いでいます。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/44d53e6e-f075-df8f-293d-646c83b879e9.png)

※Cognos Analytics版も投稿しましたのでご活用下さい。
**Cognos AnalyticsのレポートでHTML Itemでレポート遷移動作を実装するJavaScriptコードのサンプル**
https://qiita.com/shinyama/items/5b97b1e1399e7e8c0da2

##実装
**GETReportのReport Authoring画面です**
製品のプロンプトを表示する、値のプロンプトは、プロパティで名前を「ProdList」にしています。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1292d051-ef32-dd63-a277-4731db49c4c6.png)

ボタンの実体はブロックで、クラスを以下のように指定してボタンにしています。
名前に「Button1」と命名しています。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/be927650-5977-834b-8106-88e050447715.png)

**左側のHTMLアイテムの内容です**

```html
<script type="text/javascript">

var outputCSV1 ={}
  , oCR = cognos.Report.getReport("_THIS_");

outputCSV1.executeReport1 = function(){

  // ******************************************************************************
  // * 前処理
  // ******************************************************************************

  // パラメータ取得用配列
  var param_list = new Array();
  // URL用パラメータ文字列
  var param_string = "";
  // パラメータ値前文字列
  var param_pre_text = "&p_";
  // パラメータ値後文字列
  var param_tail_text = "=";

  // ゲートウェイURI
  var target_gateway = "../cgi-bin/cognosisapi.dll";
  // 実行ツール
  var target_tool = "cognosViewer";
  // 実行アクション
  var target_action = "run";
  // プロンプト画面表示
  var target_prompt = "false";
  // レポート出力形式
  var target_format = "CSV";
  // 実行対象レポート検索パス
  var target_report_path = "/content/folder[@name='Qiita']/folder[@name='URLPrompt']/report[@name='CSVReport']";

  // ドリルスルー先レポート実行用URL
  var target_URL = target_gateway + "?b_action=" + target_tool + "&ui.action=" + target_action + "&run.prompt=" + target_prompt + "&run.outputFormat=" + target_format + "&ui.object=" + encodeURI(target_report_path);

  // ******************************************************************************
  // * ドリルスルー先のパラメータ名とドリルスルー元で設定されているプロンプト値を配列化
  // ******************************************************************************

  //  レポートページ - 値のプロンプト(オプション・複数選択)
  param_list[0] = ["pProd",oCR.prompt.getControlByName("ProdList").getValues()];		// 製品


  // ******************************************************************************
  // * ドリルスルー先にパラメータ値を引き渡すための文字列を作成してURLを構成
  // ******************************************************************************

  // 配列化したパラメータ情報に基づいてURL追記用文字列を作成
  for (var i = 0; i < param_list.length; i++) {
    // プロンプトに値がセットされているかチェック
    if(param_list[i][1] != ""){
      // 値がセットされている場合はセットされている数の分だけ文字列を生成
      for (var j = 0; j < param_list[i][1].length; j++) {
        param_string = param_string + param_pre_text + param_list[i][0] + param_tail_text + param_list[i][1][j].use;
      }
    } else {
      // 値がセットされていない場合は空の値で文字列を生成
        param_string = param_string + param_pre_text + param_list[i][0] + param_tail_text;
    }
  }

  // ******************************************************************************
  // * ドリルスルー先レポートを起動
  // ******************************************************************************

  // ドリルスルー先レポートのURLにパラメータ追記用文字列を追加して新しいウィンドウで起動
  window.open(target_URL + encodeURI(param_string),"window2","scrollbars=no,resizable=yes,menubar=no,directories=no,status=no,location=no,width=1366,height=683");

};

</script>
```

**右側のHTMLアイテムの内容です**

```html
<button form="button1" onclick="outputCSV1.executeReport1()" style="WIDTH: 130px; HEIGHT: 0px vertical-align:top;text-align:center;border-style: none;background-color:#fff">
```

**こちらは、POSTでレポート呼び出しを行いたい場合の左側のHTMLアイテムです**
※URLの長さ制限に引っかかるような時に、POSTメソッドを使います。

```html
<script type="text/javascript">

var outputCSV1 ={}
  , oCR = cognos.Report.getReport("_THIS_");

outputCSV1.executeReport1 = function(){

  // ******************************************************************************
  // * 前処理
  // ******************************************************************************

  // パラメータ取得用配列
  var param_list = new Array();
  // URL用パラメータ文字列
  var param_string = "";
  // パラメータ値前文字列
  var param_pre_text = "&p_";
  // パラメータ値後文字列
  var param_tail_text = "=";

  // ゲートウェイURI
  var target_gateway = "../cgi-bin/cognosisapi.dll";
  // 実行ツール
  var target_tool = "cognosViewer";
  // 実行アクション
  var target_action = "run";
  // プロンプト画面表示
  var target_prompt = "false";
  // レポート出力形式
  var target_format = "CSV";
  // 実行対象レポート検索パス
  var target_report_path = "/content/folder[@name='Qiita']/folder[@name='URLPrompt']/report[@name='CSVReport']";

  // ドリルスルー先レポート実行用URL
  var target_URL = target_gateway + "?b_action=" + target_tool + "&ui.action=" + target_action + "&run.prompt=" + target_prompt + "&run.outputFormat=" + target_format + "&ui.object=" + encodeURI(target_report_path);

  // ******************************************************************************
  // * ドリルスルー先のパラメータ名とドリルスルー元で設定されているプロンプト値を配列化
  // ******************************************************************************

  //  レポートページ - 値のプロンプト(オプション・複数選択)
  param_list[0] = ["pProd",oCR.prompt.getControlByName("ProdList").getValues()];		// 製品ライン


  // ******************************************************************************
  // * ドリルスルー先にパラメータ値を引き渡すための文字列を作成してURLを構成
  // ******************************************************************************

  // 配列化したパラメータ情報に基づいてURL追記用文字列を作成
  for (var i = 0; i < param_list.length; i++) {
    // プロンプトに値がセットされているかチェック
    if(param_list[i][1] != ""){
      // 値がセットされている場合はセットされている数の分だけ文字列を生成
      for (var j = 0; j < param_list[i][1].length; j++) {
        param_string = param_string + param_pre_text + param_list[i][0] + param_tail_text + param_list[i][1][j].use;
      }
    } else {
      // 値がセットされていない場合は空の値で文字列を生成
        param_string = param_string + param_pre_text + param_list[i][0] + param_tail_text;
    }
  }

  // ******************************************************************************
  // * ドリルスルー先レポートを起動
  // ******************************************************************************

  // ドリルスルー先レポートのURLにパラメータ追記用文字列を追加して新しいウィンドウで起動
  window.open("","window2","scrollbars=no,resizable=yes,menubar=no,directories=no,status=no,location=no,width=1366,height=683");
  
  var form = document.createElement("form");
  form.action = target_URL + encodeURI(param_string);
  form.target = "window2";
  form.method = "POST";

  var body = document.getElementsByTagName("body")[0];
  body.appendChild(form);
  form.submit();
  body.removeChild(form);


};

</script>
```