Столкнулся с такой проблемой - В начале операционного дня пользователь "Догадался" провести документ и двинуть ТА на полдвенадцатого вечера...
Это было замечено только тогда, когда все документы начали записываться на 23:59:59, а так как используется проведение документов в реальном времени, работа встала...
По некоторым причинам, распроведение документов в базе недопустимо. В результате исследования форума, и документации
был написан универсальный скрипт распределения документов по времени. Большая просьба посмотреть и высказатся - не забыл ли я чего
PS:Скрипт не двигает ТА и не пересчитывает итоги...
set nocount on
DECLARE @ProcDate varchar(8), @CurDocTime Int, @Delta Int
SET @CurDocTime = -1 --Время первого документа в 0.1 МСек от начала дня (если -1, используется время первого документа)
SET @ProcDate = '20061225' --Дата изменения времени документов
SET @Delta = 10000 --Приращение времени для каждого последующего документа в 0.1 МСек
DECLARE @IDDOC varchar(9), @DT varchar(8), @TM varchar(6), @NewDateTimeIDDoc varchar(23), @OldDateTimeIDDoc varchar(23)
DECLARE @Arr36 CHAR(36)
SET @Arr36 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
DECLARE @Res36 CHAR(9)
DECLARE @Deci INT
DECLARE @j INT
DECLARE @Col varchar(80), @Tbl varchar(80)
--Формируем таблицу с новыми и старыми значениями поля DATE_TIME_IDDOC
if exists(select * from tempdb..sysobjects where id = object_id('tempdb..#Docs')) DROP TABLE #Docs
Select Left(DATE_TIME_IDDOC,8) as DT, RIGHT(Left(DATE_TIME_IDDOC,14),6) as TM, Right(DATE_TIME_IDDOC,9) as IDDOC, DATE_TIME_IDDOC as DTI, DATE_TIME_IDDOC as DTI_New, 864000000 as DecTM_New
Into #Docs
from _1SJourn
WHERE Left(DATE_TIME_IDDOC,8) = @ProcDate
DECLARE Docs_cursor CURSOR FOR
SELECT DT, TM, IDDOC, DTI
FROM #Docs
OPEN Docs_cursor
FETCH NEXT FROM Docs_cursor
INTO @DT, @TM, @IDDOC, @OldDateTimeIDDoc
IF (@CurDocTime = -1)
BEGIN
SET @Deci = 0
SET @j = 1
while @j <= LEN(LTRIM(RTRIM(@TM)))
begin
if @j <> 1
SET @Deci = @Deci*36
SET @Deci = @Deci + CHARINDEX(SUBSTRING(LTRIM(RTRIM(@TM)), @j,1),@Arr36) -1
SET @j = @j+1
end
SET @CurDocTime = @Deci
END
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Deci = @CurDocTime
SET @Res36 = ''
SET @j = LOG(@Deci)/LOG(36) +1
while @j>0
begin
SET @Res36 = LTRIM(RTRIM(@Res36)) + SUBSTRING(@Arr36, @Deci/POWER(36,@j-1) +1 ,1)
SET @Deci = @Deci%POWER(36,@j-1)
SET @j =@j-1
end
SET @NewDatetimeIDDoc = @DT + Right(' '+RTRIM(LTRIM(@Res36)),6) + @IDDOC
Update #Docs
SET #Docs.DTI_New = @NewDatetimeIDDoc,
#Docs.DecTM_New = @CurDocTime
Where #Docs.DTI = @OLDDateTimeIDDoc
SET @CurDocTime = @CurDocTime + @Delta
FETCH NEXT FROM Docs_cursor
INTO @DT, @TM, @IDDOC, @OldDateTimeIDDoc
END
CLOSE Docs_cursor
DEALLOCATE Docs_cursor
--Получаем список таблиц и полей, где есть ссылки на DATE_TIME_IDDOC
if exists(select * from tempdb..sysobjects where id = object_id('tempdb..#ProcTables')) DROP TABLE #ProcTables
Select c.name as Col, t.name as Tbl
Into #ProcTables
From syscolumns as c
Join sysobjects as t
on c.id = t.id
Where c.name like '%date_time%'
--Обрабатываем документы
DECLARE Docs_cursor CURSOR FOR
SELECT DTI, DTI_New, DecTM_New, IDDOC
FROM #Docs
DECLARE Table_cursor CURSOR FOR
SELECT Col, Tbl
FROM #ProcTables
OPEN Docs_cursor
FETCH NEXT FROM Docs_cursor
INTO @OldDateTimeIDDoc, @NewDateTimeIDDoc, @CurDocTime, @IDDOC
WHILE @@FETCH_STATUS = 0
BEGIN
Update _1SConst
SET _1SConst.TIME = @CurDocTime
Where _1SConst.DOCID = @IDDOC
-- Update _1SJourn, _1SCRDoc, _1SStream, _RAXXX
OPEN Table_cursor
FETCH NEXT FROM Table_cursor
INTO @Col, @Tbl
WHILE @@FETCH_STATUS = 0
BEGIN
exec('Update '+@Tbl+' SET '+@Tbl+'.'+@Col+' = '''+@NewDatetimeIDDoc+''''+' Where '+@Tbl+'.'+@Col+' = '''+@OLDDateTimeIDDoc+'''')
FETCH NEXT FROM Table_cursor
INTO @Col, @Tbl
END
CLOSE Table_cursor
FETCH NEXT FROM Docs_cursor
INTO @OldDateTimeIDDoc, @NewDateTimeIDDoc, @CurDocTime, @IDDOC
END
CLOSE Docs_cursor
DEALLOCATE Docs_cursor
DEALLOCATE Table_cursor
--Select * from #Docs
DROP TABLE #ProcTables
DROP TABLE #Docs
set nocount off;