报表生成器可选参数和强制参数

时间:2016-09-15 08:58:12

标签: sql-server tsql parameters optional-parameters reportbuilder

我的实时查询报告存在问题。在我的报告中,我有5个参数可以选择日期范围@DateFrom@DateTo以及3个应该允许选择特定属性的参数:

@salesid, @batch, @serial

我想强制使用日期范围参数,并且该工作没有任何问题,但最后3个参数:@salesid@batch@serial应该是可选的。

但他们没有按照自己的意愿行事。最后3个参数应该允许您键入可用作过滤器的值。但是当我选择日期和其中一个参数时,我得到的是查询的整个值而不是选定的值。

在我选择的参数属性中"允许空白值("")"选项,以防我将默认值定义为空白。

我的查询中的条件如何:

where
    st.custaccount <> 'number%'
    and datepart(year,st.CREATEDDATETIME) >= 2012
    and (ita.VENDORCODE like'producer1' or ita.vendorcode like 'producer2')
    and st.createddatetime >= @FromDate
    and st.createddatetime <= @ToDate  
     or (st.salesid = @salesid or @salesid  is null)
     or (itd.INVENTBATCHID = @batch or @batch is null)
     or (itd.INVENTSERIALID = @serial or @serial is null)

理论上它应该有用但是......好吧但实际上并非如此。

如何设置条件以获得所需效果?到目前为止,我找不到任何有用的东西。如果你们中的任何人知道有用的东西,请给我一些线索。

1 个答案:

答案 0 :(得分:0)

您需要将最终的3 or语句更改为and语句。

目前,您的查询主要是检查符合条件的数据项 OR ,这些最后三个参数中的任何一个都匹配/ null。这意味着即使您的数据不是日期范围等,它仍将被返回:

where st.custaccount <> 'number%'
    and st.CREATEDDATETIME >= '20120101'    -- Try not to use functions in your WHERE clause, as this stops indexes from working, making your query less efficient.
    and ita.VENDORCODE in('producer1', 'producer2')    -- IN has the same effect.
    and st.createddatetime between @FromDate and @ToDate    -- BETWEEN is an inclusive date range.  Equivalent to >= and <=

    and (st.salesid = @salesid
        or @salesid is null
        )
    and (itd.INVENTBATCHID = @batch
        or @batch is null
        )
    and (itd.INVENTSERIALID = @serial
        or @serial is null
        )