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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2011, 20:17   #1
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию ошибка в написании триггера.

Здравствуйте, незнакомцы из разных уголков страны.Кто что может подсказать?

IBConsole

существует 3 таблицы :
"Menu(BLIUDO, KOLICH)" - меню на день. Здесь вписывается приготовленные блюда в размере N штук.
"Raskladka(BLIUDO, NOMER,INGREDIENT,KOLICH)" - здесь хранится название блюда и его ингредиенты (имя и количество, требуемое на приготовление этого блюда)
"Sklad(INGREDIENT,CENA,KOLICHESTVO) " - здесь хранятся ингредиенты с указанием их количества на складе.

Триггер должен при добавлении в MENU новой записи из таблицы SKLAD
вычитать кол-во ингредиентов, ушедших на приготовления блюда на складе.

пишу значит вот так:
Код:
set term^;
create trigger tr1 for menu
active after insert
as
begin
update sklad
set sklad.kolichestvo=sklad.kolichestvo-raskladka.kolich*menu.kolich
where new.bliudo=raskladka.bliudo;
end^
set term^;
ошибка значит такая
Dynamic SQL Error
SQL error code = -206
Column unknown
RASKLADKA.KOLICH
Statement: create trigger tr1 for menu
active after insert
as
begin
update sklad
set sklad.kolichestvo=sklad.kolichestvo-raskladka.kolich*menu.kolich
where new.bliudo=raskladka.bliudo;
end
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 31.01.2011 в 01:58.
Rin вне форума Ответить с цитированием
Старый 30.01.2011, 22:32   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

вот сама база данных.
юзаю InterBase 6.

поправка: не ту БД скинул, поэтому её удалил, а файл "проблемной" БД 3 постами ниже.
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 31.01.2011 в 05:12.
Rin вне форума Ответить с цитированием
Старый 31.01.2011, 00:02   #3
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

Цитата:
where new.bliudo=raskladka.bliudo
Кто такой new ? У которого есть поле new.bliudo...
asmodey1 вне форума Ответить с цитированием
Старый 31.01.2011, 00:44   #4
SERGOFF
Пользователь
 
Регистрация: 29.09.2009
Сообщений: 10
По умолчанию

Цитата:
Сообщение от Rin Посмотреть сообщение
вот сама база данных.
юзаю InterBase 6.
ты уверен, что ту базу скинул? там только таблица klient_t

Цитата:
Сообщение от asmodey1 Посмотреть сообщение
Кто такой new ? У которого есть поле new.bliudo...
new.<имя поля> - параметр хранящий значение вводимое в поле, т.к. триггер для операции after insert. (p.s. это не таблица)
SERGOFF вне форума Ответить с цитированием
Старый 31.01.2011, 01:51   #5
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

блин, ребят, извиняюсь...Не то скинул.
вот БД.

new : это спец переменная, используемая в триггерах, которая хранит только что добавленную запись в любой твоей таблице. В моём случае это MENU.
Вложения
Тип файла: rar BAZA.rar (30.3 Кб, 11 просмотров)
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 31.01.2011 в 01:56.
Rin вне форума Ответить с цитированием
Старый 31.01.2011, 05:21   #6
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Тут вам стоит подумать на запросом
Код:
update sklad
set sklad.kolichestvo=sklad.kolichestvo-raskladka.kolich*menu.kolich
where new.bliudo=raskladka.bliudo;
откуда запрос знает что такое raskladka.kolich, menu.kolich, raskladka.bliudo. То что они находятся в 1 базе ещё ни о чём не говорит запросу, то что запрос выполняется в теле триггера даёт возможность использовать в нём new.bludo но никак не menu.kolich, ине важно что триггер связан с событиями таблицы menu. В общем тут 2 выхода либо править запрос, и писать както так
Код:
SET TERM ^ ;

CREATE TRIGGER TR1 FOR MENU
ACTIVE AFTER INSERT
AS
begin
update sklad 
     set sklad.kolichestvo= sklad.kolichestvo - (
                            select  menu.kolich * raskladka.kolich 
                from menu left join raskladka on menu.bliudo = raskladka.bliudo
            where menu.bliudo = new.bliudo and raskladka.ingridient = sklad.ingridient 
                                                              )
where sklad.ingridient in (select raskladka.ingridient from raskladka where raskladka.bliudo = new.bliudo);
end
^
SET TERM ; ^
или использовать хранимую процедуру и вызывать её из триггера

Последний раз редактировалось vovk; 31.01.2011 в 08:03. Причина: чуть вид поправил
vovk вне форума Ответить с цитированием
Старый 31.01.2011, 08:36   #7
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

я тоже думал многоуровневым и мудрёным select`ом воспользоваться, но думал есть более простой выход . Не знал, что в триггере нельзя писать <имя таблицы>.<имя столбца>. Спасибо за совет, Vovk.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 31.01.2011, 09:15   #8
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Да пожалуйста)
Тут просто надо помнить, что запрос он и есть запрос пусть и в теле триггера, и волшебным образом он информацию о других таблицах не получит, триггер он хоть и читерская штука)), но тоже вещь не волшебная. Сам найти таблицу в бд связать её с другой и выбрать записи по условию из 3 таблицы связаной со второй через первую которую обновляем (о как))) он не сможет по крайней мере пока. Относительно new.поле, и old.поле это переменные.

PS Я как начал изучать, тоже разок так попыталься сделать. Сказать что я рассчитывал на положительный результат было бы неверно, но так хотелось, что я трясущимися руками ,набрал триггер, и с замиранием сердца думая - "а вдруг ....." пытался скомпилировать.
Видно в каждом из нас живёт надежда на чудо))

Последний раз редактировалось vovk; 31.01.2011 в 20:57.
vovk вне форума Ответить с цитированием
Старый 31.01.2011, 14:53   #9
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Спасибо большое, прибольшое!!!!!
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 31.01.2011 в 14:55.
Rin вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при написании команды для SoftIce ProgDel Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 06.03.2010 19:16
Добавление триггера flame33 SQL, базы данных 0 10.01.2010 18:05
Создание триггера Crasty SQL, базы данных 1 20.11.2009 01:19
Ошибка при написании ассемблеровского кода на Визе 6.0 Познающий Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 03.11.2009 19:09