Пользовательский параметр диапазона дат ИЛИ предварительно определенная дата из выпадающего списка в SSRS - PullRequest
0 голосов
/ 23 сентября 2019

Я разрабатываю отчет SSRS в MSvs, который позволяет 2 различных выбора даты.

Одним из вариантов является выбор пользовательского диапазона дат с использованием параметров StartDate и EndDate (выбрано значение NULL).

Другой вариант - выбрать предварительноопределенный набор дат, перечисленных в раскрывающемся списке, который также может быть NULL, выбрав «Выбрать пользовательский».

У меня есть 2 набора данных, оба из которых являются хранимыми процедурами на SQL-сервере.Один из них - мой основной набор данных, а другой - CalendarRanges, где я определил предварительно определенные диапазоны дат следующим образом:

  • CurrentWeek
  • PreviousWeek
  • CurrentMonth
  • Пользовательский

Я полностью выделил свой код, чтобы привести пример.

Основная хранимая процедура набора данных:

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

Запуск иКонечные даты связаны с моими параметрами @StartDate и @EndDate в SSRS.

Набор данных 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, затем используйте вместо этого параметр раскрывающегося списка, но я изо всех сил пытаюсь понять, как это реализовать?

1 Ответ

0 голосов
/ 23 сентября 2019

Вы можете изменить некоторую логику в вашей процедуре ... это может помочь вам ...

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 ... нулевая часть также обрабатывается в пользовательском диапазоне дат .....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...