Форум: "Базы";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
ВнизВопрос по триггерам Найти похожие ветки
← →
jiny (2004-09-04 13:54) [0]При создании расходной накладной ,создается временная таблица списка итуда забивают товар. При этом в этой таблице созданы 2 триггер (перед вставкой и перед удалением товара из временной таблицы. Таким образом, попадая во временную таблицу, выбранное кол-во резервируется в справочнике товаров и никто не сможет взять больше положенного
(по формуле остаток потенциальный = остаток текущий - резерв)
После удаления записи во временной таблице - резерв снимается.
Воброс такой :
нужно ли в теле триггера комитить произведенные изменения в таблице товаров, так как при работе 6 пользователей происходит какой то глюк(то ли при зависании , либо еще что-то) и резервирование иногда не происходит.
НУЖНО ЛИ КОМИТИТЬ В ТРИГГЕРЕ ? и как это делается, если на банальное COMMIT триггер ругается
create trigger ..... for .... active before insert/delete
as
begin
update .... set .... where ...;
commit;
end
← →
atruhin © (2004-09-04 14:58) [1]А что в IB появились временные таблицы?
← →
Zacho © (2004-09-04 16:16) [2]Никаких commit и rollback в DSQL нет, так же, как нет и "временных" таблиц в IB.
Триггер работает в контексте той транзакции, в которой он был инициирован.
Советую изучить http://www.ibase.ru/develop.htm
← →
DrPass © (2004-09-04 21:50) [3]
> НУЖНО ЛИ КОМИТИТЬ В ТРИГГЕРЕ ?
А КАК ты собрался это делать?
← →
atruhin © (2004-09-05 15:45) [4]>так как при работе 6 пользователей происходит какой то глюк
Так может он и происходит от того что ты считаеш временными таблицами?
← →
PEAKTOP © (2004-09-06 03:21) [5]Когда-то подобную .... приходилось писать. Решалась задача так.
1) на форме есть IBQuery, и все операции с данными (вставка, удаление и т.п.) идут через SQL запросы или команды.
2) Условно считаем, что в базе есть следующие таблицы:
справочник товаров,
справочник мест хранения,
регистр остатков товаров по местам хранения,
журнал накладных,
табличная часть накладных.
У КАЖДОЙ записи журнала накладных есть столбец-флаг "накладная проведена".
3) При вставке новой записи в "журнал накладных" (то есть заводится навая накладная)производится Commit у IBQuery.Transaction.
4) При добавлении(изменении, удалении) новой записи в табличную часть докумета производится Commit. Соответственно, при помощи триггеров и IBEvents достаточно легко расчитать и показать на всех клиентах текущие остатки товаров, которые равны
ОстатокТовара = ОстатокВРегистре - ЗарезервированныеВНепроведенныхНакладных;
5) При закрытии формы редактирования докумета у юзера спрашивается "Провести документ ?". Если да, то ставится "флаг докумет проведен"=ИСТИНА. Также можно проведенный документ сделать "непроведенным". На таблице "журнал документов" висит триггер на операцию UPDATE, который в зависимости от нового значения столбца "флаг документ проведен" расходует товар из "регистра остатков" или возвращает его на место. То есть фактически товар расходуется только в этом месте.
← →
Рамиль © (2004-09-06 08:59) [6]Расход надо делать не по накладной, а по ордерам. Т. е. набивается накладная с резервом, а при фактическом отпуске товара создаются ордера и уменьшаются остатки.
← →
MVA (2004-09-06 10:10) [7]Попробуй создать две транзакции: одну на накладную, вторую - для изменения остатков. При добавлении/изменении строки изменяй остаток и коммить второй транзакцией. Но при отмене редактирования накладной надо вернуть все остатки на место, коммит второй транзакции и ролбек первой.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c