SSRS - пустое значение

У меня есть параметр @Destinataire в SSRS, который имеет список значений плюс пустая строка

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

Я создал запрос, который я установил как доступные значения, что дает мне раскрывающийся список

SELECT code_name FROM tableA UNION ALL SELECT ''

При запуске отчетов с пустой строкой у меня нет результатов

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

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

Однако при запуске sql-запроса, который я использую для запуска этого отчета, все в порядке, поскольку все мои строки получены (см. ниже запрос)

DECLARE @DateCmt DATE = '05/09/2015',
        @DateFin DATE = '05/09/2016',
        @Restriction INT = 1,
        @Destinataire VARCHAR(5) = ''
        --
        ;

--SELECT @DateCmt,@DateFin

 SELECT DISTINCT 
CFE_EDI.IU_LIASSE
,CFE_EDI.ETAT
,CFE_EDI.DATHRMAJ -- nouveau
,CFE_EDI.ESP_APPLI
,CFE_EDI.NOM_RS
,PARTENAIRES.LIBEL
,PARTENAIRES.CODE_INSEE
,CFE_EDI.DATHR_ENV -- nouveau
,CFE_EDI.DATHR_MEF -- nouveau
,CFE_EDI.DATHR_PRE -- nouveau
,CFE_EDI.DATHR_OUV -- nouveau
--,CFE_EDI.DATEHR_DEPOT-- mettre l'heure
,CFE_EDI.GESTDEL
--,CFE_SERVICE_DEST.IU_DEST
--,CFE_SERVICE.IU_LIASSE
,CASE WHEN CFE_EDI.ETAT = 'MEF' THEN 'En Attente le'
     WHEN CFE_EDI.ETAT = 'PRE' THEN 'Préparé le' 
     WHEN CFE_EDI.ETAT = 'ENV' THEN 'Envoyé le'
     WHEN CFE_EDI.ETAT = 'OUV' THEN 'Réceptionné le'
     WHEN CFE_EDI.ETAT = 'NRM' THEN 'Non remis le'
     WHEN CFE_EDI.ETAT = 'NAQ' THEN 'Non acquitté le'
     END AS ChampEtat
,CASE WHEN CFE_EDI.ETAT = 'OUV' THEN 'Date d''envoi : ' + CONVERT(VARCHAR,CFE_EDI.DATHR_ENV,103)
END AS Date_Envoi,
CASE 
WHEN CFE_EDI.ETAT='MEF' THEN  CONVERT(VARCHAR,CFE_EDI.DATHR_MEF,103) 
WHEN CFE_EDI.ETAT='PRE' THEN  CONVERT(VARCHAR,CFE_EDI.DATHR_PRE,103) 
WHEN CFE_EDI.ETAT='ENV' THEN  CONVERT(VARCHAR,CFE_EDI.DATHR_ENV,103) 
WHEN CFE_EDI.ETAT='OUV' THEN  CONVERT(VARCHAR,CFE_EDI.DATHR_OUV,103) 
ELSE CONVERT(VARCHAR,CFE_EDI.DATHR_DEPOT,103) END AS DateMaj ,
CASE
WHEN CFE_EDI.ETAT='MEF' then CONVERT(VARCHAR,CFE_EDI.DATHR_MEF,108) 
WHEN CFE_EDI.ETAT='PRE' then CONVERT(VARCHAR,CFE_EDI.DATHR_PRE,108) 
WHEN CFE_EDI.ETAT='ENV' then CONVERT(VARCHAR,CFE_EDI.DATHR_ENV,108) 
WHEN CFE_EDI.ETAT='OUV' then CONVERT(VARCHAR,CFE_EDI.DATHR_OUV,108)
ELSE CONVERT(VARCHAR,CFE_EDI.DATHR_DEPOT,108) END AS HeureMaj,
PARTENAIRES.LIBEL + '(' + CFE_EDI.CODE_INSEE + ')' AS LibelDestinataire
--,CASE WHEN @Restriction = 1 THEN '1'
--     WHEN @Restriction = 0 THEN '0' END AS Restriction
,CASE WHEN @DateCmt != @DateFin AND @DateCmt <  @DateFin THEN 'Diffusion Xml du ' + CONVERT(VARCHAR,(@DateCmt),103) + ' au ' + CONVERT(VARCHAR,(@DateFin),103) ELSE 
'Diffusion EDI Xml du ' + CONVERT(VARCHAR,@DateCmt,103) END AS Plage_Diffusion
-- INTO 
 FROM   
 (PARTENAIRES 
 INNER JOIN dbo.CFE_EDI ON PARTENAIRES.CODE_INSEE = CFE_EDI.CODE_INSEE) 
