Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) поможите с триггером на изменение таблички (число прочтений - 11097 )
skom
Junior Member
**
Отсутствует


"Hallo World"

Сообщений: 84
Местоположение: г.Кемерово
Зарегистрирован: 16. Января 2007
Пол: Мужской
поможите с триггером на изменение таблички
28. Декабря 2007 :: 03:55
Печать  
постоянно слетает последовательность по неизвестным причинам. в логе 1С нет никакой инфы у всех пользователей все обрублено по максимуму
написал такой триггер

CREATE TRIGGER MyTRIGGER ON _1SJOURN
After UPDATE
AS

DECLARE @User_1c as varchar(40)
DECLARE @newc datetime
DECLARE @dzr datetime
DECLARE @DTDoc datetime
DECLARE @IDDoc9 char(9)
SELECT @newc = GETDATE()
SELECT @User_1c = User_1c FROM dbo.users where PID = @@SPID --получим пользователя
-- установили формат даты по скулю
-- и получим дату запрета редактирования
SET DATEFORMAT dmy
Select @dzr = left(convert(datetime, value),8)  from _1SCONST
Where id = 27

SET NOCOUNT ON;

SELECT @IDDoc9 = IDDoc, @DTDoc = Left(Date_Time_IDDoc,8) From inserted

IF @DTDoc < @dzr

--rollback tran

INSERT INTO dbo.tr
     (UsersOfAction, TimeOfAction,IDDoc,SPID) values (@User_1c, @newc, @IDDoc9, @@spid)



вот данный триггер записывает в табличку инфу о том кто изменял журнал
но если в 1С используется Транзакция и в ней много доков тогда
пишется только последний док.
а как сделать так что бы в любом случае использовался весь перечень измененных доков
  

КонецЕсли;
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: поможите с триггером на изменение таблички
Ответ #1 - 28. Декабря 2007 :: 04:15
Печать  
Попробуй так:



INSERT INTO dbo.tr
     (UsersOfAction, TimeOfAction,IDDoc,SPID)  ( Select @User_1c, @newc, IDDoc, @@spid  From inserted)
правда может 1с заткнутся, но попробуй если не сработает напишешь предложу другой вариант
  
Наверх
ICQ  
IP записан
 
skom
Junior Member
**
Отсутствует


"Hallo World"

Сообщений: 84
Местоположение: г.Кемерово
Зарегистрирован: 16. Января 2007
Пол: Мужской
Re: поможите с триггером на изменение таблички
Ответ #2 - 28. Декабря 2007 :: 04:20
Печать  
он в инсерт инто не даеж конструкции типа @@spid и выражения какие то вставлять
  

КонецЕсли;
Наверх
ICQ  
IP записан
 
skom
Junior Member
**
Отсутствует


"Hallo World"

Сообщений: 84
Местоположение: г.Кемерово
Зарегистрирован: 16. Января 2007
Пол: Мужской
Re: поможите с триггером на изменение таблички
Ответ #3 - 28. Декабря 2007 :: 04:22
Печать  
о сорри разницу не заметил между тем как я пробовал и тем что ты предложил...счас попробую
  

КонецЕсли;
Наверх
ICQ  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: поможите с триггером на изменение таблички
Ответ #4 - 28. Декабря 2007 :: 04:26
Печать  
Штука в том, что Inserted  - это не обязательно одна строка. Это м.б. и таблица.  Т.е. я бы сказал так
Код
Выбрать все
INSERT INTO dbo.tr
     (UsersOfAction, TimeOfAction,IDDoc,SPID)
SELECT
     @User_1c, @newc, IDDoc
FROM
     Inserted
WHERE
     Left(Date_Time_IDDoc,8) < @dzr
  

  
Наверх
 
IP записан
 
skom
Junior Member
**
Отсутствует


"Hallo World"

Сообщений: 84
Местоположение: г.Кемерово
Зарегистрирован: 16. Января 2007
Пол: Мужской
Re: поможите с триггером на изменение таблички
Ответ #5 - 28. Декабря 2007 :: 04:38
Печать  
ADirks прикольно сработало...
тока записи через одну идут с пустым IDDoc и SPID не проставляется.
  

КонецЕсли;
Наверх
ICQ  
IP записан
 
skom
Junior Member
**
Отсутствует


"Hallo World"

Сообщений: 84
Местоположение: г.Кемерово
Зарегистрирован: 16. Января 2007
Пол: Мужской
Re: поможите с триггером на изменение таблички
Ответ #6 - 28. Декабря 2007 :: 04:39
Печать  
и еще вопрос. если я хочу отменить данную транзакцию то простой rollback тут подойдет?
  

КонецЕсли;
Наверх
ICQ  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: поможите с триггером на изменение таблички
Ответ #7 - 28. Декабря 2007 :: 04:55
Печать  
skom писал(а) 28. Декабря 2007 :: 04:38:
ADirks прикольно сработало...
тока записи через одну идут с пустым IDDoc и SPID не проставляется.

Видимо 1С пишет чего-то в _1SJourn с пустыми IDDoc.  Забавно...  Надо значит в условие добавить RTrim(IDDoc) != '' или IDDoc != $ПустойИД
Цитата:
... и SPID не проставляется

Это я просто в select-листе  @@spid  забыл  Улыбка
  
Наверх
 
IP записан
 
skom
Junior Member
**
Отсутствует


"Hallo World"

