Как в SSRS сравнить значение элемента родительского отчета с элементами отчета в дочерней группе?

Я использую SSRS 2008. У меня есть 3 разные группы над деталями моего отчета, которые представляют собой расчетные суммы. Я пытаюсь покрасить лимит в красный цвет, если какая-либо из сумм счета (A) в дочерней группе превышает лимит (B).

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

=IIF(ReportItems!Invoice_DueDate.Value>ReportItems!Limit.Value,"Red","Black")

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

Мое решение. Я решил использовать SQL, чтобы получить сумму суммы счета, сгруппированную по дате оплаты. Затем я назвал это поле в родительской группе.


person Brandon Tull    schedule 04.09.2013    source источник
comment
Я решил использовать SQL, чтобы получить сумму суммы счета, сгруппированную по дате оплаты. Затем я назвал это поле в родительской группе.   -  person Brandon Tull    schedule 10.09.2013


Ответы (2)


Если я правильно понял ваш вопрос, то я думаю, вы можете использовать

=IIF(MAX(ReportItems!Invoice_DueDate.Value) > ReportItems!Limit.Value,"Red","Black")

Вам нужна какая-то агрегатная функция, такая как MAX(), чтобы сообщить SSRS, каков объем и операция того, что должно быть сделано. (Например, если вы хотите убедиться, что общая сумма не превышает лимит, вы должны использовать SUM(...)

person Jamie F    schedule 05.09.2013
comment
Я попробовал это решение, но получил ошибку. Выражение: =IIF(MAX(ReportItems!Invoice_DueDate.Value)›ReportItems!Limit.Value,Red,Black) Ошибка: [rsAggregateReportItemInBody] Цветовое выражение для textrun 'Limit.Paragraphs[0].TextRuns[0]' использует агрегатную функцию для элемента отчета. Агрегированные функции можно использовать только для элементов отчета, содержащихся в верхних и нижних колонтитулах страниц. - person Brandon Tull; 05.09.2013

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

Например, скажем, у нас есть некоторые простые данные:

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

И простая таблица на основе этого, с группой на основе grp.

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

Здесь свойство BackgroundColor для текстового поля value в строке сведений установлено следующим образом:

=IIf(Fields!value.Value > Min(Fields!limit.Value, "Group1")
  , "Red"
  , Nothing)

Это проверяет все строки в родительской группе текущей строки, а не только текущую строку. Это работает так, как ожидалось:

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

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

Редактировать после комментариев

ОК, судя по дальнейшим комментариям, кажется, что вам нужна агрегация по агрегированной функциональности.

Это доступно через выражения SSRS только в 2008R2 и более поздних версиях, поэтому в вашем случае это не поможет.

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

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

person Ian Preston    schedule 05.09.2013
comment
Данные представлены в десятичном формате (1200000,00), но элементы отчета отформатированы для отображения суммы в долларах. Вот выражение, которое я пробовал: =IIF(MAX(ReportItems!Invoice_DueDate.Value, table1_DueDate)›ReportItems!Limit.Value,Red,Black) Я попробовал это решение и получил следующую ошибку: [rsAggregateReportItemInBody] Выражение цвета для textrun 'Limit.Paragraphs[0].TextRuns[0]' использует агрегатную функцию для элемента отчета. Агрегированные функции можно использовать только для элементов отчета, содержащихся в верхних и нижних колонтитулах страниц. - person Brandon Tull; 05.09.2013
comment
На моем скриншоте группы настроены немного иначе, чем у вас. Спасибо за помощь Ян. - person Brandon Tull; 05.09.2013
comment
В моем примере я использую ссылки Fields!..., а не ReportItems!..., поэтому вы можете использовать это выражение свойства. Если вы предоставите некоторые образцы данных, которые демонстрируют ваши требования, я мог бы предоставить некоторые дополнительные сведения. - person Ian Preston; 05.09.2013
comment
Я хочу получить максимальное значение дочерней группы для использования в родительской группе. Ваше решение состоит в том, чтобы получить агрегат родительской группы для использования в дочерней группе. Я использую =IIF(MAX(Fields!Invoice.Value,"table1_DueDate")>SUM(Fields!Limit.Value),"Red","Black") , но не могу получить агрегатную функцию для поиска в моей дочерней группе. table1_DueDate — дочерняя группа или (A). Я получаю следующую ошибку: параметр области должен быть установлен в строковую константу, которая равна либо имени содержащей группы, либо имени содержащей области данных, либо имени набора данных. - person Brandon Tull; 06.09.2013
comment
Хорошо, я добавил еще несколько деталей. - person Ian Preston; 06.09.2013
comment
Я думаю, что мне придется агрегировать это в хранимой процедуре и перенести в отчет в поле. Спасибо вам за помощь. - person Brandon Tull; 06.09.2013
comment
Пожалуйста. К сожалению, для 2008 года и ниже это, вероятно, единственный надежный вариант. - person Ian Preston; 06.09.2013