私の特定の特定の問題はおそらくあまりにもローカライズされていますが、私がこれから尋ねようとしている一般的な質問は、他の人が尋ねて疑問に思うことだと確信しています。
一般的な質問: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の元のクエリを変更するなど、別のトラックを試す必要がありますか?