Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2008, 16:31   #1
veter_s_morya
ФорумчанинДжуниор
 
Аватар для veter_s_morya
 
Регистрация: 05.05.2008
Сообщений: 606
По умолчанию триггер

Забодал меня тут один триггер. Никак не могу его написать. Базу задал мне препод написать на чистом sql. И дал программу IBExpert c Сервером Firebird 1.0.
Создать 3 таблицы: sdelka, strokasdelki, tovar.

Вот мой код

CREATE TABLE SDELKA (
NSDELKI VARCHAR(4) NOT NULL,
SUMMA VARCHAR(20) NOT NULL,
TIPDOKUMENTA VARCHAR(20) NOT NULL
);
ALTER TABLE SDELKA ADD CONSTRAINT PK1 PRIMARY KEY (NSDELKI);

CREATE TABLE STROKASDELKI (
NSTROKI VARCHAR(4) NOT NULL,
NSDELKI VARCHAR(20) NOT NULL,
NTOVARA VARCHAR(20) NOT NULL,
KOLICHESTVO VARCHAR(20) NOT NULL
);
ALTER TABLE STROKASDELKI ADD CONSTRAINT PK2 PRIMARY KEY (NSTROKI);
ALTER TABLE STROKASDELKI ADD CONSTRAINT FK1 FOREIGN KEY (NSDELKI) REFERENCES SDELKA (NSDELKI);
ALTER TABLE STROKASDELKI ADD CONSTRAINT FK2 FOREIGN KEY (NTOVARA) REFERENCES TOVAR (NTOVARA);

CREATE TABLE TOVAR (
NTOVARA VARCHAR(4) NOT NULL,
NAZVANIE VARCHAR(20) NOT NULL,
CHENA VARCHAR(20) NOT NULL,
OSTATOK VARCHAR(20) NOT NULL
);
ALTER TABLE TOVAR ADD CONSTRAINT PK3 PRIMARY KEY (NTOVARA);

А само задание, создать триггер, который увеличивает или уменьшает остаток в таблице TOVAR, в зависимости от типа документа в таблице SDELKA. Т.е если тип документа приходный, то остаток по конкретному товару увеличивается путем умножения суммы сделки с количеством строкисделки. А вот с расходом остаток уменьшается. (правда, все это звучит дико? Не знаю правильно ли звучит это с экономической стороны…но вот так. )
Вот набросок триггера… откомпилировался, а работать не хочет…
Код:
CREATE TRIGGER PRZ FOR SDELKA
ACTIVE AFTER INSERT POSITION 0
as
declare variable ostat numeric(7);
begin
ostat=0;
if ('приход'=new.tipdokumenta) then
 select sum(sdelka.summa*strokasdelki.kolichestvo) as ostat
 from sdelka inner join strokasdelki
  on strokasdelki.ntovara=sdelka.nsdelki
  where sdelka.nsdelki=new.nsdelki
 into: ostat;
update tovar t
set t.ostatok=:ostat
where new.nsdelki=t.ntovara;
end
------------------------------
Ум без разума –это беда!

Последний раз редактировалось veter_s_morya; 21.09.2008 в 16:34.
veter_s_morya вне форума Ответить с цитированием
Старый 23.09.2008, 22:18   #2
veter_s_morya
ФорумчанинДжуниор
 
Аватар для veter_s_morya
 
Регистрация: 05.05.2008
Сообщений: 606
По умолчанию

Подходил к преподу, в общем, недопонял (чувствовал ведь, что что-то не так). Задание осталось тем же, только вот умножения суммы сделки с количеством строкисделки делать не надо.
Вот код
Код:
CREATE TRIGGER PR FOR strokasdelki
ACTIVE AFTER INSERT POSITION 0
as
declare variable ostat numeric(7);

begin

ostat=0;
select(sdelka.tipdokumenta) as ostat
 from sdelka 
 where nsdelki=new.nsdelki
 into: ostat;
if ('приход'=new.tipdokumenta) then
begin 

update  tovar
set tovar.ostatok=tovar.ostatok+new.colichestvo
where sdelka.nsdelki=new.nsdelki;

end
else if ('расход'=new.tipdokumenta) then
begin

update  tovar
set tovar.ostatok=tovar.ostatok-new.kolichestvo
where sdelka.nsdelki=new.nsdelki;
end
end
Только вот ошибку выдает! Сам исправить не могу! Подскажите пожалуйста, бедняге ветру_с_ моря. Заранее спасибо!
------------------------------
Ум без разума –это беда!
veter_s_morya вне форума Ответить с цитированием
Старый 26.09.2008, 08:22   #3
dron-s
Форумчанин
 
