Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Корректность работы триггера
|
|||
|---|---|---|---|
|
#18+
вопрос в следующем: есть две таблицы Ostatok(хранятся остатки) Rashod(храняться строчки расходных накладных) есть триггер на after insert в Rashod который правит остатки так вот, иногда вот такие строчи: .... update Ostatok set Ostatok.Kol = isnull(Ostatok.Kol,0)-new_name.Kol where (Ostatok.TovarNo = new_name.TovarNo) and (Ostatok.PriceIn = new_name.PriceIn) and (Ostatok.SkladNo = @SkladNo) .... прописывают в остатки количество которое пошло в расход с "-" то есть Ostatok.kol="-Rashod.kol", хотя на остатках АБСОЛЮТНО ТОЧНО есть определенное количество, тое сть строчка Ostatok.Kol = isnull(Ostatok.Kol,0)-new_name.Kol срабатывает вот так: Ostatok.Kol =0 - new_name.Kol. как это бороть или вернее что я делаю неправильно? P.S. такое срабатывает очень редко, НО СРАБАТЫВАЕТ rashod - порядка 600000 записей, ежедневно + 1000-2000 ostatok - порядка 100000 записей в основном update asa 9.04 3141 (на седьмой во всех ипостасях та же песня была, как и на 9 впрочем...) спасибо что прочитали... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 12:16 |
|
||
|
Корректность работы триггера
|
|||
|---|---|---|---|
|
#18+
Последний билд ASA 9.0.2.3131. Откуда у Вас такой билд, которого нет в природе ? По сабжу - приведите пожалуйста полный текст триггера, плюс укажите, существуют ли триггера на обновление и удаление записей в расходе, есть ли триггера на остатки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 12:36 |
|
||
|
Корректность работы триггера
|
|||
|---|---|---|---|
|
#18+
Ладно, с билдом промазал, писал по памяти второе тригера есть в rashod(e) и на insert и на delete и на update (код приблизительно один и тот же) в остатке тригеров нет текс тригера - легко...но..смысл? ALTER TRIGGER "Rashod_Insert".Rashod_Insert before insert order 1 on DBA.Rashod referencing new as new_name for each row begin declare @Buh smallint; declare @SkladNo integer; // select NaklR.Buh,NaklR.SkladNo into @Buh, @SkladNo from NaklR where NaklR.NaklNo = new_name.NaklNo; // if exists(select * from Ostatok where Ostatok.TovarNo = new_name.TovarNo and Ostatok.PriceIn = new_name.PriceIn and Ostatok.SkladNo = @SkladNo) then if @Buh < 3 then update Ostatok set Ostatok.Kol = isnull(Ostatok.Kol,0)-new_name.Kol where (Ostatok.TovarNo = new_name.TovarNo) and (Ostatok.PriceIn = new_name.PriceIn) and (Ostatok.SkladNo = @SkladNo) end if; if @Buh > 1 then update Ostatok set Ostatok.KolBuh = isnull(Ostatok.KolBuh,0)-new_name.Kol where (Ostatok.TovarNo = new_name.TovarNo) and (Ostatok.PriceIn = new_name.PriceIn) and (Ostatok.SkladNo = @SkladNo) end if else if @Buh = 1 then insert into Ostatok( TovarNo,PriceIn,Kol,KolBuh,SkladNo) values( new_name.TovarNo,new_name.PriceIn,-new_name.Kol,0,@SkladNo) elseif @Buh = 2 then insert into Ostatok( TovarNo,PriceIn,Kol,KolBuh,SkladNo) values( new_name.TovarNo,new_name.PriceIn,-new_name.Kol,-new_name.Kol,@SkladNo) elseif @Buh = 3 then insert into Ostatok( TovarNo,PriceIn,Kol,KolBuh,SkladNo) values( new_name.TovarNo,new_name.PriceIn,0,-new_name.Kol,@SkladNo) end if end if end ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 13:30 |
|
||
|
Корректность работы триггера
|
|||
|---|---|---|---|
|
#18+
Ищите, явно ошибка в логике, слишком она ветвящеяся. Из за этого возможны ошибки в логике. Плюс я хотел бы порекомендовать рассмотреть в логике следующие вещи: 1. Насколько целесообразно хранить в разных полях суммы остатков в зависимости от флага. Может быть легче в таблице остатков просто сделать поля Сумма и Тип и хранить на каждый тип запись, а не поле. 2. Вместо IF EXISTS ... UPDATE ... ELSE INSERT ... END IF лучше использовать просто INSERT ... ON EXISTING UPDATE 3. В любом случае как в тригере INSERT идет вычитание новой суммы, в триггере UPDATE вычитание разницы между новым и старым значение суммы, в триггере DELETE прибавление удаляемой суммы к остаткам. Соотвествующе легче логику обновления остатков вынести в отдельную ХП, в которую параметрами передавать идентефикаторы остатка и прибавляемую к нему сумму. Тогда триггеры просто будут ее вызывать, передавая соотвествующие параметры, код не будет дублироваться, легче сопровождаться и станет намного читабельней и понятнее. Скорее всего с вышеперечисленными рекомендациями изчезнет и ошибка, так как очень мало шансов, что в этом хоть как то виновата сама ASA. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 13:55 |
|
||
|
Корректность работы триггера
|
|||
|---|---|---|---|
|
#18+
Мысли конечно хорошие, правильные...ыозможно даже поможет, но что то меня гложжут сомнения что в тригере вызывать ХП будет быстрее чем отработает сам тригер с тем же телом грубо говоря... on existing update это мысль спасибо, сам думал но ТАК не охота переписывать триггера... возможно ли что таблица остатков как то лочится и значение теряется? (бредачек...) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2005, 14:25 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=33130897&tid=2013575]: |
0ms |
get settings: |
11ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 258ms |
| total: | 362ms |

| 0 / 0 |
