Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Создание триггера! / 19 сообщений из 19, страница 1 из 1
11.04.2016, 20:11
    #39213008
virtuoz0z0z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
Есть таблица ZAKAZI в ней 3 поля NAME_KLIENT-имя клиента, SUMMA - цена заказа, STATUS - статус заказа( Купил или нет). Вторая таблица INFO_ZAKAZI хранит информацию о заказах в ней 3 поля KLIENT - имя клиента, ALL_SUMMA - сумма по всем заказам данного клиента, KOL-VO -кол-во заказов данного клиента.
ЗАДАНИЕ: Создать триггер который при переводе заказа из Не купил в Купил( то есть после обновления статуса ) увеличивает кол-во заказов и сумму заказов данного клиента в таблице INFO-ZAKAZI.
Код триггера рабочий:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE OR ALTER TRIGGER ZAKAZ FOR ZAKAZI
ACTIVE AFTER UPDATE POSITION 0
AS begin
IF(NEW.STATUS='Купил') then
update  info_zakaz SET INFO_ZAKAZ.kol_vo=INFO_ZAKAZ.kol_vo+1, INFO_ZAKAZ.all_summa=INFO_ZAKAZ.all_summa+new.summa
WHERE info_zakaz.klient = new.NAME_KLIENT;
IF(NEW.STATUS='Не купил')then
update  info_zakaz SET INFO_ZAKAZ.kol_vo=INFO_ZAKAZ.kol_vo-1, INFO_ZAKAZ.all_summa=INFO_ZAKAZ.all_summa-new.summa
WHERE info_zakaz.klient = new.NAME_KLIENT;
end


Тут предусмотрел если наоборот клиент передумал и отменил заказ то есть изменил Купил на Не КУПИЛ. В задание это не входит но я подумал данный триггер работает только если во второй таблице изначально существуют поля с такимиже именами клиентов как и в первой таблице вообщем решил сделать триггер который срабатывает перед добавлением то есть он смотрит есть ли такой клиент в таблице прежде чем его добавить если нет то создать такого клиента при этом нужно посмотреть сразу статус Купил или Не купил если купил то сразу прибавить к общей сумме и кол-ву во 2ой таблице вот код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create trigger ZAKAZ2 FOR zakazi
ACTIVE after insert
AS begin
per=(SELECT COUNT(*) FROM INFO_ZAKAZ WHERE KLIENT=NEW.NAME_KLIENT);
IF(per>0) THEN
update  info_zakaz SET INFO_ZAKAZ.kol_vo=INFO_ZAKAZ.kol_vo+1, INFO_ZAKAZ.all_summa=INFO_ZAKAZ.all_summa+new.summa
WHERE info_zakaz.klient = new.NAME_KLIENT;
IF(per=0 AND NEW.STATUS='Купил') then
INSERT INTO info_zakaz(KLIENT,KOL_VO,ALL_SUMMA)
VALUES(NEW.NAME_KLIENT,1,NEW.SUMMA);
IF(per=0 AND NEW.STATUS='Не купил') then
INSERT INTO info_zakaz(KLIENT,KOL_VO,ALL_SUMMA)
VALUES(NEW.NAME_KLIENT,0,0);
end


ругаеться на 4 строчку там где переменной присваиваю результат выборки ( в ней смотрю есть ли поля с таким именем ) помогите исправить не как не допру что не так еще нужен триггер после удаления записи из первой таблице но его я сделаю сразу как с этим разберусь может быть так присваивать нельзя или ее нужно объявить где до присваивания ? в ней храниться либо 0 либо число int формата
...
Рейтинг: 0 / 0
11.04.2016, 20:25
    #39213015
virtuoz0z0z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
Еще тут при добавлении нужно сразу посмотреть Купил или Не Купил если есть то нужно строчку
Код: sql
1.
2.
3.
IF(NEW.STATUS='Купил') then
update  info_zakaz SET INFO_ZAKAZ.kol_vo=INFO_ZAKAZ.kol_vo+1, INFO_ZAKAZ.all_summa=INFO_ZAKAZ.all_summa+new.summa
WHERE info_zakaz.klient = new.NAME_KLIENT;

поменял на
Код: sql
1.
2.
3.
4.
5.
6.
IF(per>0 and NEW.STATUS='Купил' ) THEN
update  info_zakaz SET INFO_ZAKAZ.kol_vo=INFO_ZAKAZ.kol_vo+1, INFO_ZAKAZ.all_summa=INFO_ZAKAZ.all_summa+new.summa
WHERE info_zakaz.klient = new.NAME_KLIENT;
IF(per>0 and NEW.STATUS='Не купил' ) THEN
update  info_zakaz SET INFO_ZAKAZ.kol_vo=INFO_ZAKAZ.kol_vo-1, INFO_ZAKAZ.all_summa=INFO_ZAKAZ.all_summa-new.summa
WHERE info_zakaz.klient = new.NAME_KLIENT;
...
Рейтинг: 0 / 0
11.04.2016, 20:26
    #39213017
