SSRS - 空值

时间:2016-09-09 14:06:11

标签: sql sql-server reporting-services

我在SSRS中有一个参数@Destinataire,它有一个值列表加上一个空字符串

enter image description here

我创建了一个我设置为可用值的查询,它为我提供了下拉列表

SELECT code_name FROM tableA UNION ALL SELECT ''

使用空字符串运行报表时,我没有结果

enter image description here

我尝试将参数设置为文本框,但它也没有做任何事情

然而,在运行我用来运行此报告的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中填充了所有值。所以,我想说的是这样或那样。

最终更新我从头开始重新创建了所有内容哦!魔术,分组或一切选项按照愿望工作。我仍然不知道出了什么问题,但我对结果很满意。非常感谢您的帮助和支持。

3 个答案:

答案 0 :(得分:4)

查看您的查询以及传递@Destinataire的位置,您应该能够根据where子句传递空值,并获得与传递&#39;

相同的效果
 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报告中的空值,这可以在参数设置窗口中找到复选框。

答案 1 :(得分:3)

有一个混合选项,您可以在其中保留可见参数,但随后使用隐藏的级联参数在查询中引用。因此,如果您确实在使用空值或空值作为参数来制定查询时遇到问题,那么这将解决这个问题。以下是步骤:

  • 创建新数据集。

轻微一点,你需要确保更改选择总是添加一个新值来强制刷新级联参数,但这很容易做到:

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。允许它接受多个值并使用新数据集作为其可用和默认值。将其可见性设置为隐藏。

在隐藏新参数之前运行报告会显示它的工作原理:

Parameter Behavior

  • 编辑查询以在其WHERE子句中使用新的多值参数。

从这里开始,这只是改变查询以使用IN语句,它应如下所示:

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

如果您在查询中遇到了导致意外结果的其他问题,那么尝试这可能会成为一个中间步骤,因为您应该能够测试那里的空值。

答案 2 :(得分:1)

这只是我的两分钱,基本上你有两个选择。

多值参数选项

将参数定义为允许多值,在0.5%Available values属性中使用相同的数据集。因此,当您的用户没有选择任何值时,参数将填充所有值。否则,您的参数将仅填充用户选择的值。

在这种情况下,您必须使用Default values运算符,因为您的参数代表用户选择或不选择的多个值。

IN

当您使用... WHERE CFE_EDI.CODE_INSEE IN (@Destinataire) ... 属性时,默认情况下会选择所有下拉列表值,并且您的报告在未应用任何过滤器的情况下运行(至少如果您的用户没有选择任何值或值)。

enter image description here

另外,我避免使用Default values(空白),这是没有信息的,您的用户可能会认为它是某种错误或您的参数未正确填充。

为什么要在显示多个值的数据时使用单个值参数(在所有情况下都是如此)?

单值选项(无意义IMO)

为此,您必须将参数设置为''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_INSEEnull选项,以生成填充了所有值的参数。在参与隐藏/内部参数方法之前,请尝试上面的选项。

如果这有帮助,请告诉我。