INNER JOIN dbo.CFE_SERVICE ON CFE_EDI.IU_LIASSE = CFE_SERVICE.IU_LIASSE
INNER JOIN dbo.CFE_SERVICE_DEST ON (PARTENAIRES.IU_PART = CFE_SERVICE_DEST.IU_PART_CFE)
WHERE 
case when @Restriction = 1
              then case when CFE_EDI.ETAT in('ENV','OUV') then 1 else 0 end
           when @Restriction = 0
              then case when CFE_EDI.ETAT not in('ENV','OUV') then 1 else 0 end
           else case when CFE_EDI.ETAT <> '' then 1 else 0 end
       end = 1
AND 
CFE_EDI.CODE_INSEE IS NOT NULL AND CFE_EDI.CODE_INSEE != '' 
    AND    CASE --WHEN CFE_EDI.CODE_INSEE IS NOT NULL AND CFE_EDI.CODE_INSEE !=''
           --THEN CASE 
           WHEN @Destinataire != '' AND (@Destinataire) IS NOT NULL
              THEN CASE WHEN CFE_EDI.CODE_INSEE = @Destinataire THEN 1 ELSE 0 END
           ELSE CASE WHEN CFE_EDI.CODE_INSEE = PARTENAIRES.CODE_INSEE 
                    AND cfe_edi.dathrmaj > @DateCmt AND cfe_edi.dathrmaj < @DateFin 
                    AND CFE_EDI.GESTDEL = '1' THEN 1 ELSE 0 END  
           END = 1

Первый вопрос - знать, есть ли способ настроить параметр без использования моего глупого трюка.

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

Заранее благодарим за помощь

Обновление Я попытался установить WHEN LEN(@Destinataire) > 0 с @Destinataire = '', но не повезло в этом.

Обновление 2 Теперь моя цель - получить решение, которое будет извлекать все данные, в случае, если @Destinataire равен '' или NULL. Однако, думая об этом, это решение эквивалентно тому, что все значения заполнены в @Destinataire. Так или иначе, я бы сказал.

Окончательное обновление Я воссоздал все с нуля и о! магия, группировка или все варианты работали по желанию. Я до сих пор не знаю, что случилось, но я в порядке с результатами. Большое спасибо за вашу помощь и поддержку.

Ответ 1

глядя на ваш запрос и где вы передаете @Destinataire, вы должны иметь возможность передать нулевое значение в соответствии с предложением where и получить тот же эффект, что и при передаче '

 CASE --WHEN CFE_EDI.CODE_INSEE IS NOT NULL AND CFE_EDI.CODE_INSEE !=''
       --THEN CASE 
       WHEN @Destinataire != '' AND (@Destinataire) IS NOT NULL
          THEN CASE WHEN CFE_EDI.CODE_INSEE = @Destinataire THEN 1 ELSE 0 END
       ELSE CASE WHEN CFE_EDI.CODE_INSEE = PARTENAIRES.CODE_INSEE 
                AND cfe_edi.dathrmaj > @DateCmt AND cfe_edi.dathrmaj < @DateFin 
                AND CFE_EDI.GESTDEL = '1' THEN 1 ELSE 0 END  
       END = 1

Я попытался бы просто установить этот конкретный параметр, чтобы разрешить нули в отчете ssrs, который можно найти как флажок в окне настроек параметров.

Ответ 2

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

  • Создайте новый набор данных.

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

