Можете ли вы вращать видимые вложенные отчеты в построителе отчетов 3?
У меня есть один основной отчет с несколькими подотчетами. По сути, я хочу показывать каждый подчиненный отчет по очереди в течение 30 секунд, прежде чем скрыть первый, затем показать следующий и перезапустить снова после того, как время истекло.
Спасибо
1 ответ
Я "думаю", вы можете сделать это, но есть некоторые предостережения.
Вам нужно будет настроить таблицу базы данных для хранения текущей позиции цикла, если у вас есть несколько таких отчетов, вы можете ввести ее, например, в имени отчета.
(обратите внимание, что эти имена относятся к основному отчету, не имеют отношения к подотчетам)
ReportName LoopPosition LoopMax
MyMainReportA 0 3
AnotherReport 7 10
Добавить набор данных (давайте назовем его dsLoop
) к вашему основному отчету, который обновляет это значение и возвращает что-то вроде. (Непроверенные)
DECLARE @LoopPosition int
SELECT @LoopPosition = CASE LoopPosition WHEN LoopMax THEN 1 ELSE LoopPosition + 1 END
FROM myReportLoopTable
WHERE ReportName = 'MyMainReportA'
UPDATE myReportLoopTable Set LoopPosition = @LoopPosition WHERE ReportName = 'MyMainReportA'
SELECT @LoopPosition as LPos
Этот код просто добавляет 1 к LoopPosition или сбрасывает его в 1, если мы достигли максимального значения. Затем он возвращает это значение.
Теперь добавьте параметр pLoopPos
в ваш основной отчет (это может быть скрытый параметр) и установите его значение по умолчанию для нашего нового dsLoop
набор данных.
Теперь измените скрытое свойство каждого вложенного отчета, чтобы показывать вложенный отчет только в том случае, если Параметры! PLoopPos.Value = x, где x - порядок вложенного отчета.
Теперь, когда отчет запускается, он обновит позицию цикла и получит новое значение. Первый подотчет будет отображаться как pLoopPos будет 1. Когда ваш отчет обновляется (через свойство AutoRfresh), dsLoop
Набор данных будет переоценен, что позволит запустить код для обновления значения. Значение pLoopPos увеличится, и отобразится следующий подотчет.
Возможно, вам придется принудительно обновлять параметр (из свойств параметра).
ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ, ЭТО НЕ ПРОВЕРЕНО И НЕ ПРОВЕРЕНО. Это просто не в моей голове, поэтому я предлагаю простой отчет о тестировании, прежде чем тратить слишком много времени на его реализацию.
ОБНОВЛЕНИЕ: 2018-04-10 Исходя из вашего дополнительного вопроса, похоже, что использование параметра не будет работать, поскольку он не обновляется. Однако вы можете использовать значение dsLoop
возвращается напрямую. Чтобы внести изменения, просто поменяйте местами
Parameters!pLoopPos.Value
с =First(Fields!LPos.Value, "dsLoop")
Примечание: я слегка изменил запрос dsLoop, чтобы дать конечному результату имя (LPos
).
Теперь вы сможете удалить параметр, поскольку он больше не используется.