Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Триггер в таблице документа (число прочтений - 6915 )
SergeyN
Junior Member
**
Отсутствует


ПрограММист...

Сообщений: 35
Местоположение: Москва
Зарегистрирован: 05. Июня 2006
Пол: Мужской
Триггер в таблице документа
19. Сентября 2006 :: 06:31
Печать  
Коллеги, Помоги разобраться!

Я создал такой триггер

           |CREATE TRIGGER SpyForUzvwer
           |ON $Документ.Реализация
           |AFTER INSERT, UPDATE
           |AS
           |
           |SET NOCOUNT ON
           |
           |INSERT INTO $Справочник.РегистрацияДокументовДляВыгрузки
           |(ID,
           | DESCR,
           | ISMARK,
           | VERSTAMP, 
           | $Справочник.РегистрацияДокументовДляВыгрузки.ДатаИзменения,
           | $Справочник.РегистрацияДокументовДляВыгрузки.ДатаДок)
           |SELECT  (SELECT RIGHT('       ' + RTRIM(CAST(CASE WHEN MAX(Табл.Номер) IS NULL THEN 0 ELSE MAX(Табл.Номер) END + 1 AS varchar(6))) +
         |                  (SELECT DBSIGN from _1SSYSTEM), 9) FROM
           |                (SELECT REPLACE(ID, (SELECT DBSIGN from _1SSYSTEM), '') AS Номер FROM $Справочник.РегистрацияДокументовДляВыгрузки) AS Табл),
           |             Инсерт.IDDOC,
           |             0,
           |             0,
           |             Инсерт.ДатаИзменения,
           |             Инсерт.ДатаДокумента
           |FROM (SELECT REPLACE(Инсерт.IDDOC, ' ', '_') AS IDDOC,
           |                    GetDate() AS ДатаИзменения,
           |                    CAST(LEFT(Жур.DATE_TIME_IDDOC, 8) AS DATETIME) AS ДатаДокумента
           |            FROM INSERTED AS Инсерт
           |            INNER JOIN _1SjOURN AS Жур ON Инсерт.IDDOC = Жур.IDDOC
           |            LEFT OUTER JOIN $Справочник.РегистрацияДокументовДляВыгрузки AS Спр ON
           |             $Спр.ДатаИзменения = GetDate()
           |             AND $Спр.ДатаДок   = CAST(LEFT(Жур.DATE_TIME_IDDOC, 8) AS DATETIME)
           |             AND REPLACE(Инсерт.IDDOC, ' ', '_') = Спр.DESCR
           |            WHERE NOT ($Спр.ДатаИзменения = GetDate()
           |               AND $Спр.ДатаДок   = CAST(LEFT(Жур.DATE_TIME_IDDOC, 8) AS DATETIME)
           |               AND REPLACE(Инсерт.IDDOC, ' ', '_') = Спр.DESCR)
           |
           |) AS Инсерт
           |


Но у меня возникли несколько проблем:
1) Как преобразовать число в шестнадцатиричную систему счисления? Или может быть можно получить новый ID какой либо функцией непосредственно в SQL? Это нужно для создания нового элемента. Сейчас это делается такой вот функцией:

SELECT  (SELECT RIGHT('       ' + RTRIM(CAST(CASE WHEN MAX(Табл.Номер) IS NULL THEN 0 ELSE MAX(Табл.Номер) END + 1 AS varchar(6))) +
         |                  (SELECT DBSIGN from _1SSYSTEM), 9) FROM
           |                (SELECT REPLACE(ID, (SELECT DBSIGN from _1SSYSTEM), '') AS Номер FROM $Справочник.РегистрацияДокументовДляВыгрузки) AS Табл),

Но так он получает следующий по порядку номер + код базы.

2) Скажите УРИБ будет ли корректно работать при прямом создании элемента?

3) Я из триггера создаю новый элемент справочника - он прекрасносоздается, но при попытке вручную его отредактировать  пишет, что запись заблокирована.
  
Наверх
 
IP записан
 
SergeyN
Junior Member
**
Отсутствует


ПрограММист...

Сообщений: 35
Местоположение: Москва
Зарегистрирован: 05. Июня 2006
Пол: Мужской
Re: Триггер в таблице документа
Ответ #1 - 19. Сентября 2006 :: 06:55
Печать  
Хотел бы еще сюда добавить, если УРИБ работать корректно не будет - как зарегистрировать изменения вручную? Я сравнивал таблицы пустых баз, одна с урибом, другая нет. Различаются они на dbo._1SUPDTS, dbo._1SDWNLDS, dbo._1SDBSET таблицы
Надо думать в какой то из этих таблиц УРИБ изменения регистрирует?
  
Наверх
 
IP записан
 
1cvirus
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 89
Зарегистрирован: 24. Мая 2006
Re: Триггер в таблице документа
Ответ #2 - 19. Сентября 2006 :: 07:01
Печать  
http://argat.h11.ru/URBDStructure.html
это по поводу Цитата:
Надо думать в какой то из этих таблиц УРИБ изменения регистрирует?
  
Наверх
 
IP записан
 
SergeyN
Junior Member
**
Отсутствует


ПрограММист...

Сообщений: 35
Местоположение: Москва
Зарегистрирован: 05. Июня 2006
Пол: Мужской
Re: Триггер в таблице документа
Ответ #3 - 19. Сентября 2006 :: 07:17
Печать  
Отлично  Смех А покакому принципу формируется поле DWNLDID таблицы _1SUPDTS?
  
Наверх
 
IP записан
 