virtuoz0z0z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
Код: sql
1.
IF(per>0) THEN

перепутал вот эту строчку нужно менять тут она просто проверяет если есть записи но не смотрит Купил или Нет =)
...
Рейтинг: 0 / 0
11.04.2016, 20:45
    #39213025
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
virtuoz0z0z,

Переменную per кто будет объявлять? Триггеры конечно бредовые, но для курсача может и сойдёт
...
Рейтинг: 0 / 0
11.04.2016, 20:46
    #39213027
virtuoz0z0z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
это лаба 3 только изучаем ) объявить ее нужно внутри триггера так?
...
Рейтинг: 0 / 0
11.04.2016, 20:48
    #39213028
virtuoz0z0z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
Симонов Денис,
Это лаба мы только изучаем так сказать первые азы переменную нужно объявить внутри триггера так?
...
Рейтинг: 0 / 0
11.04.2016, 20:50
    #39213030
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
...
Рейтинг: 0 / 0
11.04.2016, 20:52
    #39213032
virtuoz0z0z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
Симонов Денис,

CПС разобрался все работает!
...
Рейтинг: 0 / 0
11.04.2016, 20:53
    #39213034
virtuoz0z0z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
Симонов Денис,
Как закрыть тему? На форуме этом
...
Рейтинг: 0 / 0
11.04.2016, 21:00
    #39213039
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
virtuoz0z0z,

никак. Её закрывают модераторы, если посчитают нужным
...
Рейтинг: 0 / 0
11.04.2016, 21:01
    #39213040
virtuoz0z0z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
Если кому понадобиться что-то подобное вот как у меня получилось Код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE OR ALTER TRIGGER ZAKAZ2 FOR ZAKAZI
ACTIVE AFTER INSERT POSITION 0
AS
DECLARE VARIABLE per int;
begin
per=(SELECT COUNT(*) FROM INFO_ZAKAZ WHERE KLIENT=NEW.NAME_KLIENT);
IF(per>0 and NEW.STATUS='Купил' ) THEN
update  info_zakaz SET INFO_ZAKAZ.kol_vo=INFO_ZAKAZ.kol_vo+1, INFO_ZAKAZ.all_summa=INFO_ZAKAZ.all_summa+new.summa
WHERE info_zakaz.klient = new.NAME_KLIENT;
IF(per>0 and NEW.STATUS='Не купил' ) THEN
update  info_zakaz SET INFO_ZAKAZ.kol_vo=INFO_ZAKAZ.kol_vo-1, INFO_ZAKAZ.all_summa=INFO_ZAKAZ.all_summa-new.summa
WHERE info_zakaz.klient = new.NAME_KLIENT;
IF(per=0 AND NEW.STATUS='Купил') then
INSERT INTO info_zakaz(KLIENT,KOL_VO,ALL_SUMMA)
VALUES(NEW.NAME_KLIENT,1,NEW.SUMMA);
IF(per=0 AND NEW.STATUS='Не купил') then
INSERT INTO info_zakaz(KLIENT,KOL_VO,ALL_SUMMA)
VALUES(NEW.NAME_KLIENT,0,0);
end
...
Рейтинг: 0 / 0
11.04.2016, 21:06
    #39213044
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
virtuoz0z0zЕсли кому понадобиться...

вряд ли
...
Рейтинг: 0 / 0
12.04.2016, 10:03
    #39213259
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
Эх, надавать бы по пальцам за STATUS "купил/не купил", ну да ладно - лаба же... А так - неприменимо ни разу.
...
Рейтинг: 0 / 0
12.04.2016, 10:05
    #39213262
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
Где статусы "Подарили" и "Взял в кредит"?
...
Рейтинг: 0 / 0
12.04.2016, 10:06
    #39213266
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
WildSery,

.. или хотя бы "возврат".
...
Рейтинг: 0 / 0
12.04.2016, 10:11
    #39213273
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
DarkMaster,

Раз статусы на русском, то должен быть "Просрали".
...
Рейтинг: 0 / 0
12.04.2016, 10:18
    #39213283
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
WildSery,

я бы добавил Пропил
...
Рейтинг: 0 / 0
12.04.2016, 11:06
    #39213371
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
линейкой по пальцам:
per=(SELECT COUNT(*) FROM INFO_ZAKAZ WHERE KLIENT=NEW.NAME_KLIENT);
заменить на:
if (exists(SELECT 1 FROM INFO_ZAKAZ WHERE KLIENT=NEW.NAME_KLIENT)) then ...
...
Рейтинг: 0 / 0
12.04.2016, 11:26
    #39213397
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера!
Симонов ДенисWildSery,

я бы добавил Пропил

А я бы цифиркой заменил - мой посыл изначально в эту сторону был.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Создание триггера! / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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