SELECT code_name FROM tableA WHERE @Destinataire='' OR @Destinataire=code_name
--Dummy value needed to force update of parameter value in some cases:
UNION SELECT 'zz' + @Destinataire AS code_name
  • Настройте новый параметр @MultiDestataire. Позвольте ему принять несколько значений и использовать новый набор данных в качестве доступных и значений по умолчанию. Установите его видимость на "Скрытый".

Запуск отчета перед скрытием нового параметра показывает, как он работает:

Поведение параметра

  • Отредактируйте запрос, чтобы использовать новый многозначный параметр в своем предложении WHERE.

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

CFE_EDI.CODE_INSEE IS NOT NULL AND CFE_EDI.CODE_INSEE != '' 
AND CFE_EDI.CODE_INSEE IN (@MultiDestinataire)
...

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

Ответ 3

Это всего лишь мои два цента, в основном у вас есть два варианта.

Опция многозначного параметра

Определите свой параметр, чтобы разрешить многозначность, используйте один и тот же набор данных в свойствах Available values и Default values. Поэтому, когда ваш пользователь не выбирает какое-либо значение, параметр будет заполнен всеми значениями. В противном случае ваш параметр будет заполняться только теми значениями, которые выбирают ваши пользователи.

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

...
WHERE CFE_EDI.CODE_INSEE IN (@Destinataire)
...

При использовании свойства Default values все выпадающие значения списка выбираются по умолчанию, и ваш отчет запускается без применения какого-либо фильтра (по крайней мере, если ваш пользователь не выбирает никаких значений или значений).

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

Дополнительно, я бы избегал использования '' (blank), он неинформативен, и ваш пользователь может подумать, что это какая-то ошибка или ваш параметр не был заполнен должным образом.

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

Единое значение Опция (нет смысла ИМО)

Для этого вы должны установить свой параметр Allow blank value ("") и Allow null value. Ваш запрос должен выглядеть следующим образом:

WHERE
  CASE WHEN @Destinataire = '' OR @Destinataire is null THEN 1 ELSE 0 END = 1
  OR
  CFE_EDI.CODE_INSEE = @Destinataire

В вашем запросе я думаю, что это может быть примерно так:

WHERE  CASE 
         WHEN @Restriction = 1 THEN 
           CASE 
             WHEN cfe_edi.etat IN( 'ENV', 'OUV' ) THEN 1 
             ELSE 0 
           END 
         WHEN @Restriction = 0 THEN 
           CASE 
             WHEN cfe_edi.etat NOT IN( 'ENV', 'OUV' ) THEN 1 
             ELSE 0 
           END 
         ELSE 
           CASE 
             WHEN cfe_edi.etat <> '' THEN 1 
             ELSE 0 
           END 
       END = 1 
       AND cfe_edi.code_insee IS NOT NULL 
       AND cfe_edi.code_insee != '' 
       AND ( CASE 
               --WHEN CFE_EDI.CODE_INSEE IS NOT NULL AND CFE_EDI.CODE_INSEE !=''  
               --THEN CASE   
               WHEN ( @Destinataire = '' 
                       OR @Destinataire IS NULL ) 
                    AND cfe_edi.code_insee = partenaires.code_insee
                    AND cfe_edi.dathrmaj > @DateCmt 
                    AND cfe_edi.dathrmaj < @DateFin 
                    AND cfe_edi.gestdel = '1' THEN 1 
               ELSE 0 
             END = 1 
              OR cfe_edi.code_insee = @Destinataire )  

Также рассмотрите эту оценку AND cfe_edi.code_insee = partenaires.code_insee, необходимо ли, даже если ваш оператор JOIN принуждает к выполнению условия? INNER JOIN dbo.CFE_EDI ON PARTENAIRES.CODE_INSEE = CFE_EDI.CODE_INSEE

Третий вариант может использовать скрытый параметр для очистки параметров null и '' пользователя для создания параметра, заполненного всеми значениями. Попробуйте варианты выше, прежде чем принимать участие в скрытом/внутреннем параметрах.

Сообщите мне, если это поможет.