Регистрация: 04.03.2007
Сообщений: 615
По умолчанию

что за ошибка?
Цитата:
else if ('расход'=new.tipdokumenta) then
вот такое вот не допускается (не желательно) у операции РАСХОД есть идешник,по по нему и проверяй...
dron-s вне форума Ответить с цитированием
Старый 27.09.2008, 15:00   #4
veter_s_morya
ФорумчанинДжуниор
 
Аватар для veter_s_morya
 
Регистрация: 05.05.2008
Сообщений: 606
По умолчанию

Что такое идешник? Я не понял этого сокращения!
Цитата:
вот такое вот не допускается (не желательно) у операции РАСХОД есть идешник,по по нему и проверяй...
А ошибка, вы правы, эта (только приход)!

Код:
Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
NEW.TIPDOKUMENTA.
At line 13, column 18.
(это не паскальевский отладчик… тут все путано)

Перевод:
Код:
Колонка не принадлежит упомянутой таблице.
Динамическая SQL Ошибка.
SQL ошибка закодируют =-206.
Неизвестная колонка.
NEW.TIPDOKUMENTA.
На линии 13, символ 18.
Если поменять CREATE TRIGGER PR FOR strokasdelki на
CREATE TRIGGER PRZ FOR SDELKA, то хорошего тоже мало.
Естественно будет выдаваться ошибка на
Код:
set tovar.ostatok=tovar.ostatok+new.colichestvo
(new тут уже не прокатит)
------------------------------
Ум без разума –это беда!
veter_s_morya вне форума Ответить с цитированием
Старый 27.09.2008, 16:10   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Что такое идешник?
Подразумевается уникальный идентификатор ID.
mihali4 вне форума Ответить с цитированием
Старый 27.09.2008, 19:44   #6
veter_s_morya
ФорумчанинДжуниор
 
Аватар для veter_s_morya
 
Регистрация: 05.05.2008
Сообщений: 606
По умолчанию

Цитата:
идешник,по по нему и проверяй...
Вот опять не понял... Как это сделать?
Я должен обработать только последний кортеж введенный в таблицу, касающийся только определенного товара.
врянтов кроме 'приход'=new.tipdokumenta у меня нет...
------------------------------
Ум без разума –это беда!
veter_s_morya вне форума Ответить с цитированием
Старый 28.09.2008, 17:05   #7
dron-s
Форумчанин
 
Регистрация: 04.03.2007
Сообщений: 615
По умолчанию

veter_s_morya
я бы сделал вот так
Код:
if (new.id_oper = 1000) then
    begin
      execute procedure nalic_plus(new.articul, new.kolvo, new.cena, new.name_tovar, new.edin_izm, new.summa_tov, new.id_num_nakl, new.id_proizvod, new.id_oper, new.name_tovar_proizvod, new.kat_izdel);
    end
где id_oper = 1000 - это и есть Приход из таблицы Oper
dron-s вне форума Ответить с цитированием
Старый 28.09.2008, 22:40   #8
veter_s_morya
ФорумчанинДжуниор
 
Аватар для veter_s_morya
 
Регистрация: 05.05.2008
Сообщений: 606
По умолчанию

Цитата:
if (new.id_oper = 1000) then
begin
execute procedure nalic_plus(new.articul, new.kolvo, new.cena, new.name_tovar, new.edin_izm, new.summa_tov, new.id_num_nakl, new.id_proizvod, new.id_oper, new.name_tovar_proizvod, new.kat_izdel);
end
В моем случаи это усложнит «простой триггер»(с процедурой nalic_plus вариант конечно интересный, но... не то).
------------------------------
Ум без разума –это беда!
veter_s_morya вне форума Ответить с цитированием
Старый 29.09.2008, 07:17   #9
dron-s
Форумчанин
 
Регистрация: 04.03.2007
Сообщений: 615
По умолчанию

я тебе не про процедуру, а про
Цитата:
вот такое вот не допускается (не желательно) у операции РАСХОД есть идешник,по по нему и проверяй...
dron-s вне форума Ответить с цитированием
Старый 05.10.2008, 20:48   #10
veter_s_morya
ФорумчанинДжуниор
 
Аватар для veter_s_morya
 
Регистрация: 05.05.2008
Сообщений: 606
По умолчанию

Цитата:
идешник,по по нему и проверяй
Малость не дошло, хотелось бы увидеть код. Если не трудно скинь, как ты себе это видишь.
------------------------------
Ум без разума –это беда!
veter_s_morya вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
триггер..плиз zinnyrik БД в Delphi 4 21.05.2007 16:08
Триггер? yulia БД в Delphi 9 12.05.2007 15:03