2015-07-24 1 views
2

У меня есть требование в соответствии с приведенным ниже бизнес-правилом для изменения запланированной даты поставки в отчете. Ниже приведен DDL:T-sql помогает переключать даты в отчете SSRS

1) Если задание имеет номер партии, дата отправки запланированного отправления будет следующей понедельника на запрошенную дату поставки. Скажем, например, если задание имеет запрашиваемую дату поставки в формате 2015-07-29, а также номер партии, а затем запланированная дата отправки - 2015-08-03.

2) Если в задании нет номера партии, то Дата отправки по расписанию будет в понедельник до даты доставки. Скажем, например, если задание Jимеет запрашиваемую дату поставки в формате 2015-08-04, и у него нет номера партии, тогда запланированная дата отправки будет в понедельник до i.e 2015-08-04.

Аналогичным образом, если запрашиваемая дата доставки - 2015-08-07, и у нее нет номера партии, тогда запланированная дата поставки будет равна 2015-08-03.

Можем ли мы достичь этого? Я ценю любую помощь по этому поводу.

Надеется, что это помогает

Вот DDL:

DECLARE @Date datetime; 
SET @Date = GETDATE(); 

DECLARE @TEST_DATA TABLE 
(
    DT_ID INT  IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED 
    ,JobNumber  VARCHAR(10) NOT NULL 
    ,JobStatus  CHAR(1)  NOT NULL 
    ,ExpectedDate VARCHAR(10) NOT NULL 
    ,LastShippedDate VARCHAR(10)  NULL 
    ,BatchNumber VARCHAR(10)   NULL 
); 

INSERT INTO @TEST_DATA (JobStatus, JobNumber,ExpectedDate,LastShippedDate, BatchNumber) 
VALUES 
('S', 'J','2015-07-10','2015-07-10', 'B001') 
,('S', 'J','2015-07-15','2015-07-17', 'B001') 
,('S', 'J','2015-07-17','2015-07-15', 'B002') 
,('S', 'J','2015-07-08','2015-07-10', 'B002') 
,('O', 'J','2015-08-04',NULL, NULL) 
,('O', 'J','2015-07-24',NULL, 'B003') 
,('O', 'J','2015-07-31',NULL, 'B003') 
,('O', 'J','2015-07-27',NULL, 'B004') 
,('O', 'J','2015-07-21',NULL, 'B004') 
,('O', 'J','2015-07-31',NULL, NULL) 
,('O', 'J','2015-08-07',NULL, NULL) 
,('O', 'J','2015-08-14',NULL, NULL) 
,('O', 'J','2015-08-28',NULL, 'B004') 
,('O', 'J','2015-07-22',NULL, 'B005') 
,('O', 'J','2015-07-24',NULL, NULL) 
,('O', 'J','2015-07-31',NULL, NULL) 
,('O', 'J','2015-08-21',NULL, 'B006') 
,('O', 'J','2015-07-27',NULL, 'B007') 
,('O', 'J','2015-07-29',NULL, 'B008') 
,('O', 'J','2015-08-11',NULL, NULL) 
,('O', 'J','2015-07-30',NULL, NULL) 
,('O', 'J','2015-09-18',NULL, 'B006') 
; 

SELECT 
    J.DT_ID 
    ,JobNumber 
    ,J.JobStatus /*O-Open, S-Shipped, I-Invoiced*/ 
    ,J.ExpectedDate 'Requested Delivery Date' 
    ,J.LastShippedDate 
    , BatchNumber 
    ,CASE 
     /* SHIPPED - SHOW LastShippedDate */ 
     WHEN j.JobStatus ='S' OR j.JobStatus ='I' OR j.JobStatus ='V' THEN Cast(j.LastShippedDate as DATE) 
     /* MISSED SHIPMENT SET TO NEXT MONDAY */ 
     WHEN j.JobStatus <>'S' AND DATEDIFF(dd,0,ExpectedDate)/7 <= DATEDIFF(dd,0,@Date)/7 THEN 
      DATEADD(DAY,((DATEDIFF(dd,0,@Date)/7) * 7) + 7,0) 
     /* FUTURE SHIPMENTS */ 
     --ELSE CAST(J.ExpectedDate AS DATE) 
     ELSE DATEADD(DAY,((DATEDIFF(dd,0,J.ExpectedDate)/7) * 7) + 7,0) 
    END AS [Scheduled Ship Date], 

    DATENAME(dw, J.ExpectedDate) AS ExpectedDateDayName, 
    DATENAME(dw, CASE 
      WHEN j.JobStatus ='S' OR j.JobStatus ='I' OR j.JobStatus ='V' THEN Cast(j.LastShippedDate as DATE) 
      WHEN j.JobStatus <>'S' AND DATEDIFF(dd,0,ExpectedDate)/7 <= DATEDIFF(dd,0,@Date)/7 THEN 
       DATEADD(DAY,((DATEDIFF(dd,0,@Date)/7) * 7) + 7,0) 
      --ELSE CAST(J.ExpectedDate AS DATE) 
      ELSE DATEADD(DAY,((DATEDIFF(dd,0,J.ExpectedDate)/7) * 7) + 7,0) 
     END) AS ScheduledShipDateDayName 

FROM @TEST_DATA AS J 
ORDER BY [Requested Delivery Date] 
+0

Очки для показа кода. Итак, если у него есть пакетное число, это будет отправлено в понедельник после запрашиваемой даты доставки? Так поздно..? –

+0

@Holmes IV-Да, если у него есть номер партии. Запланированная дата доставки будет следующей с понедельника до требуемой даты поставки. Если задание не имеет номера партии. Запланированная дата доставки покажет понедельник до Запрошенной даты поставки. Надеюсь это поможет. Спасибо – LearningMacro

+0

Что не так с кодом, который у вас есть? Вы получаете сообщение об ошибке? –

ответ

1

Таким образом, вы пытаетесь найти «следующий понедельник», если это не партия, и если есть один предыдущий понедельник на запрос дата:

Select Case when BatchNumber is not null then 
       case when datepart(dw,J.ExpectedDate) > 1 then DATEADD(dd,9-DATEPART(dw,J.ExpectedDate),J.ExpectedDate) 
        else DATEADD(dd,1,J.ExpectedDate) end 
     Else dateadd(ww,-2, case when datepart(dw,J.ExpectedDate) > 1 then DATEADD(dd,9-DATEPART(dw,J.ExpectedDate),J.ExpectedDate) 
       else DATEADD(dd,1,J.ExpectedDate) end) end AS [Scheduled Ship Date] 


FROM @TEST_DATA AS J 
+0

-Для этого номера задания (, ('O', 'J', '2015-08-28', NULL, 'B004')) Я получаю ScheduledShipDate как 2015-08-31 вместо 2015-08-24. Любые входы? Спасибо – LearningMacro

+0

странно, я не знаю, почему, это должно быть с концом месяца. * Заметьте, я просто исправляю некоторые математические результаты. –