redwarrior’s diary

C#, ASP.NET, WEB, G*などの雑多な情報

SSRSのコンポーネントで条件を指定して、同じデータセットからレコード別の値を取得する

前回の記事では、データセットのフィルターを使用してカスタムフィールドを絞り込むという方法を紹介しましたが、

カスタムフィールドの値を表示するテキストボックスを複数用意して、それぞれ別のカスタムフィールドの値を表示したい

f:id:redwarrior:20190629113135p:plain
複数カスタムフィールド

という場合は、カスタムフィールドの数だけデータセットが必要になってしまいます。

そしてデータセット毎にデータを取得するため、データセットが外部サービスを参照している場合、データセットの数だけリクエストが発生します

これは出来れば避けたい。どうすれば良いでしょうか?

データセットでフィルターを使用せず(複数レコードのまま)に、コンポーネントで式を使用し、条件を指定して値を取得すると良いです。

具体例

例えばテキストボックスの場合、テキストボックスの中ではなく、テキストボックス全体を選択すると右クリックメニューに式が表示されます。そこで式を選択すると式の入力画面になります。*1

式では関数を使用して、レコードを絞り込むことが出来ます。主に使うのは、First関数とLookup関数。

First関数

データセットにレコードが1件しか含まれていない場合や、先頭のレコードだけで良い場合は、First関数を使用します。

=First(Fields!value.Value, "データセット名")

第1引数=値に使用するカラム(value)、第2引数=対象のデータセット

Lookup関数

条件を指定してレコードを取得するのには、LookUp関数を使用します。カスタムフィールドをidで絞り込み、入力値(value)を表示したい場合は、以下のように記述します。

=Lookup("1",Fields!id.Value,Fields!value.Value, "データセット名")

第1引数=条件値(idカラムの値)、第2引数=条件に使用するカラム(id)、第3引数=値に使用するカラム(value)、第4引数=対象のデータセット

データセット名を同じ値にして、テキストボックスごとにidの値を変更することで、同じデータセットを使用しつつ、それぞれ別のカスタムフィールド値を表示することが出来ました。

以上。

*1:テキストが既に入力されていると式を入力する事が出来ないのでテキストは空にしておきます。