powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Создание триггера!
19 сообщений из 19, страница 1 из 1
Создание триггера!
    #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
Создание триггера!
    #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
Создание триггера!
    #39213017
virtuoz0z0z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
IF(per>0) THEN

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

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

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

никак. Её закрывают модераторы, если посчитают нужным
...
Рейтинг: 0 / 0
Создание триггера!
    #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
Создание триггера!
    #39213044
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
virtuoz0z0zЕсли кому понадобиться...

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

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

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

я бы добавил Пропил
...
Рейтинг: 0 / 0
Создание триггера!
    #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
Создание триггера!
    #39213397
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисWildSery,

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

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


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