SSRS — сумма агрегированного поля

#sql-server #reporting-services #reportbuilder

#sql-сервер #отчетность-услуги #построитель отчетов

Вопрос:

У меня есть отчет, в котором показана индивидуальная комиссия за продажу для каждого сотрудника.

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

Выражение для комиссионных за продажу равно:

 =Sum(Fields!Total_Comission.Value)*Parameters!Distribution_Factor.Value*Fields!Individual_Factor.Value
 

Теперь я хочу добавить итоговое значение для этого поля. Если я просто щелкаю правой кнопкой мыши по ячейке и нажимаю Добавить итог, он работает, но выдает неправильный итог.
Если я попытаюсь суммировать поле следующим образом:

 =Sum(Reportitems!GO_Prov.Value)
 

Я получаю сообщение об ошибке:

Выражение значения для textrun ‘Textbox93.Paragraphs[0].TextRuns[0]’ использует агрегатную функцию для элемента отчета. Агрегатные функции можно использовать только для элементов отчета, содержащихся в верхних и нижних колонтитулах страницы.

Существует ли обходной путь для суммирования агрегированного поля этого табликса? Может быть, с помощью кода?

Заранее спасибо.

Обновление1:

К сожалению, я не знаю, как писать пользовательские коды. Но я нашел этот код:

 Public Total_lookup_Sum As Integer = 0 

Public Function Lookup_Sum(ByVal value As Integer) As Integer
 
    Total_lookup_Sum = Total_lookup_Sum   value    

 Return value 

End Function
 

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

 =Code.Lookup_Sum((Sum(Fields!Total_Comission.Value)*Parameters!Distribution_Factor.Value*Fields!Individual_Factor.Value))
 

И выражение для поля, в котором я хотел бы получить сумму, равно:

 =Code.Total_lookup_Sum
 

Теперь я получаю сообщение об ошибке:

В строке 0 пользовательского кода имеется ошибка: [BC30205] Ожидается конец инструкции.

Есть ли способ решить эту проблему?

Ответ №1:

Подобные сценарии могут быть сложными в SSRS. Из вашего описания (хотя на скриншоте на самом деле не все показано) я предполагаю, что у вас есть строки, сгруппированные по продавцу. В вашем столбце, который вычисляет комиссию, у вас есть сумма «Total_commission», но у вас просто есть значение «Individual_Factor», не агрегированное. Опять же, имея предположение, но каждая базовая строка (по сотруднику) должна иметь одинаковое значение «Individual_Factor» (так что фактически использование Min (Individual_Factor) даст тот же результат).

Но затем, когда вы пытаетесь просто взять ту же формулу (или даже вывод формулы) и составить общую совокупность всех строк, как SSRS узнает, какое значение «Individual_Factor» использовать? Вам не нужны Min() или Max(), потому что это будет просто наименьшее или наибольшее значение для всех продавцов.

Ваше предложение об обходном пути с помощью кода — это, как правило, способ, которым я подхожу к этому. Вам нужна переменная отчета, что-то вроде «Commission_Grand_Total», а затем вам нужна функция в коде отчета, которая принимает 1 параметр, и в функции вы добавите значение параметра к переменной. Проще всего сделать параметр возвращаемым значением функции.

Затем в поле, где у вас в настоящее время есть формула вашей комиссии (в строке продавца), выражение в этом поле становится =TheFunctionYouCreate((Sum(Fields!Total_Comission.Value)*Parameters!Distribution_Factor.Value*Fields!Individual_Factor.Value))

Передавая формулу функции, вы достигаете двух целей:

  1. Функция возьмет рассчитанную комиссию каждого продавца и добавит ее в переменную вашего отчета
  2. Функция выведет переданное вами значение параметра (поскольку вы хотите отобразить рассчитанную сумму комиссионных в строке каждого продавца)

Наконец, чтобы отобразить общую сумму, выражение для этого поля является просто переменной отчета, которая содержит общую сумму (которая была кумулятивно добавлена по мере того, как SSRS записывала записи каждого продавца).

СОВЕТ: я иногда делаю то же самое, но если я не хочу, чтобы отображалось значение по строкам (я просто хочу, чтобы вычислялась совокупная сумма), просто поместите выражение, вызывающее функцию, в скрытый столбец. SSRS по-прежнему будет запускать функцию при рендеринге каждой строки, но, очевидно, она просто не отображает результат работы функции.

Некоторые ссылки на MS для переменных отчета и кода

https://docs.microsoft.com/en-us/sql/reporting-services/report-design/built-in-collections-report-and-group-variables-references-report-builder?view=sql-server-ver15

https://docs.microsoft.com/en-us/sql/reporting-services/report-design/add-code-to-a-report-ssrs?view=sql-server-ver15

Комментарии:

1. Спасибо за ваш ответ! Я опубликовал обновление для своего сообщения. Может быть, вы можете мне там помочь?

2. Для вывода конечного результата я не считаю, что это правильный метод. Я полагаю, вам нужно будет создать другую функцию, скажем: Общедоступная функция Get_Total_Sum() Как функция двойного возврата Total_lookup_Sum End, Затем в поле, где вы хотите отобразить итоговую сумму, выражение будет: =Code.Get_Total_Sum() (Также, просто небольшое другое предложение. Поскольку, судя по вашему скриншоту, суммы комиссионных за продажу могут иметь десятичные значения, вероятно, было бы неплохо использовать Double вместо Integer в качестве типов данных в этих функциях)

3. Это здорово. Я использовал код из своего обновления и изменил integer на double, как вы предложили. Знайте, что я получаю правильные результаты. Большое спасибо!

Ответ №2:

К сожалению, это не проверено, но…

предполагая, что у вас есть rowgroup для вызова employee EmployeeGroup , тогда выражение будет выглядеть следующим образом…

 =SUM(
     Sum(Fields!Total_Comission.Value, "EmployeeGroup")
     * Parameters!Distribution_Factor.Value
     * FIRST(Fields!Individual_Factor.Value, "EmployeeGroup")
    )
 

Внутреннее выражение читается как

Сумма Total_Comission с текущей группой сотрудников … умножается на коэффициент распределения … умножается на первый индивидуальный коэффициент с учетом текущей группы сотрудников

Внешнее выражение просто суммирует все суммы на уровне отдельных сотрудников.