Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-1095342782
lehich
2004-09-16 17:53
2004.10.03
запуск процедуры


14-1089277075
nik7777
2004-07-08 12:57
2004.10.03
Подключился кто-то к моей "тачке"


4-1092833282
*Pavel
2004-08-18 16:48
2004.10.03
Чтение данных с USB


3-1094179381
_sulent
2004-09-03 06:43
2004.10.03
MS SQL 2005


1-1095422491
Tolik
2004-09-17 16:01
2004.10.03
ресурсы в DLL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский