Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Никто не подскажет, в чем здесь логическая ошибка? [D6]


Страницы:   1 2

}|{yk ©   (2004-02-19 16:57:00) 

Триггер записывает не необходимое значение, а затирает текущее
CREATE OR REPLACE TRIGGER APP_BANK_A_INSERT
BEFORE
INSERT
ON APP_BANK
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
declare
begin
   update app_plateg set app_plateg.summa_free=app_plateg.summa_free-:new.summa where app_plateg.plat_id=:new.plat_id;
end;
/
Он должен при добавлении записи в таблицу app_bank уменьшать на соответствующее значение поле summ_free в таблице app_plateg/ Но вместо этого он затирает значение в этом поле. В чем глюк?


Val   (2004-02-19 18:09:00) [1]

мда.ясно.


}|{yk   (2004-02-19 18:07:00) [2]

В описании базы (документик такой у нас программеры баз пишут а потом передают их программерам GUI)


Guest   (2004-02-19 18:05:00) [3]

[21] }|{yk ©   (19.02.04 18:03)

Так как насчет пива за наши с RME мучения? :))))


Val   (2004-02-19 18:04:00) [4]

где было написано?


}|{yk   (2004-02-19 18:03:00) [5]

Сорри
В базе был еще один триггер  (базу делал не я), который хотя и было написано что делает обновление, на деле стоял на вставку. Потому и затиралось
Вот его код
declare
 summ number;
 summ_plateg number;
begin
 select a.summa_free into summ_plateg from app_plateg a where a.plat_id=:new.plat_id;
 summ:=summ_plateg-:old.summa+:new.summa;
   update app_plateg set app_plateg.summa_free=summ where app_plateg.plat_id=:new.plat_id;
end;


Guest   (2004-02-19 18:01:00) [6]

>Во время выполнения триггера app_plateg.summa_free - null, хотя он точно не пустой

Как проверял?
select summa_free from ... что возвращает?
select count(*) into ... from .. where summa_free IS NULL что возвращает?

ЗЫ. О пиве потом поговорим :)


}|{yk   (2004-02-19 17:59:00) [7]

С тебя пиво!
Конечно восстанавливаю


}|{yk   (2004-02-19 17:57:00) [8]

Мдя...

declare
begin
 update app_plateg set app_plateg.summa_free=:new.summa where app_plateg.plat_id=:new.plat_id;
end;

Во время выполнения триггера app_plateg.summa_free - null, хотя он точно не пустой. Не ясно...


Guest   (2004-02-19 17:55:00) [9]

[15] }|{yk ©   (19.02.04 17:52)

Вы после затирания информации в таблице от неправильного срабатывания триггера данные восстанавливаете перед новым запуском?
Держу пари, что нет :)


Guest   (2004-02-19 17:52:00) [10]

[12] Reindeer Moss Eater ©   (19.02.04 17:49)

Судя по в поле заносится -:new.summaNULL у него именно summa_free из таблицы


}|{yk   (2004-02-19 17:52:00) [11]

как она м.б. null если написав
declare

begin
  update app_plateg set app_plateg.summa_free=:new.summa where app_plateg.plat_id=:new.plat_id;
end;

я получаю в app_plateg.summa_free :new.summa


Reindeer Moss Eater   (2004-02-19 17:51:00) [12]

CREATE OR REPLACE TRIGGER APP_BANK_A_INSERT
BEFORE
INSERT
ON APP_BANK
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
declare
begin
if :new.summa is NULL then RAISE;
end if;
  update app_plateg set app_plateg.summa_free=app_plateg.summa_free-:new.summa where app_plateg.plat_id=:new.plat_id;
end;
/


Val   (2004-02-19 17:51:00) [13]

}|{yk ©   (19.02.04 17:45) [10]
2 проверки покажут who is who:
1:
declare
begin
  update app_plateg set app_plateg.summa_free=app_plateg.summa_free where app_plateg.plat_id=:new.plat_id;
end;
2:
declare
begin
  update app_plateg set app_plateg.summa_free=:new.summa where app_plateg.plat_id=:new.plat_id;
end;


Reindeer Moss Eater   (2004-02-19 17:49:00) [14]

a.summa_free IS NOT NULL!

Да наздоровье.

Ты что, так и не понял, что тебе намекали на то, что - :new.summa is null?


}|{yk   (2004-02-19 17:47:00) [15]

a.summa_free IS NOT NULL!


}|{yk   (2004-02-19 17:45:00) [16]

Если сделать так

declare
 summ number;
begin
   select count(a.summa_free) into summ from app_plateg a where a.plat_id=:new.plat_id;
   summ:=summ-:new.summa;
   update app_plateg set app_plateg.summa_free=summ where app_plateg.plat_id=:new.plat_id;
end;

в поле заносится -:new.summa. count(a.summa_free) = 0
Но как это может быть?


Guest   (2004-02-19 17:45:00) [17]

select count(a.summa_free) into summ from app_plateg a where a.plat_id=:new.plat_id;

выдает 0

потому что a.summa_free IS NULL.
count(*) <> count(column)


}|{yk   (2004-02-19 17:42:00) [18]

>>Протрассировать трудно что ли?
А чем можно триггер протрассировать?


}|{yk   (2004-02-19 17:40:00) [19]

я это знаю. Но с какой радости? :new.summa не null, потому что

update app_plateg set app_plateg.summa_free=:new.summa where app_plateg.plat_id=:new.plat_id;

запишет в платежи новую сумму.  app_plateg.summa_free не может быть null, однако

select count(a.summa_free) into summ from app_plateg a where a.plat_id=:new.plat_id;

выдает 0


Reindeer Moss Eater   (2004-02-19 17:37:00) [20]

Ты что, так и не понял, что тебе намекали на то, что -:new.summa  is null?

<Что_то> минус NULL равняется NULL

Если апдейт твоего триггера выполняется так как ты говоришь (затирается одна запись в другой таблице) то WHERE сработало.
Но раз в итоге поле затерлось, значит один из операндов в выражении app_plateg.summa_free-:new.summa имеет значение NULL.
Ну или оба имеют это значение.

Протрассировать трудно что ли?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо