Использование выражений SSRS, чтобы увидеть, какие параметры пользователь выбрал из многозначного параметра?

Я пытаюсь настроить фильтр для столбца «Итоги» в отчете SSRS, используя выражение для поля.

У меня есть настройка многозначного параметра со значениями value1, value2, value3 и value4 в качестве параметров.

Перед фильтром этот итоговый столбец просто добавлял целочисленные значения из разных столбцов. Я хочу добавить функциональность, чтобы вы могли проверить, какое из значений выбрал пользователь.

Как показано ниже (псевдокод, потому что я не могу понять синтаксис):

=IIF(Parameters!<Parameter>.Label="value1",Fields!value1.Value,0) +IIF(Parameters!<Parameter>.Label="value2",Fields!value2.Value,0) +IIF(Parameters!<Parameter>.Label="value3",Fields!value3.Value,0) +IIF(Parameters!<Parameter>.Label="value4",Fields!value4.Value,0)

Все значения в добавляемых полях являются простыми целыми числами. Буду признателен за любую помощь, которую может предоставить любой. Спасибо!


person Sev09    schedule 11.06.2013    source источник


Ответы (2)


Предполагая параметр с именем Include, вы можете использовать такое выражение:

=IIf(InStr(Join(Parameters!Include.Value, ","), "value1") > 0, Fields!value1.Value, 0)
    + IIf(InStr(Join(Parameters!Include.Value, ","), "value2") > 0, Fields!value2.Value, 0)
    + IIf(InStr(Join(Parameters!Include.Value, ","), "value3") > 0, Fields!value3.Value, 0)
    + IIf(InStr(Join(Parameters!Include.Value, ","), "value4") > 0, Fields!value4.Value, 0)

При этом используется функция Join для создания строки выбранных параметров с разделителями-запятыми, проверяется выбранное значение конкретного параметра, а затем добавляется либо соответствующее значение, либо 0 к сумме.

Вот простой отчет с выражением:

введите здесь описание изображения

Выбраны все значения:

введите здесь описание изображения

Выбрано два значения:

введите здесь описание изображения

person Ian Preston    schedule 11.06.2013
comment
Этот подход достаточно хорош для простых случаев, но у него есть проблема, заключающаяся в том, что если есть десять полей с именами от value1 до value10, то каждый раз, когда выбирается value10, value1 также будет включаться в общее количество (а также скучно вводить и поддерживать эти поля). имена, если они используются в нескольких отчетах). - person Chris Latta; 12.06.2013
comment
@ChrisLätta, вы можете справиться с приведенным выше случаем, немного изменив выражение IIf: IIf(InStr("," & Join(Parameters!Include.Value, ",") & ",", ",value10,"). Я думал о специальном коде для этого, но для четырех столбцов это, вероятно, слишком далеко. Согласитесь, что для большего количества столбцов это, вероятно, приведет к пользовательскому коду. В пользовательском коде полезно иметь тесную связь между значениями параметров и именами полей; вряд ли неудобно, но просто еще одно соображение. Все зависит от обстоятельств в данный момент. - person Ian Preston; 12.06.2013
comment
Согласен - для простых случаев в одном отчете с несколькими полями и непересекающимися именами полей ваш метод, безусловно, быстрый и простой, +1 - person Chris Latta; 12.06.2013

Вы можете добиться этого простым способом, не связывая целую кучу IIF функций и не указывая каждое поле, которое будет использоваться. Что делать, если вы хотите изменить имя поля или добавить поля?

Используя собственный код, мы можем получить простой и надежный способ выполнения этого расчета. Щелкните правой кнопкой мыши область отчета, не связанную с дизайном, выберите Report Properties..., а затем щелкните вкладку Code. Вставьте следующий код:

Function CalcTotal (ByVal param As Parameter, flds AS Fields) AS Integer
  Dim Result As Integer
  Result = 0
  If param.IsMultiValue then
    For i as integer = 0 to param.Count-1 
        Result = Result + flds(param.Value(i)).Value 
    Next 
  End If 

  Return Result
End Function

Он берет параметр object (не значение) и перебирает значения, выбранные для выполнения вычисления с использованием полей в коллекции Fields.

Теперь для вашего выражения просто используйте:

=Code.CalcTotal(Parameters!Include, Fields)
person Chris Latta    schedule 12.06.2013
comment
Отличный вариант. Однако вместо этого я решил использовать быстрое поле, определяемое выражением. - person Sev09; 12.06.2013