CREATE TABLE test_source
(
InDateTime datetime NOT NULL,
comment varchar(255) NOT NULL
)
INSERT INTO test_source
VALUES
('2019-11-05 13:29:20.883', 'Закрыт: А'),
('2019-11-05 13:36:57.860', 'Закрыт: Б'),
('2019-11-05 13:39:56.627', 'Закрыт: В'),
('2019-11-05 13:47:37.780', 'Закрыт: Г'),
('2019-11-05 13:48:55.977', 'Закрыт: Д'),
('2019-11-05 13:52:09.550', 'Закрыт: Е'),
('2019-11-05 13:55:08.767', 'Закрыт: Ж')
CREATE TABLE test_dest
(
Filial nvarchar(1) NOT NULL,
InDateTime datetime NULL,
Status bit NULL
)
INSERT INTO test_dest
VALUES
('Ж', '2019-11-05 13:55:08.767', 0),
('Д', '2019-11-05 13:48:55.977', 0),
('Б', '2019-11-05 13:36:57.860', 0),
('В', '2019-11-05 13:39:56.627', 0),
('Г', '2019-11-05 13:47:37.780', 0),
('А', '2019-11-05 13:29:20.883', 0),
('Е', '2019-11-05 13:52:09.550', 0)
-------------------------------------------------
Для процесса разработал алгоритм. Все идет по плану до тех пор пока я не появляется предпоследняя новая дата. - процесс ее обновляет и простовляет статус 1 - вроде бы все в порядке - но если перезапустить процесс еще, когда еще не появилась самая последняя новая дата он обнуляет статусы на 0. Такого не происходит если обновились только 5 дат. Проблемы начинаются когда обновились 6 дат и остается 1 не обновленная - как будто бы уже появилась и 7мая.
Подскажите, пожалуйста, в чем ошибка.
Для проерки просто вставляю поочереди в ставляю поочереди новую дату в таблицу test_source посредством замены ('Ж', '2019-11-05 13:55:08.767', 0) на ('Ж', '2019-11-05 [b]14[/b]:55:08.767', 0) и нажимаю EXECUTE и так поочереди, пока не дохожу до 6ой даты.
Заранее благодарен за помощь.
BEGIN
DECLARE @day_of_week nvarchar(8)
DECLARE @Status INT
DECLARE @Error nvarchar(80)
DECLARE @Filial nvarchar(8)
DECLARE @InDateTime datetime
DECLARE @InDateTime_Source datetime
DECLARE @Endlich nvarchar(80)
IF OBJECT_ID('tempDB..#test_Source') IS NOT NULL
DROP TABLE #test_Source
SELECT TOP (5000) InDateTime, Comment
INTO #test_Source
FROM test_source
ORDER BY InDateTime DESC
IF OBJECT_ID('tempDB..#test_Source2') IS NOT NULL
DROP TABLE #test_Source2
SELECT InDateTime, SUBSTRING(Comment, 9, 1) AS Filial
INTO #test_Source2
FROM #test_Source
WHERE comment LIKE '%закрыт%'
--0--Проверим текущий день недели, так как только в понедельник закрытие и за пятницу и за субботу
SET @day_of_week = (SELECT
CASE DATEDIFF(DAY,0, GETDATE())%7
WHEN 0 THEN 'Monday'
WHEN 1 THEN 'Tuesday'
WHEN 2 THEN 'Wednesday'
WHEN 3 THEN 'Thursday'
WHEN 4 THEN 'Friday'
WHEN 5 THEN 'Saturday'
WHEN 6 THEN 'Sunday'
END [День недели])
DECLARE fcursor CURSOR FOR
SELECT [Filial],
[InDateTIme],
[Status]
FROM test_dest
OPEN fcursor
FETCH NEXT FROM fcursor INTO @Filial,
@InDateTime,
@Status
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF @day_of_week IN ('monday')
BEGIN
SET @Status = (SELECT Status FROM test_dest WHERE Filial = @Filial)
SET @InDateTime_Source = (SELECT MAX(s.InDateTime)
FROM #test_Source2 s
LEFT JOIN test_dest d ON s.Indatetime = @indatetime
WHERE s.filial = @filial
AND s.Indatetime > @indatetime)
IF @InDateTime_Source IS NULL AND @Status = 1
BEGIN
SET @Error = 'филиал ' + @Filial + ' был закрыт ранее'
RAISERROR (@Error, 16, 1)
END
ELSE
BEGIN
IF @InDateTime_Source IS NOT NULL AND @Status != 1
BEGIN
UPDATE test_dest
SET InDateTime = @InDateTime_Source,
Filial = @Filial,
[Status] = 1
WHERE Filial = @Filial
SET @Error = 'филиал ' + @Filial + ' только что обновлен'
PRINT @error
END
END
END
FETCH NEXT FROM fcursor INTO @Filial,
@InDateTime,
@Status
END
CLOSE fcursor
DEALLOCATE fcursor
IF @Status = 1
BEGIN
PRINT 'Последний Филиал закрыт, статусы закрытия выставлены в положение 0'
UPDATE test_dest
SET Status = 0
WHERE Status = 1
END
ELSE
BEGIN
RAISERROR ('не все филиалы обновлены', 16 , 1)
END
END
|