1

私はレポートで jQuery を使用しており、jQuery のおかげですべてが一度に読み込まれる一連のレポートがあるため、顧客はクリックごとに待つ必要がないため、移行がより高速であると感じています。顧客が使用するプロンプトに基づいて、すべてのレポートを変更できるようにしたいと考えています。したがって、特定の日を選択すると、スイート内のすべてのレポートがその日に変更されます。または、選択した特定の領域がある場合は、すべてのレポートがその領域に移動します。これにより、顧客は各レポートのプロンプトでパラメータをロードする必要がなくなります。これを行う方法があるかどうかは疑問です。私は見ましたが、何も見つかりませんでした。

編集..したがって、すべての iframe と、changeMonth という名前の値プロンプトを格納するレポートには、この JS があります。

<script>
var report = cognos.Report.getReport("_THIS_");
var radio = report.prompt.getControlByName('monthChange');

var currentRadioValue = radio.getValues()[0]; //Get initial value object

radio.setValidator(validateRadio); //Define function to validate prompt

function validateRadio(values) {
if (values && values.length > 0 && values[0].use != currentRadioValue.use) { //Only do anything if control has value and has changed
    currentRadioValue = values[0]; //Assign new value for later comparison
    for (var i=0; i<window.frames.length; i++) { //Loop through all iFrames
             window.frames[i].changeValue(values[0].use); //Call the changeValue     function passing in the radio button value
    }
 }
return true; //Indicates the prompt is valid
}
</script>

iframe が必要なレポートには、HTML タグにこのコードを含むドロップダウン リストである値プロンプトがあります。

<script>
function changeValue(str){
var report = cognos.Report.getReport("_THIS_"); //Grab a handle for the report
var control = report.prompt.getControlByName('monthChange'); //Grab a handle for the    prompt control
control.addValues([{"use":str,"display":str}]); //Change the prompt to the passed in value
report.sendRequest(cognos.Report.Action.REPROMPT); //Reprompt the page
}
</script>

それが重要な場合、それらは両方ともドロップダウンリストでした。それらをラジオボタンとしてリストしたことがわかりましたので、ここですぐにそれを試してみて、何か変化があったかどうかをお知らせします. しかし、どのようにセットアップしたのですか、他にやるべきことはありますか?

4

1 に答える 1

0

各子レポートに JavaScript 関数を作成することで、これを機能させることができました。この関数は、クエリが依存する非表示のプロンプト値を変更し、ページを再プロンプトします。以下は、すべての子オブジェクトに必要なコードの一部です。

子レポート コード

<script>
function changeValue(str){
    var report = cognos.Report.getReport("_THIS_"); //Grab a handle for the report
    var control = report.prompt.getControlByName('controlname'); //Grab a handle for the prompt control
    control.addValues([{"use":str,"display":str}]); //Change the prompt to the passed in value
    report.sendRequest(cognos.Report.Action.REPROMPT); //Reprompt the page
}
</script>

これは、Cognos バージョン 10.2 で追加された Cognos JavaScript Prompt API を利用します。関数 getReport、getControlByName、addValues、および sendRequest はすべて、JavaScript でのプロンプトの操作を容易にするために Cognos が提供する関数です。ここに詳細があります:

Cognos JavaScript プロンプト API ドキュメント

コンテナー レポートで、Cognos ラジオ ボタン値プロンプトを作成しました。API で Cognos が提供する組み込みの onchange 検証フックを利用して、ラジオ ボタンが変更されたときにコードを実行するように JavaScript をコーディングしました。コードはすべての iFrame をループし、選択したラジオ ボタンの値を渡して、各子レポートで上記で定義した関数を呼び出します。

コンテナ レポート コード

<script>
var report = cognos.Report.getReport("_THIS_");
var radio = report.prompt.getControlByName('radio');

var currentRadioValue = radio.getValues()[0]; //Get initial value object

radio.setValidator(validateRadio); //Define function to validate prompt

function validateRadio(values) {
    if (values && values.length > 0 && values[0].use != currentRadioValue.use) { //Only do anything if control has value and has changed
        currentRadioValue = values[0]; //Assign new value for later comparison
        for (var i=0; i<window.frames.length; i++) { //Loop through all iFrames
                 window.frames[i].changeValue(values[0].use); //Call the changeValue function passing in the radio button value
        }
    }
    return true; //Indicates the prompt is valid
}
</script>

上記のコードで、文字列 'controlname' と 'radio' は、問題のプロンプト コントロールの Name プロパティに対応していることに注意してください。デフォルトでは、Cognos はプロンプト コントロールに名前を付けません。したがって、作成後に名前を指定する必要があります。どのような名前を付けても、JavaScript が Cognos Prompt API オブジェクトにアクセスできるように、それに応じてスクリプトを調整する必要があります。

この手法を変更して、Cognos で使用できるさまざまなプロンプト コントロールから入力を受け取ることができます。さらに、理論的には、コンテナーは Cognos である必要さえありません。これは、標準の HTML onchange イベントが発生したときに iFrame 内の JavaScript 関数を呼び出すコントロールを備えたスタンドアロンの Web ページである可能性があります。唯一の注意点は、セキュリティ上の制限により、ブラウザーが iFrame とは異なるドメインを持つコンテナーから iFrame 内の関数を呼び出すことを許可していないことです。これは、ソリューションを設計する際に考慮すべき事項です。

于 2014-08-07T21:09:44.977 に答える