1cvirus
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 89
Зарегистрирован: 24. Мая 2006
Re: Триггер в таблице документа
Ответ #4 - 19. Сентября 2006 :: 07:31
Печать  
http://kb.mista.ru/article.php?id=45&edition=1
еще немного описания
  
Наверх
 
IP записан
 
SergeyN
Junior Member
**
Отсутствует


ПрограММист...

Сообщений: 35
Местоположение: Москва
Зарегистрирован: 05. Июня 2006
Пол: Мужской
Re: Триггер в таблице документа
Ответ #5 - 19. Сентября 2006 :: 07:48
Печать  
Спасибо!

А про хранимые процедуры, созданные 1С-ом где можно почитать? Меня интересует процедура, которая следующий ID на таблицу создает.. Наверняка что нить такое есть?
  
Наверх
 
IP записан
 
SergeyN
Junior Member
**
Отсутствует


ПрограММист...

Сообщений: 35
Местоположение: Москва
Зарегистрирован: 05. Июня 2006
Пол: Мужской
Re: Триггер в таблице документа
Ответ #6 - 19. Сентября 2006 :: 09:23
Печать  
Откопал таблицу _1SUIDCTL - в ней хранятся последний номер - скажите, как его преобразовать в следующий? Господа разработчики 1с++, наверняка вы ее использовали в GetNewID?
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Триггер в таблице документа
Ответ #7 - 19. Сентября 2006 :: 09:45
Печать  
SergeyN писал(а) 19. Сентября 2006 :: 07:48:
Меня интересует процедура, которая следующий ID на таблицу создает..

1. Накладывается TABLOCKX-блокировка на таблицу справочника;
2. Получает максимальное значение ID из таблицы _1SUIDCTL;
3. Получает максимальное значение ID из таблицы справочника;
4. Выбирается максимальный ID;
5. Инкремент ID;
6. Делается вставка строки в таблицу справочника;
7. Обновляется значение ID в таблице _1SUIDCTL;
8. Фиксируется транзакция;
  
Наверх
ICQ  
IP записан
 
SergeyN
Junior Member
**
Отсутствует


ПрограММист...

Сообщений: 35
Местоположение: Москва
Зарегистрирован: 05. Июня 2006
Пол: Мужской
Re: Триггер в таблице документа
Ответ #8 - 19. Сентября 2006 :: 09:59
Печать  
spock писал(а) 19. Сентября 2006 :: 09:45:
SergeyN писал(а) 19. Сентября 2006 :: 07:48:
Меня интересует процедура, которая следующий ID на таблицу создает..

1. Накладывается TABLOCKX-блокировка на таблицу справочника;
2. Получает максимальное значение ID из таблицы _1SUIDCTL;
3. Получает максимальное значение ID из таблицы справочника;
4. Выбирается максимальный ID;
5. Инкремент ID;
6. Делается вставка строки в таблицу справочника;
7. Обновляется значение ID в таблице _1SUIDCTL;
8. Фиксируется транзакция;



Так а в таблицу справочника он как попадет?
Я сам инсертом хочу записывать элемент справочника и мучаюсь с тем как получить следующий по значению ID.
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Триггер в таблице документа
Ответ #9 - 19. Сентября 2006 :: 10:32
Печать  
SergeyN писал(а) 19. Сентября 2006 :: 09:59:
Так а в таблицу справочника он как попадет?

Как следующий получается - написал.
Как ты будешь вставлять - личное дело.
1с-ка делает вставку через параметризированные запросы.
Проблема сделать инкремент или что?
  
Наверх
ICQ  
IP записан
 
SergeyN
Junior Member
**
Отсутствует


ПрограММист...

Сообщений: 35
Местоположение: Москва
Зарегистрирован: 05. Июня 2006
Пол: Мужской
Re: Триггер в таблице документа
Ответ #10 - 19. Сентября 2006 :: 10:36
Печать  
Проблема в том, что я не могу получить следующий уникальный код для таблицы. Т.е. получить текущий макс - естественно могу, а как получить следующий за ним в 36-ричной системе счисления?
  
Наверх
 
IP записан
 
SergeyN
Junior Member
**
Отсутствует


ПрограММист...

Сообщений: 35
Местоположение: Москва
Зарегистрирован: 05. Июня 2006
Пол: Мужской
Re: Триггер в таблице документа
Ответ #11 - 19. Сентября 2006 :: 10:36
Печать  
да. Получается, что проблема получить инкримент  Нерешительный ...
  
Наверх
 
IP записан
 
SergeyN
Junior Member
**
Отсутствует


ПрограММист...

Сообщений: 35
Местоположение: Москва
Зарегистрирован: 05. Июня 2006
Пол: Мужской
Re: Триггер в таблице документа
Ответ #12 - 19. Сентября 2006 :: 10:43
Печать  
Но ИД на один нужно увеличить именно в запросе. Незнаю как это сделать.
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Триггер в таблице документа
Ответ #13 - 19. Сентября 2006 :: 10:47
Печать  
Сделать свою udf-функцию, в которую запихать это:
http://www.sql.ru/forum/actualthread.aspx?tid=18777
  
Наверх
ICQ  
IP записан
 
SergeyN
Junior Member
**
Отсутствует


ПрограММист...

Сообщений: 35
Местоположение: Москва
Зарегистрирован: 05. Июня 2006
Пол: Мужской
Re: Триггер в таблице документа
Ответ #14 - 19. Сентября 2006 :: 11:02
Печать  
Огромное СПАСИБО!!!  Смех То, что надо.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать