powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Корректность работы триггера
5 сообщений из 5, страница 1 из 1
Корректность работы триггера
    #33130897
wados
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вопрос в следующем:
есть две таблицы 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 впрочем...)
спасибо что прочитали...
...
Рейтинг: 0 / 0
Корректность работы триггера
    #33130964
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Последний билд ASA 9.0.2.3131. Откуда у Вас такой билд, которого нет в природе ?

По сабжу - приведите пожалуйста полный текст триггера, плюс укажите, существуют ли триггера на обновление и удаление записей в расходе, есть ли триггера на остатки.
...
Рейтинг: 0 / 0
Корректность работы триггера
    #33131161
wados
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ладно, с билдом промазал, писал по памяти
второе тригера есть в 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
...
Рейтинг: 0 / 0
Корректность работы триггера
    #33131231
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ищите, явно ошибка в логике, слишком она ветвящеяся. Из за этого возможны ошибки в логике. Плюс я хотел бы порекомендовать рассмотреть в логике следующие вещи:
1. Насколько целесообразно хранить в разных полях суммы остатков в зависимости от флага. Может быть легче в таблице остатков просто сделать поля Сумма и Тип и хранить на каждый тип запись, а не поле.
2. Вместо IF EXISTS ... UPDATE ... ELSE INSERT ... END IF лучше использовать просто INSERT ... ON EXISTING UPDATE
3. В любом случае как в тригере INSERT идет вычитание новой суммы, в триггере UPDATE вычитание разницы между новым и старым значение суммы, в триггере DELETE прибавление удаляемой суммы к остаткам. Соотвествующе легче логику обновления остатков вынести в отдельную ХП, в которую параметрами передавать идентефикаторы остатка и прибавляемую к нему сумму. Тогда триггеры просто будут ее вызывать, передавая соотвествующие параметры, код не будет дублироваться, легче сопровождаться и станет намного читабельней и понятнее.
Скорее всего с вышеперечисленными рекомендациями изчезнет и ошибка, так как очень мало шансов, что в этом хоть как то виновата сама ASA.
...
Рейтинг: 0 / 0
Корректность работы триггера
    #33131341
wados
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мысли конечно хорошие, правильные...ыозможно даже поможет, но что то меня гложжут сомнения что в тригере вызывать ХП будет быстрее чем отработает сам тригер с тем же телом грубо говоря...
on existing update это мысль спасибо, сам думал но ТАК не охота переписывать триггера...
возможно ли что таблица остатков как то лочится и значение теряется? (бредачек...)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Корректность работы триггера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]