【问题标题】:Custom date range parameter OR pre-defined date from drop down in SSRS自定义日期范围参数或 SSRS 下拉菜单中的预定义日期
【发布时间】:2019-09-23 11:14:21
【问题描述】:

我正在 MSvs 中开发一个 SSRS 报告,它允许选择 2 个不同的日期。

一种选择是使用StartDateEndDate 参数选择自定义日期范围(选择允许NULL)。

另一个选项是通过选择“选择自定义”从下拉列表中列出的一组预定义日期中进行选择,也可以是NULL

我有 2 个数据集,它们都是 SQL Server 中的存储过程。一个是我的主要数据集,另一个是CalendarRanges,我在其中定义了预定义的日期范围,如下所示:

  • 当前周
  • 上一周
  • 当前月份
  • 自定义

我已经完全剥离了我的代码来提供一个例子。

主要数据集存储过程:

ALTER PROCEDURE MainDataset
(
    @StartDate DATETIME, 
    @EndDate DATETIME 
) 
WITH RECOMPILE  
AS
BEGIN

DECLARE @StartDateKey INT, @EndDateKey INT

SELECT
    @StartDateKey = MIN(DateKey),
    @StartDate = MIN(CalendarDate),
    @EndDateKey = MAX(DateKey),
    @EndDate = MAX(CalendarDate)

FROM
    Dim.Calendar
WHERE
    CalendarDate >= @StartDate
      AND CalendarDate <= @EndDate

;WITH Sales AS
(
    SELECT
        Sales.CurrencyKey,
        OrderId,
    FROM
        Fact.Sales
    WHERE   
        Sales.OrderDateKey = @StartDateKey
),

Payments AS
(
    SELECT
        Payments.PaymentCurrencyKey,
        PaymentID
    FROM    
        Payments
    WHERE
        AND Payment.DateKey >= @StartDateKey
        AND Payment.DateKey <= @EndDateKey
)
SELECT
    Sales.*,
    Payments.*,
    @StartDate AS 'StartDate',
    @EndDate AS 'EndDate'
FROM
    Sales
    LEFT JOIN Payments
        ON Payments.PaymentCurrencyKey = Sales.CurrencyKey

开始日期和结束日期与我在 SSRS 中的 @StartDate@EndDate 参数相关联。

数据集 2:

ALTER PROCEDURE CalendarRanges 
AS
SELECT 
1 AS [Order],
Value,
Label
FROM 
(SELECT 
CurrentWeekOfYear AS Value,
'CurrentWeek' AS Label
FROM Calendar
WHERE CalendarDate =  CONVERT(varchar, getdate(), 23)) CurrentWeek

UNION 

 -- Previous Week
SELECT 
2 AS [Order],
Value,
Label
FROM 
(SELECT 
  DISTINCT CurrentWeekOfYear -1 AS Value,
 'PreviousCurrentWeek' AS Label 
  FROM Calendar 
 WHERE CalendarDate =  CONVERT(varchar, getdate(), 23)) PreviousWeek

UNION

-- Current Month
SELECT 
  4 AS [Order],
  Value,
  Label
 FROM
 (SELECT 
 DISTINCT CurrentMonth AS Value,
 'CurrentMonth' AS Label
 FROM Calendar
 WHERE CurrentMonth = MONTH(GETDATE())) CurrentMonth

UNION

-- Custom 
 SELECT 
 5 AS [Order],
 value,
 Label
 FROM (
 SELECT 
 NULL AS Value,
'Select Custom' AS Label
 ) Custom

如果我从下拉列表中选择“选择自定义”选项,然后选择自定义开始和结束日期,报告会按预期运行。

但是,如果我保留自定义开始和结束日期 NULL 并从下拉列表中选择预定义日期,则报告不会返回任何数据。我已经通过在选择自定义时预定义显示数据的日期进行了测试,因此我知道数据在那里。

我想处理报告,如果自定义开始和结束日期参数为NULL,则改用下拉参数,但我很难理解如何实现?

【问题讨论】:

    标签: sql sql-server reporting-services


    【解决方案1】:

    您可以更改程序中的一些逻辑...这可能会对您有所帮助...

    ALTER PROCEDURE MainDataset
    (
        @StartDate VARCHAR(20)=NULL, 
        @EndDate VARCHAR(20)=NULL
    ) 
    WITH RECOMPILE  
    AS
    BEGIN
    
    DECLARE @StartDateKey INT, @EndDateKey INT
    
    SELECT
        @StartDateKey = MIN(DateKey),
        --@StartDate = MIN(CalendarDate),
        @EndDateKey = MAX(DateKey)
       -- @EndDate = MAX(CalendarDate)
    
    FROM
        Dim.Calendar
    WHERE
    
    convert(DATETIME,CalendarDate)  
    BETWEEN Convert(DATETIME,CASE WHEN isnull(@StartDate,'')='' THEN CalendarDate
    ELSE isnull(@StartDate,'') END)                     
    AND Convert(DATETIME, CASE WHEN isnull(@EndDate,'')='' THEN CalendarDate 
    ELSE isnull(@EndDate,'') END)  
    
    /* this Line is commented....
    CalendarDate >= @StartDate
    AND CalendarDate <= @EndDate
    */
    
    ;WITH Sales AS
    (
        SELECT
            Sales.CurrencyKey,
            OrderId,
        FROM
            Fact.Sales
        WHERE   
            Sales.OrderDateKey = @StartDateKey
    ),
    
    Payments AS
    (
        SELECT
            Payments.PaymentCurrencyKey,
            PaymentID
        FROM    
            Payments
        WHERE
            AND Payment.DateKey >= @StartDateKey
            AND Payment.DateKey <= @EndDateKey
    )
    SELECT
        Sales.*,
        Payments.*,
        @StartDate AS 'StartDate',
        @EndDate AS 'EndDate'
    FROM
        Sales
        LEFT JOIN Payments
            ON Payments.PaymentCurrencyKey = Sales.CurrencyKey
    

    在您的第一个程序中...不要分配默认值...例如如果 你只输入@FromDate 然后它会自动选择最后一个 日期从你的桌子......

    例如。您的表格包含从 10 到 30 的日期范围......那么如果您输入 15 然后..它会自动选择 15 到 30 的日期范围数据...和 反之亦然@ToDate 也...

    注意:--你可以试试这个 Query...null 部分也是 Handle in Custom Date Range.....

    【讨论】:

      猜你喜欢
      • 2015-12-11
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 2019-10-01
      • 1970-01-01
      相关资源
      最近更新 更多