Сообщений: 84
Местоположение: г.Кемерово
Зарегистрирован: 16. Января 2007
Пол: Мужской
Re: поможите с триггером на изменение таблички
Ответ #8 - 28. Декабря 2007 :: 05:02
Печать  
тока что то из 1С стало выкидывать ругается на курсоры смещенные
  

КонецЕсли;
Наверх
ICQ  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: поможите с триггером на изменение таблички
Ответ #9 - 28. Декабря 2007 :: 05:02
Печать  
skom писал(а) 28. Декабря 2007 :: 04:39:
и еще вопрос. если я хочу отменить данную транзакцию то простой rollback тут подойдет?

1) Советую почитать BOL, раздел  triggers, rollbacks
2) Там много чего написано, и я лично не до конца понимаю, хотя всё по английски  Улыбка
Но вот видимо нужная выдержка
Цитата:
You must use the SAVE TRANSACTION statement to do a partial rollback in a trigger, even if it is always called in autocommit mode. This is illustrated by the following trigger:

CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS
SAVE TRANSACTION MyName
INSERT INTO TestAudit
   SELECT * FROM inserted
IF (@@error <> 0)
BEGIN
  ROLLBACK TRANSACTION MyName
END
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: поможите с триггером на изменение таблички
Ответ #10 - 28. Декабря 2007 :: 05:09
Печать  
skom писал(а) 28. Декабря 2007 :: 05:02:
тока что то из 1С стало выкидывать ругается на курсоры смещенные

Это после rollback, или просто при инсерте?
  
Наверх
ICQ  
IP записан
 
skom
Junior Member
**
Отсутствует


"Hallo World"

Сообщений: 84
Местоположение: г.Кемерово
Зарегистрирован: 16. Января 2007
Пол: Мужской
Re: поможите с триггером на изменение таблички
Ответ #11 - 28. Декабря 2007 :: 06:45
Печать  
Nick писал(а) 28. Декабря 2007 :: 05:09:
skom писал(а) 28. Декабря 2007 :: 05:02:
тока что то из 1С стало выкидывать ругается на курсоры смещенные

Это после rollback, или просто при инсерте?


rollback выключен
просто при инсерте

кстати вылетает когда в журнале документов меняешь активный док то есть просто при переходе на новый док
а если закрыть журнал и снова открыть тогда нормально
хотя вру это у меня происходило с доками когда я изменял триггер при включенной базе 1С
  

КонецЕсли;
Наверх
ICQ  
IP записан
 
skom
Junior Member
**
Отсутствует


"Hallo World"

Сообщений: 84
Местоположение: г.Кемерово
Зарегистрирован: 16. Января 2007
Пол: Мужской
Re: поможите с триггером на изменение таблички
Ответ #12 - 28. Декабря 2007 :: 06:47
Печать  
ADirks писал(а) 28. Декабря 2007 :: 05:02:
skom писал(а) 28. Декабря 2007 :: 04:39:
и еще вопрос. если я хочу отменить данную транзакцию то простой rollback тут подойдет?

1) Советую почитать BOL, раздел  triggers, rollbacks
2) Там много чего написано, и я лично не до конца понимаю, хотя всё по английски  Улыбка
Но вот видимо нужная выдержка
Цитата:
You must use the SAVE TRANSACTION statement to do a partial rollback in a trigger, even if it is always called in autocommit mode. This is illustrated by the following trigger:

CREATE TRIGGER TestTrig ON TestTab FOR UPDATE AS
SAVE TRANSACTION MyName
INSERT INTO TestAudit
  SELECT * FROM inserted
IF (@@error <> 0)
BEGIN
 ROLLBACK TRANSACTION MyName
END


не совсесм понял (с англицким тож гуд)
тут он откатит транзакцию по вставке в мою таблицу или ту которая привела к изменениям и срабатыванию триггера???
в скуле я не особо силен пока

вчера тестировал на первоначальном варианте триггера и там стоял простой роллбэк
в итоге тот документ который я пытался изменить/провести/отменить проведение отменялся полностью....затем я проверял он отменил только в 1СДЖОРН - оказалось нет
все регистры тоже отменились то есть в отчетах все осталось по прежнему все движения старые. пытаешься провести док непроведенный - 1с-ка типа проводит док но в журнале он стоит непроведенный.....
но один момент огорчил....этот док все же регистрируется в таблице для урбд выгрузки и пытаясь удалить записи по данному IDDoc в этом триггере она не удаляется...я подумал может в УРБД табличку регится после ...то енсть на момент срабатывания триггера в таблице для УРБД еще нет этих записей и они генерятся туда потом
  

КонецЕсли;
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: поможите с триггером на изменение таблички
Ответ #13 - 28. Декабря 2007 :: 09:41
Печать  
Так нужно видимо триггер и на таблицу апдейтов, зачем искать то чего нет?

Ты задай тут вопрос который на мисте обсуждали - проведение/запись доков в транзакции 1С (при этом в толпе доков есть пара плохих)
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: поможите с триггером на изменение таблички
Ответ #14 - 28. Декабря 2007 :: 09:47
Печать  
Цитата:
Так нужно видимо триггер и на таблицу апдейтов, зачем искать то чего нет?

Ты задай тут вопрос который на мисте обсуждали - проведение/запись доков в транзакции 1С (при этом в толпе доков есть пара плохих)

Что есть таблица "апдейтов"?  в тригере FOR UPDATE только две системных таблицы - inserted  и deleted
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать