Есть ли способ добавить пустую строку в набор данных SSRS на основе параметра?

У меня есть отчет SSRS, который печатает адресные метки, 30 на странице, в 3 столбцах.

Я создал отчет, аналогичный инструкциям, найденным здесь

Редко мне приходится печатать ровно 30 этикеток. Итак, для экономии бумаги и денег я хотел бы добавить в этот отчет параметр с номерами 1-30, чтобы решить, с какого места на странице начать печать.

Если бы я уже напечатал 16 этикеток на странице, я мог бы выбрать 17 в параметре, и мои результаты начали бы печатать с 17-й этикетки на странице.

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


person kmorris84    schedule 19.08.2016    source источник
comment
Здесь было бы полезно узнать ваш запрос набора данных. Мой первый порыв состоит в том, чтобы объединить «пустую» строку в ваш набор данных и воспроизвести ее для номера вашего параметра минус 1. Но, не зная, на что похож набор данных, трудно понять, как должно выглядеть объединение.   -  person Gallus    schedule 22.08.2016


Ответы (3)


Я не уверен, что это лучшее решение, но см. этот запрос ниже

DECLARE @StartColumn INT = 6

;WITH CTE
 AS (
       SELECT *
            ,ROW_NUMBER() OVER (ORDER BY q.value) AS [rowNum]
        FROM (
            values('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H'),('I'),('J'),('K'),('L')
        ) q (value)
    )

    SELECT CASE
                WHEN CTE.rowNum > @StartColumn THEN CTE.value
                ELSE NULL
            END AS [Value]
    FROM CTE

вы получите такой результат

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

Затем запустите, он будет отображаться пустым, когда нулевое значение в отчете (я думаю, вы используете группу в отчете для печати нескольких строк)

person Chanom First    schedule 23.08.2016

Я столкнулся с похожей проблемой, например, при выборе этикетки для печати, а также необходимости печатать более 1 этикетки для каждого клиента. Моя проблема в том, что я не могу получить доступ к SQL (мы используем кубы). Я использовал SSRS 2012 с SharePoint. Это некрасиво, но это работает.

У меня был 1 набор данных в моем отчете. У меня было 14 этикеток - 7 вниз и 2 поперек. Каждая метка настраивается как отдельный табликс.

Табликсы пронумерованы от 1 до 14, начиная с верхнего левого угла. Итак, 1-7 вниз по левому «столбцу», а затем 8-14 сверху по правому «столбцу».

Раздражает то, что значения параметров начинаются с 0, поэтому они пронумерованы от 0 до 13. Каждый табликс настроен на фильтрацию по определенному значению параметра, например, табликс 1 настроен на фильтрацию по значению параметра 0, табликс 2 фильтруется по значению параметра. 1, табликс 3 фильтруется по значению параметра 2, табликс 4 фильтруется по значению параметра 3 и т. д.

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

Создать параметр

Пользователи будут использовать идентификатор клиента (6-значное число) в качестве значения параметра. Я создал параметр ClientID. Для подсказки я поставил «Заменить 000000 для каждой требуемой метки. 000000 = пустая метка».

  1. В разделе «Общие» я:

    • changed Data type to Text
    • включено Разрешить пустое значение ("")
    • включено Разрешить несколько значений
    • установить видимость параметра Select на Visible
  2. Доступные значения

    • left as None
  3. Default Values
    • selected Specify values
    • нажал «Добавить» и установил «Значение» на 00000. Я делал это 14 раз (поэтому у меня есть значение по умолчанию 000000 для каждой метки)

Создать табликс

Затем я создал табликс для каждой метки. Все они указывали на мой набор данных (образно названный «DataSet1»). Они состояли из одной клетки. Это соответствовало высоте и ширине области печати моей этикетки.

Создать текстовое поле

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

Создал второе текстовое поле и переместил его вниз, пока оно не удовлетворит мои потребности. В нем использовалась та же формула, что и в первом текстовом поле. (помните, мне нужно было дважды напечатать имя клиента).

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

Для первой метки формула для обоих текстовых полей была следующей:

=lookup(Parameters!ClientID.Value(0), 
Fields!ID.Value, 
UCase(Fields!Surname.Value), 
"DataSet1") 
& ", " & 
lookup(Parameters!ClientID.Value(0), 
Fields!ID.Value, 
Fields!Given.Value, 
"DataSet1")

Создать фильтр для табликса

Мне также пришлось применить фильтр к каждому табликсу, чтобы он печатал информацию о клиенте, выбранную с помощью параметра.

В свойствах табликса в разделе «Фильтры» + нажмите «Добавить» + в выражении, я выбрал свой ClientID + в операторе, я выбрал In + в значении, я нажал кнопку «Fx», чтобы создать формулу = Parameters! ClientID.Value (0 )

Не отображать значение параметра по умолчанию

Очевидно, что если вы оставите значение параметра по умолчанию (000000), он напечатает это.
Единственный способ предотвратить это — использовать цвет шрифта (я не смог заставить работать видимость). + Щелкните правой кнопкой мыши текстовое поле + Выберите свойства текстового поля + Щелкните параметры шрифта + Под цветом нажмите кнопку Fx + Используйте эту формулу:

=iif(Parameters!ClientID.Value(0)="000000", "White", "Black")

Для последующих ярлыков

Для второй метки я проиндексировал значение в скобках, например, от (0) до (1) для обеих формул текстового поля, а также для фильтра, например

=lookup(Parameters!ClientID.Value(1), 
Fields!ID.Value, 
UCase(Fields!Surname.Value), 
"DataSet1") 
& ", " & 
lookup(Parameters!ClientID.Value(1), 
Fields!ID.Value, 
Fields!Given.Value, 
"DataSet1")

и в фильтре свойств табликса

=Parameters!ClientID.Value(1)

и в формуле шрифта текстового поля

=iif(Parameters!ClientID.Value(1)="000000", "White", "Black")

Затем я проиндексировал это число для каждой последующей метки, поэтому последняя метка (метка 14) имела следующие значения:

=lookup(Parameters!ClientID.Value(13) etc 

и в фильтре свойств табликса

=Parameters!ClientID.Value(13)

и в формуле шрифта текстового поля =iif(Parameters!ClientID.Value(13)="000000", "Белый", "Черный")

Итак, когда пользователи запускают отчет, они заменяют 000000, 000000, 000000 и т. д. соответствующим идентификатором клиента.

person Adrift    schedule 05.10.2017

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

    declare @cnt int = 1
    declare @string varchar(max) = ''
    declare @varID varchar(max) = cast(@paramID as varchar(max))

    IF @paramStartLocation > 1
        WHILE @cnt < @paramStartLocation
        BEGIN 
           set @string = @string + 'select null as Column1
                 ,null as Column2
                 ,null as Column3
                 ,null as Column4
                 ,null as Column5
                 ,null as Column6
                 UNION ALL
                 '
           set @cnt = @cnt + 1
        END 

    set @string = @string + 'SELECT [TableName].[Column1]
         , [TableName].[Column2]
         , [TableName].[Column3]
         , [TableName].[Column4]
         , [TableName].[Column5]
         , [TableName].[Column6]

      FROM [TableName]
     WHERE  [TableName].[IDColumn] in ('+@varID+')'

     exec(@string)

Здесь @paramStartLocation — это слот метки, который начинает печататься, а «пустые» записи отображаются в отчете как пустые. Решение Chanom работает, чтобы пропускать записи и вместо этого отображать пустые, моему решению нужно было не пропускать записи, а добавлять X пустых записей.

person kmorris84    schedule 09.10.2017