Страница 1 из 1
Транзакции в приложении
Добавлено: 15 май 2006, 05:55
Lars
Приложение - работа кассы в обслуживании клиентов.
Есть блюда, которые покупают, в табличке поле CntDish, кторое указывает сколько купили.
Весь день у юзера висит окошко с перечнем блюд, он выбирает блюдо, устанавливает кол-во и нажимает печать чека. Печатает, запрос обнуляет CntDish и так со след. клиентом.
Вопросы.
1. Как лучше оформить работу транзакций, если бухгалтер на др. ПК меняет цену блюда и т.п.
2. Отключение клиента происходит, если окно выбора висит, а действия не выполняелись около часа-полтора?
3. Схема обнуления смущает?
Добавлено: 15 май 2006, 08:24
Dimitry Sibiryakov
Вообще-то интерфейс приложения никак с транзакциями не связан...
Транзакции должны быть как можно более короткими. Т.е. с базой надо работать в стиле "запустил транзакцию-выполнил запросы-закоммитил транзакцию".
По пункту 2: отключения клиента самопроизвольно вообще не происходят.
Добавлено: 15 май 2006, 09:07
kdv
2. Отключение клиента происходит, если окно выбора висит, а действия не выполняелись около часа-полтора?
нефиг висеть столько.
www.ibase.ru/devinfo/keepalive.htm
Добавлено: 15 май 2006, 09:12
Ivan_Pisarevsky
1. Обыкновенно с транзакциями, как в букваре написано... То что постоянно висит у оператора перед глазами запускаешь в рид онли рид_коммитит транзакции. При переоткрытии запроса он увидит автоматом все что закоммичено на других клиентах. Рефрешь можно приурочить к пробитию чека, положить пимпочку "Обновить", обновлять по таймеру или эвентами, тут уж на месте сориентируешься.
2. Зачем клиента отключать?
3. Нипониль...
Добавлено: 15 май 2006, 09:16
Ivan_Pisarevsky
kdv писал(а):2. Отключение клиента происходит, если окно выбора висит, а действия не выполняелись около часа-полтора?
нефиг висеть столько.
www.ibase.ru/devinfo/keepalive.htm
Ну и пусть себе висит, если на нем только рид онли транзакция активна вред от него минимальный.
А пишущую транзакцию стартовать когда оператор уже сформировал весь обед/ужин/завтрак и жмакнул пимпочку "Пробить чек", вот тут стартуем пишую транзакцию пишем все скопом и коммитим ее.
Добавлено: 16 май 2006, 11:27
Lars
Ivan_Pisarevsky писал(а):1. Обыкновенно с транзакциями, как в букваре написано... То что постоянно висит у оператора перед глазами запускаешь в рид онли рид_коммитит транзакции. При переоткрытии запроса он увидит автоматом все что закоммичено на других клиентах. Рефрешь можно приурочить к пробитию чека, положить пимпочку "Обновить", обновлять по таймеру или эвентами, тут уж на месте сориентируешься.
2. Зачем клиента отключать?
3. Нипониль...
Выставляем количество купленных блюд, потом обнуляем поле, после печати чека.
UPDATE DISH_SELECT SET CNT_DISH =0 WHERE CNT_DISH<>0;
Меня напрягает этот момент, т.е. юзер каждый раз, когда выделяет блюдо для покупки с кол-вом обновляет таблицу!
Потом запрос проверяет блюда с CNT_DISH > 0 и их печатет с суммами. Вот так.
Добавлено: 16 май 2006, 11:45
Ivan_Pisarevsky
>Меня напрягает этот момент, т.е. юзер каждый раз, когда выделяет блюдо для покупки с кол-вом обновляет таблицу!
-Доктор, когда я делаю ТАК, мне больно...
-А Вы ТАК не делайте!
Ну так не делай так, считай в обычный стринггрид данные и закрой транзакцию, потом юзер проставил колоночку цифирей и жмакнул "пробить чек", проходишься по стринггриду формируешь пишущий запрос, стартуешь транзакцию, исполняешь запрос, коммит. далее все сначала.
Как один из вариантов решения.

Добавлено: 16 май 2006, 12:35
kdv
в таких случаях вместо стринггрида используют TClientDataSet.
Добавлено: 16 май 2006, 16:38
Lars
kdv писал(а):2. Отключение клиента происходит, если окно выбора висит, а действия не выполняелись около часа-полтора?
нефиг висеть столько.
www.ibase.ru/devinfo/keepalive.htm
А что предложите делать, если они работают с 8, а в 9-30 только клиенты приходят?! А послеобеденное время?!
Если окно висит, заставка там, или еще что - около часа, может ли закрыться коннект?
Добавлено: 16 май 2006, 17:25
kdv
вопросы странные. коннект клиента к БД - это сокет. В виндах есть настройки, которые определяют время жизни неактивного сокета. Если время истекает, ВИНДЫ принудительно закрывают сокет.
Соответственно, решение этой проблемы, если это для тебя проблема, целиком и полностью в твоих руках. Или ты конфигурируешь keepalive, как в статье. Или ты анализируешь неактивность пользователя и через некоторые интервалы "дергаешь" сервер пустопорожним запросом (пусть даже нечто вроде isc_database_info).
Или, после неактивности пользователя корректно закрываешь коннект, с сообщением пользователю, что его время безделья истекло.
Или ....
Я бы вообще - отслеживал время неактивности пользователя, и писал это в лог, или сообщал на сервер. А потом бы или штраф за безделье, или поувольнять часть, или ...

Добавлено: 16 май 2006, 18:59
Lars
kdv писал(а):вопросы странные. коннект клиента к БД - это сокет. В виндах есть настройки, которые определяют время жизни неактивного сокета. Если время истекает, ВИНДЫ принудительно закрывают сокет.
Соответственно, решение этой проблемы, если это для тебя проблема, целиком и полностью в твоих руках. Или ты конфигурируешь keepalive, как в статье. Или ты анализируешь неактивность пользователя и через некоторые интервалы "дергаешь" сервер пустопорожним запросом (пусть даже нечто вроде isc_database_info).
Или, после неактивности пользователя корректно закрываешь коннект, с сообщением пользователю, что его время безделья истекло.
Или ....
Я бы вообще - отслеживал время неактивности пользователя, и писал это в лог, или сообщал на сервер. А потом бы или штраф за безделье, или поувольнять часть, или ...

Я тоже за решение проблем на управленческом уровне

Ответы ясны и думаю, что тема исчерпана.