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

我已经创建了一个我设置为可用值的查询,它给出了下拉列表
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,什么都没有。
提前感谢您的帮助
更新--我尝试用@Destinataire = ''设置WHEN LEN(@Destinataire) > 0,但没有成功。
更新2我现在的目标是找到一个可以检索所有数据的解决方案,以防@Destinataire等于“”或NULL。但是,考虑到这一点,这个解决方案相当于在@Destinataire中填充所有的值。所以不管怎么说,我会说。
最后一次更新,,我从零开始重新创建了一切,哦!魔术、分组或所有选项都是按意愿工作的。我还是不知道出了什么问题,但我对结果没意见。非常感谢你的帮助和支持。
发布于 2016-09-09 15:13:05
查看查询和传递@Destinataire的位置,您应该能够根据where子句传递空值,并获得与passing‘相同的效果。
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报告中的空值,这可以作为参数设置窗口中的复选框找到。
发布于 2016-09-14 19:10:37
有一个混合选项,您可以像保留可见参数一样保留它,但是在查询中使用隐藏的级联参数来引用。因此,如果您在将空值或空值作为参数进行查询时遇到了问题,这将解决这个问题。以下是几个步骤:
一个小问题是,您确实需要确保更改所选内容总是会添加一个新值,以强制刷新级联参数,但这很容易做到:
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)
...如果您在查询中有其他问题负责意外的结果,那么尝试这样做可能会成为一个中间步骤,因为您的应该能够在那里测试一个空值。
发布于 2016-09-13 03:19:35
这只是我的两分钱,基本上你有两个选择。
多值参数选项
定义参数以允许多值,在Available values和Default values属性中使用相同的数据集。因此,当用户不选择任何值时,参数将被填充所有值。否则,您的参数将只使用用户选择的值填充。
在这种情况下,您将不得不使用IN操作符,因为您的参数表示用户选择或不选择的多个值。
...
WHERE CFE_EDI.CODE_INSEE IN (@Destinataire)
...当您使用Default values属性时,默认情况下会选择所有下拉列表值,并且您的报表运行时不会应用任何筛选器(至少如果您的用户没有选择任何值或值)。

另外,我避免使用'' (空白),它没有提供任何信息,您的用户可能会认为这是某种错误,或者您的参数没有正确填充。
当您想要显示来自多个值的数据时,为什么要使用单个值参数(在您的示例中是all)?
单值期权(无意义海事组织)
为了做到这一点,您必须将参数设置为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操作符强制满足这个条件,也是必要的吗?
第三个选项可以使用隐藏参数来清除用户的null和''选项,以生成一个填充了所有值的参数。在涉及到隐藏/内部参数方法之前,尝试上面的选项。
如果这有帮助的话请告诉我。
https://stackoverflow.com/questions/39413482
复制相似问题