2

Я хочу построить отчет SSRS с колонкой в ​​виде недельных чисел - 8 недель для 8 столбцов, начиная с текущего. Этот отчет запускается каждую неделю, и тогда устанавливается номер текущей недели. Таким образом, имена столбцов и их значения должны измениться. Возможно ли построить что-то подобное в SSRS?Динамически меняйте имена столбцов в качестве номера недели в каждом еженедельном прогоне

Я попытался сделать это с помощью динамического SQL-хранимого proc в наборе данных. Однако для каждого запуска я даже не вижу значения столбцов обновления динамически

Вот пример:

enter image description here

Кроме того, я стараюсь избегать этих выходных чисел в качестве значений строк, а затем с помощью матриц

Моя ХП выглядит что-то вроде этого

объявить @n TINYINT = DatePart (WK, GETDATE())

declare @ n1 tinyint = (@ n + 1), @ n2 tinyint = (@ n + 2), @ n3 tinyint = (@ n + 3), @ n4 tinyint = (@ n + 4), @ n5 tinyint = (@ n + 5), @ n6 tinyint = (@ n + 6)

exec ('Выберите b.sku, b. [' + @ n + '], b. [' + @ n1 + '], b. ['+ @ n2 +'], b. ['+ @ n3 +'], b. ['+ @ n4 +'], b. ['+ @ n5 +'] ...

Поблагодарит за любую помощь в этом направлении .. большое спасибо!

ответ

0

При работе с SSRS обычно лучше избегать динамического SQL и сворачивать данные в SQL. Используйте SQL для получения необработанных данных, а затем пусть SSRS выполняет поворот и агрегацию. Таким образом, вы используете то, что каждый из них делает лучше всего. Я знаю, что вы сказали, что хотите избежать матриц, но это лучший способ сделать отчет динамичным.

Таким образом, вы должны либо вернуть все данные в один набор данных, либо использовать фильтры на своих матрицах ИЛИ написать два запроса, а каждый заполнить матрицу. Кстати, матрица - это просто таблица с добавленной группой столбцов, поэтому не пугайтесь ими.

+0

Спасибо за ваш ответ. Причина, по которой я пытаюсь избежать матриц или группы таблиц, заключается в том, что в отчете я использую отдельные значения недели (например, Field! Wk48.value) для вычисления других значений столбца. Если я их группирую (имея номера недель как элемент группы), я буду иметь доступ к отдельным данным недели? –

+0

@ PC-Stats Да, см. Функцию 'Lookup'. https://msdn.microsoft.com/en-us/library/ee210531.aspx – StevenWhite

+0

Для функции поиска потребуется имя поля. Здесь имя поля сгруппировано. Более подходящая функция может быть первой, последней и предыдущей. Однако из моего опыта они делают отчет очень медленным, и я стараюсь как можно больше сохранить производительность ... –

0

Есть 2 способа сделать это со стандартным таблицей.

  1. Вычислить заголовки столбцов в качестве выражений с использованием конкатенации Wk и некоторые даты математики, чтобы найти правильный номер недели и возвращать тот же самый вид вещи из вашего запроса (например, столбцы current_week, week_minus_1, week_minus_2 ...)

  2. Возвращаем заголовки столбцов в виде дополнительных столбцов в вашем запросе, которые являются одинаковыми значениями для каждой строки (например, ColHeader0, ColHeader1 ...). В столбцах данных все равно будут относительные недели (например, ValueWeek0, ValueWeek1 ...). В вашем отчете заголовок столбца будет иметь выражение, подобное =First(Fields!ColHeader0.Value). Это более гибкий подход, поскольку он позволяет вам выбрать 8 исторических недель, а не только последние 8 недель, если вы добавите параметр.

EDIT - Разъяснения

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

exec ('Select b.sku, b.['[email protected]+'] as Wk0, b.['[email protected]+'] as Wk1, b.['[email protected]+'] as Wk2, b.['[email protected]+'] as Wk3, b.['[email protected]+'] as Wk4, b.['[email protected]+'] as Wk5... 

Это позволит вам заполнить псевдоним столбца Wk0 с соответствующими данными текущей недели и по-прежнему убедитесь, что он может быть последовательно ссылаться как базовая неделя SSRS.

Чтобы изменить заголовки столбцов вы можете:

  1. Самостоятельно рассчитать число неделю в SSRS в выражениях заголовков столбцов: ="Wk" + CStr(<correct week calculation>).

  2. Возврат заголовки столбцов в наборе результатов и доступ к ним в выражении заголовка колонки:

    exec ('Select b.sku, b.['[email protected]+'] as Wk0, b.['[email protected]+'] as Wk1, b.['[email protected]+'] as Wk2, b.['[email protected]+'] as Wk3, b.['[email protected]+'] as Wk4, b.['[email protected]+'] as Wk5..., ''Wk'''[email protected]+' as ColHeader0, ''Wk'''[email protected]+' as ColHeader1...

и ссылаться на возвращенные заголовки столбцов из выражения заголовка столбца SSRS, как =First(Fields!ColHeader0.Value).

+0

Спасибо за ваш ответ. Я не уверен, что получил ваши решения. –

+0

Я добавил разъяснения для вас. – SMM

+0

Кроме того, вы могли бы сделать это так (относительные недели вместо конкретных недель) без использования динамического SQL. – SMM

0

Вот решение, которое работает для меня:

  1. Создать параметры (говорят CurrWk, CurrWk1), установить в качестве скрытый и магазина «Значение по умолчанию» и «Доступное значение» равняется текущей неделе числа (DATEPART (wk, now()) и любую последующую неделю, делая +1, +2, +3 .. и т. д.

  2. Напишите выражение запроса. Нажмите на fx рядом с пространством запросов набора данных и напишите запрос выбора для вашей программы вставляя значения параметров в окно выражения. Например, для «= SKU» [& Параметр! CurrWk.Value & "] as Wk1, [" [& Параметр! CurrWk.Value &"] как Wk1 из Sales_Table " Перед передачей этого запроса в виде текстового выражения команды убедитесь, что этот запрос работает в sql ssms.

  3. Сохраните выражение. Теперь найдите вкладку «Поля» на левой панели. Вам нужно отобразить поля вручную из запроса здесь. Если этого не сделать, существует очень высокая вероятность того, что вы увидите пустой список полей и не сможете получить к ним доступ вообще. Это может быть связано с тем, что ssrs не хранят метаданные запроса непосредственно из выражений.

Вы можете избежать часть вопроса, имея по крайней мере статические поля, например, здесь SKU, перечисленные в списке «Поля» на первый запуск SQL-запрос со статическим полем (выбрать SKU от Sales_Table). Затем вы можете вернуться к обновлению запроса набора данных к выражению и вставить параметризованные имена полей.

  1. Имена полей полей. В этом примере я выбрал поля «Тип запроса» и задал имена полей как SKU, CurrentWeek, NextWeek и сопоставил с исходными SKU, Wk и Wk1 соответственно.

Нажмите «Обновить поля» внизу. Теперь у вас есть набор данных с полным списком полей. Используйте их в таблицах, таблицах. Запускайте его каждую неделю и обратите внимание на количество изменений, как ожидалось.

Если вы используете этот набор данных в таблице, убедитесь, что вы устанавливаете заголовки с помощью меток параметров (например, здесь я сделал = Параметры! CurrWk.Этикетка для col с данными текущей недели)

Вот и все!