首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SSRS -空值

SSRS -空值
EN

Stack Overflow用户
提问于 2016-09-09 14:06:10
回答 3查看 4.3K关注 0票数 10

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

我已经创建了一个我设置为可用值的查询,它给出了下拉列表

代码语言:javascript
运行
复制
SELECT code_name FROM tableA UNION ALL SELECT ''

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

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

但是,在运行用于运行此报告的sql查询时,由于检索了所有行(请参见下面的查询),所以情况很好。

代码语言:javascript
运行
复制
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,什么都没有。

提前感谢您的帮助

更新--我尝试用@Destinataire = ''设置WHEN LEN(@Destinataire) > 0,但没有成功。

更新2我现在的目标是找到一个可以检索所有数据的解决方案,以防@Destinataire等于“”或NULL。但是,考虑到这一点,这个解决方案相当于在@Destinataire中填充所有的值。所以不管怎么说,我会说。

最后一次更新,,我从零开始重新创建了一切,哦!魔术、分组或所有选项都是按意愿工作的。我还是不知道出了什么问题,但我对结果没意见。非常感谢你的帮助和支持。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-09 15:13:05

查看查询和传递@Destinataire的位置,您应该能够根据where子句传递空值,并获得与passing‘相同的效果。

代码语言:javascript
运行
复制
 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报告中的空值,这可以作为参数设置窗口中的复选框找到。

票数 4
EN

Stack Overflow用户

发布于 2016-09-14 19:10:37

有一个混合选项,您可以像保留可见参数一样保留它,但是在查询中使用隐藏的级联参数来引用。因此,如果您在将空值或空值作为参数进行查询时遇到了问题,这将解决这个问题。以下是几个步骤:

  • 创建一个新的数据集。

一个小问题是,您确实需要确保更改所选内容总是会添加一个新值,以强制刷新级联参数,但这很容易做到:

代码语言:javascript
运行
复制
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语句,它应该如下所示:

代码语言:javascript
运行
复制
CFE_EDI.CODE_INSEE IS NOT NULL AND CFE_EDI.CODE_INSEE != '' 
AND CFE_EDI.CODE_INSEE IN (@MultiDestinataire)
...

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

票数 3
EN

Stack Overflow用户

发布于 2016-09-13 03:19:35

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

多值参数选项

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

在这种情况下,您将不得不使用IN操作符,因为您的参数表示用户选择或不选择的多个值。

代码语言:javascript
运行
复制
...
WHERE CFE_EDI.CODE_INSEE IN (@Destinataire)
...

当您使用Default values属性时,默认情况下会选择所有下拉列表值,并且您的报表运行时不会应用任何筛选器(至少如果您的用户没有选择任何值或值)。

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

当您想要显示来自多个值的数据时,为什么要使用单个值参数(在您的示例中是all)?

单值期权(无意义海事组织)

为了做到这一点,您必须将参数设置为Allow blank value ("")Allow null value。您的查询应该如下所示:

代码语言:javascript
运行
复制
WHERE
  CASE WHEN @Destinataire = '' OR @Destinataire is null THEN 1 ELSE 0 END = 1
  OR
  CFE_EDI.CODE_INSEE = @Destinataire

在您的查询中,我认为可能是这样的:

代码语言:javascript
运行
复制
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操作符强制满足这个条件,也是必要的吗?

第三个选项可以使用隐藏参数来清除用户的null''选项,以生成一个填充了所有值的参数。在涉及到隐藏/内部参数方法之前,尝试上面的选项。

如果这有帮助的话请告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39413482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档