2

私の特定の特定の問題はおそらくあまりにもローカライズされていますが、私がこれから尋ねようとしている一般的な質問は、他の人が尋ねて疑問に思うことだと確信しています。

一般的な質問:SQL Server Reporting Servicesでは、コード内のレポートにフィルターを適用できますか?そうでない場合は、変数の値に基づいてレポートフィルターで分岐を使用することは可能ですか。ドキュメントを参照するか、その方法を説明してください。


私の具体的な例は、私がそれをひどく言い表す場合に備えて、上記の意味を拡張するために続きます:

私はSSRSを学んでおり、ドキュメントとGoogleが不足しています。

望ましい効果は、インシデント追跡システムに基づいたレポートがあることです。このシステムには、IT運用、開発、セキュリティなど、インシデントを追跡できるさまざまなチームがあります。これらの各チームには、チームメンバーが割り当てられています。

  • すべてのインシデントを表示する基本レポートがあります。
  • 「LimitByTeam」という名前のブールパラメータを追加しました。これにより、期待どおりにレポートにチェックボックスが生成されます。
  • 複数の値を受け入れるStringパラメーターを追加しました。許可される値は、チームをリストするデータセットから取得されます。これにより、予想されるドロップダウンリストがレポートに追加され、ユーザーは1つ以上のチームを選択できるようになりました。
  • チームとチームメンバーを含むデータセットを追加しました。

チェックボックスが選択されていない場合は、すべてのインシデントを表示します。(デフォルト)

選択されている場合は、インシデントチケットを作成した人のログインIDに基づいてレポートをフィルタリングする必要があります。

これをSQLで行うとしたら、次のように行います。

Select 
   (ticket fields) 
From 
   Table 
WHERE TicketCreator IN (
             Select LoginId FROM TeamMembersTable 
             WHERE TeamName in ('IT Ops', 'Developers'))

SQLやVBなどでは、これは簡単です。

SSRSでは、これを行う方法を完全に理解していません。カスタムコードを使用して、VBを使用してより複雑なロジックを実行できることを理解しました(VB.NET。HOORAY!おなじみの領域のようです)

そこで、カスタムコードを追加して、レポートパラメーターの値を読み取れることを確認しましたが、パラメーター値がTrueの場合にフィルターを適用する方法を一生理解できません。これが私が持っているものです。

Public Sub ApplyTeamFilter() 

    ' Report.Parameters("LimitByTeam") is a 
    ' boolean report parameter that I'm able to access
    ' so I've got the IF statement worked out


    If Report.Parameters("LimitByTeam").Value = True Then
                 ' Pseudo-code - I'm looking for something like Report.Filters.Add(filterstatement)
                 ' Alternatively a way to change this to a function to return a list of items from 
                 ' the Team MembersTable table and use it in a custom expression.
     End If
End Sub

問題は、Reportオブジェクト、またはそれを見つけることができるメソッドでFiltersプロパティが見つからないように見えることです。そこに見つからなかったので、MSDNライブラリのこのセクションにあるすべてのものに検索を拡張しましたが、それを見つけることができませんでした。

この関数を使用する方法があると思うので、私もこのようなことをしようとしています。

Public Function IsLoginIdInTeam(ByVal LoginId as String, byVal Team As String) As Boolean

    '  Report.Parameters("LimitByTeam") is a 
    ' boolean report parameter that I'm able to access
    ' so I've got the IF statement worked out


    If Report.Parameters("LimitByTeam").Value = False Then
        Return True ' Default
    Else
        ' Access the TeamMembers table and look for a match
                ' Something like 
                ' Convert.ToBoolean(Report.DataSets!TeamMembers.Compute(Count, "TeamName = '" & Team & "' AND LoginId = '" & LoginId & "'")

     End If
End Function

しかし、レポート内のデータセットにアクセスする方法もわかりません。ましてや、データセットを操作するための構文もわかりません。擬似コードはSystem.Data.DataTableで機能しますが、SSRSDataSetは別の獣だと思います。

私は盲目的に明白な何かを見逃していますか?レポートでこの方法でフィルタリングすることを諦め、DataSetの元のクエリを変更するなど、別のトラックを試す必要がありますか?

4

1 に答える 1

1

私はSSRS(またはBITSQL)のブール値パラメーターの大ファンではありません。次のようなものは記述できません

WHERE @MyBool OR @MyOtherBool

それはする必要があります

WHERE @MyBool = 1 or @MyOtherBool = 1

MyBoolParamしたがって、 というブール値と という複数値のテキスト パラメータを持つ SSRS レポートがある場合、次MyMultiSelectTextParamのような SQL クエリが機能します。

SELECT 
   MyField,
   MyOtherField
FROM
   MyTable t
WHERE
   @MyBoolParam = 1
   OR
   t.MyField IN ( @MyMultiSelectTextParam)

(boolean パラメーターの代わりに私が推奨するのは、実際には可能な値を持つ文字列ですが、同じ方法でクエリで処理されます。)

SQL クエリを簡単に変更できない場合 (サード パーティの SP を使用するなど) は、SSRS DataSet にフィルターを追加することで同じことを行うこともできます。レポート データ ペインで DataSet を右クリックし、Dataset プロパティを確認します。フィルター ペインでは、各行に対して評価される条件を追加できます。複数値パラメーターでこれらをあまり使用していませんが、IN 演算子はそのために機能するはずです。

于 2012-10-05T17:46:40.487 に答える