Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Распределение документов по времени (число прочтений - 2356 )
slider26
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 256
Зарегистрирован: 01. Июня 2006
Распределение документов по времени
26. Декабря 2006 :: 04:35
Печать  
Столкнулся с такой проблемой - В начале операционного дня пользователь "Догадался" провести документ и двинуть ТА на полдвенадцатого вечера... Печаль Это было замечено только тогда, когда все документы начали записываться на 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;
 


  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Распределение документов по времени
Ответ #1 - 26. Декабря 2006 :: 10:26
Печать  
Если используется компонента "бух. учет", то там это поле называется DATE_TIME_DOCID.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
slider26
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 256
Зарегистрирован: 01. Июня 2006
Re: Распределение документов по времени
Ответ #2 - 27. Декабря 2006 :: 03:49
Печать  
berezdetsky писал(а) 26. Декабря 2006 :: 10:26:
Если используется компонента "бух. учет", то там это поле называется DATE_TIME_DOCID.

Этот кусок кода и её обработает Улыбка
Код
Выбрать все
--Получаем список таблиц и полей, где есть ссылки на 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%'
 

  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Распределение документов по времени
Ответ #3 - 27. Декабря 2006 :: 09:06
Печать  
Ага. Торможу.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
slider26
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 256
Зарегистрирован: 01. Июня 2006
Re: Распределение документов по времени
Ответ #4 - 28. Декабря 2006 :: 02:31
Печать  
Кстати, скрипт для УРБД нужно дорабатывать - нет записи в _1SUpdts
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать