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