none
URLで日本語複数選択パラメータを飛び番で渡すとURLが無効になる RRS feed

  • 質問

  • 初めまして。
    tisa-ytagoといいます。

    まずは今の作業内容ですがレポートビルダー(Ver14.0.1016.240)で作成したレポートの
    「アクション」で「URLに移動する」を選び「式」へ以下のように入力しています。

     ="javascript:void(window.open('"+ Globals!ReportServerUrl+"?/"+ サブレポート名 + "&rs:Command=Render" + "&rs:Format=EXCEL&" + "日付パラメータ=" + Fields!日付.Value + Code.fnParam(文字パラメータ1) + "','_blank'))"

    上記の「Code.fnParam」はレポートのプロパティのカスタムコード(VisualBasic)です。
    SSRSではメインレポートの複数選択パラメータは選択されている値だけ動的に繰り返しURLへ組み込む必要があります。

    しかしjavascriptの.selectedが使用できなかったのでまず「レポート変数」で以下の様に全項目全パターンの選択状態を取得します。

     =IIf(instr(JOIN(メイン.文字パラメータ2, ","), 値1)<>0,"True","False")

    文字パラメータは2~8まであり内容は値1~値2または値1~値7があります。
    そして「Code.fnParam」で以下の様にURLを組み立てます。
    メインレポートのパラメータの値が全て日本語なので変換しサブレポートのパラメータへ渡しています。

    Public Function fnParam(ByVal 文字パラメータ1 as String) As String
    Dim param as String = ""

      If   レポート変数1  = "True" then
           param = param & "" & "&サブ.文字パラメータ2=" & "'" & "+escape(decodeURIComponent(" & "'" + メイン.文字パラメータ2 + "'" & "))+" & "'"
      End If
     ↓項目値の数だけ繰り返し
      Return param
    End Function

    ここからが質問になります。

    複数選択パラメータを全てまたは先頭以降選択している場合はうまく動作するのですが
    飛び番で選択するとURLが無効になります。

     OK → 2択中の1と2、2択中の1のみ、7択中の1と2と3と4と5と6と7、7択中の1のみ、7択中の1と2)
     NG → (2択中の2のみ、7択中の1と3、7択中の2と3)

    メインレポート及びサブレポートのパラメータの「空白の値を許可」、「複数の値を許可」、
    「規定値」、「使用できる値」などを一通り変更してみましたが無効でした。
    「Code.fnParam」にて複数選択パラメータの選択されていない値(FALSEの場合)に空白を設定しても無効でした。
    無効になった場合の「Code.fnParam」の戻り値は'と"が混在していてALERTできません。

    「アクション」でサブレポートにパラメータを引き継げば正しく動作しますがとてつもなく遅いです。
    そもそもSSRSでjavascript:void(window.openでURLへ複数パラメータ(選択したもののみ)を渡す場合はお作法があるのでしょうか。
    よろしくお願いします。

    2018年2月15日 7:24

回答

  • すみません。
    自分のバグでした。

    文字列組み立てでミスってました。
    以下のカスタムコードの"メイン.文字パラメータ2"は"値1"でした。
    メイン.文字パラメータ2だと飛び番でも選択した値の昇順になります。
    だから全選択と1番からの連続はうまくいっていました。

    <変数(javascript)>
     =IIf(instr(JOIN(メイン.文字パラメータ2, ","), 値1)<>0,"True","False")

    ★誤り <カスタムコード(VisualBasic)>
    Public Function fnParam(ByVal 文字パラメータ1 as String) As String
     Dim param as String = ""

      If   レポート変数1  = "True" then
            param = param & "" & "&サブ.文字パラメータ2=" & "'" & "+escape(decodeURIComponent(" & "'" + メイン.文字パラメータ2 + "'" & "))+" & "'"
       End If
     ↓項目値の数だけ繰り返し
      Return param
     End Function

    ★正解 <カスタムコード(VisualBasic)>
    Public Function fnParam(ByVal 文字パラメータ1 as String) As String
     Dim param as String = ""

      If   レポート変数1  = "True" then
            param = param & "" & "&サブ.文字パラメータ2=" & "'" & "+escape(decodeURIComponent(" & "'" + "値1" + "'" & "))+" & "'"
       End If
     ↓項目値の数だけ繰り返し
      Return param
     End Function

    2018年2月16日 4:36