![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Продажа билетов несколькими кассирами [D7, MSSQL]
alabama01 © (2006-09-26 07:09:00)Здравствуйте.
Есть программа для продажи билетов в транспортные средства, с соответсвующей БД. При продаже билета на форме кассира обновляется combobox со списком свободных мест и автоматически подставляется первое свободное место. (сделано для скорости). При работе нескольких кассиров, у них у всех происходит то же самое. Поэтому приходится проверять не продал ли кто билет на это место, а если продал, то выводить предупреждение, чтобы выбирали другое место. Это очень неудобно. Обновление combobox'ов у всехкассиров происходит при оформлении чека любымиз кассиров Вопрос: как лучше организовать раздачу свободных мест при продаже на один и тот же рейс несколькими кассирами без малейшей возможности продажи двух и более билетов на одно место?
Petr V. Abramov (2006-09-29 13:54:00) [21]> ANB © (29.09.06 13:48) [58]
> минимум 3 состояния свободно, заказано, продано.
ОДНОЗНАЧНО! хотя бы для корректного отслеживания ситуации "билеты кончились"
ANB (2006-09-29 13:48:00) [22]
> я б вообще от всяческих комбиков пр. вещей, связанных с
> мышиной возней отказался
не, это однозначно надо чтобы с клавы работало. Жмет кнопку заказа - первые свободные места автоматом могут заказываться (можно заранее вводить нужное количество мест). если бабушка начинает канючить "мне впереди или сзади", дать возможность поменять места. Но - саначала заказ, потом продажа. т.е. минимум 3 состояния свободно, заказано, продано.
Petr V. Abramov (2006-09-29 13:45:00) [23]сорри да дубль.
и еще - сначала коммит, потом печатаем, иначе при глюке после печати транзакция может и откатиться, и 2 билета на одно место обеспечены.
Petr V. Abramov (2006-09-29 13:42:00) [24]я б вообще от всяческих комбиков пр. вещей, связанных с мышиной возней отказался.
Большинство людей просят БИЛЕТ, а не "билет на такое-то место" Исходя из этого: по нажатию какой-то кнопки в правой части клавиатуры блокируем место чем-нибудь типа select ... for update, печатаем билет и быстро commit.
примерно по тому же принципу действуем, если просят N билетов или N рядом.
и уж для оставшихся 1% принципиальных делаем возможность ввести "билет на 19-е место". После ввода числа "19" (т.к. нажать 2 кнопки справа клавиатуры быстрее, чем крутить комбик, да еще с в общем случае неактульными данными) либо вылезает билет, либо сообщение "занято". И уж на совсем редкий случай, когда начнут говорить "а перечислите, какие есть" делает что-то типа комбика ( ессно, без гарантии, что пока кассир будет перечислять свобобные места, они не уплывут)
таким образом еще и исключается ситуация, когда место в непонятном состоянии (и не продано, и не свободно, с большими шансами, что автобус уйдет), а кассир занят выдачей жалобной книги.
тупо, но эффективно
Petr V. Abramov (2006-09-29 13:41:00) [25]я б вообще от всяческих комбиков пр. вещей, связанных с мышиной возней отказался.
Большинство людей просят БИЛЕТ, а не "билет на такое-то место" Исходя из этого: по нажатию какой-то кнопки в правой части клавиатуры блокируем место чем-нибудь типа select ... for update, печатаем билет и быстро commit.
примерно по тому же принципу действуем, если просят N билетов или N рядом.
и уж для оставшихся 1% принципиальных делаем возможность ввести "билет на 19-е место". После числа цифры "19" (т.к. нажать 2 кнопки справа клавиатуры быстрее, чем крутить комбик, да еще с в общем случае неактульными данными) либо вылезает билет, либо сообщение "занято". И уж на совсем редкий случай, когда начнут говорить "а перечислите, какие есть" делает что-то типа комбика ( ессно, без гарантии, что пока кассир будет перечислять свобобные места, они не уплывут)
таким образом еще и исключается ситуация, когда место в непонятном состоянии (и не продано, и не свободно, с большими шансами, что автобус уйдет), а кассир занят выдачей жалобной книги.
тупо, но эффективно
MsGuns (2006-09-29 13:32:00) [26]>ANB © (29.09.06 12:31) [53]
Не канает - актива нетути и ничего не "лочится" ;)))
ANB (2006-09-29 12:31:00) [27]
> Отказался потому, что (это условие заказчика), перевозчик
> может без предупреждения, в последний момент заменить автобус
Каким боком это к комбобоксу ?
Значится, предлагаю следующее решение :
Кассир собирается набрать заказ на билеты. выбирает рейс, жмет кнопку, появляется форма. На форме имеем кнопку для подбора мест и визуалку для отображения корзины и прочих данных. Для подбора мест кассир жмет эту кнопку и видит прямоугольную раскладку (в длинном комбобоксе она повесится копаться), где отражены свободные, проданные и зарезервированные другими кассирами места (тут одним битом не обойтись). кассир может кликать только по свободным. при клике место либо резервируется, либо, если его успели зарезервировать/продать, внизу прямоугольника вывали красную мессагу и обнови эту ячейку (можно и все).
когда места зарезервированы, кассир заполняет остальные поля и получив денежку жмет кнопку продать. зарезервированные переводятся в проданные. при отказе резерв снимается. тута еще надо бы предусмотреть принудительную отмену резерва, если кассир тормозит слишком долго, с проверкой этого факта при попытке продажи.
MsGuns (2006-09-29 11:54:00) [28]>alabama01 (29.09.06 01:41) [51]
>Этот алгоритм только кажется сложным.
Я не сказал, что он сложный. Я сказал, что можно стреляться, если не получается достаточно простую задачу решать достаточно простыми же методами. Каким боком тут ActiveX и что здесь делает DLL ?
>И таблицы лочить не надо.
Чисто профессиональный вопрос: откуда возникло это слово "лочить" и где надо ставить ударение ? И ЧТО ОНО ЗНАЧИТ ?
Я было подумал, что это от слова Lock (замок, запор), но оно читается как "ло к", а не "ло чь". Ну и попутно поясните несведущему, как вы собираетесь БЛОКИРОВАТЬзаписи или даже целые таблицы в системах с большой транзакционной конкурентностью (ну это когда вероятность того, что на "одно место" будет в течение относительно небольшого периода времени сделано более одной заявки, достаточно высока) и каким образом ActiveX или тем более DLL компенсирует Вам отсутствие соответствующих реальныхмеханизмов блокирования на сервере ? Ибо большинство серверов понятие "блокировка" понимают несколько иначе, чем Вы ;))
alabama01 (2006-09-29 01:41:00) [29]
> Sergey13 © (28.09.06 10:25) [46]
> Я бы не стал заморачиваться на вариант из [42] alabama01
> (28.09.06 03:04), а сделал, как советуют, нормальное резервирование.
>
Не больше, наверное. Но сообщения о занятости места сильно досаждают. Даже мне, когда отлаживал.
> MsGuns © (28.09.06 12:12) [47]
>
> Засстрелиться...
Этот алгоритм только кажется сложным. При ближайшем рассмотрении - все не так страшно. Зато нет никаких дополнительных сообщений о недоступности выбранного места. Выбранное - всегда есть. И таблицы лочить не надо.
> Плохиш © (28.09.06 13:27) [48]
На экране ничего не мелькает.
> ANB © (28.09.06 14:12) [49]
>
> Я бы посмотрел в сторону доводки интерфейса и отказа от
> комбобокса.
Идея такая была. Отказался потому, что (это условие заказчика), перевозчик может без предупреждения, в последний момент заменить автобус, если, например, основной сломался. Конфигурация мест может быть другой. А забивать расположение мест всего транспорта всех перевозчиков - не оправдано трудоемко.
> Anatoly Podgoretsky © (28.09.06 19:39) [50]
>
> Визуальный выбор всегда удобен, и вот для этой схемы подходит
> оповещение клиентов. Зарезервирован/продан/возвращен. Для
> продажи в кинотеатрах особенно, для продажи на поезда требуется
> делать немного иначе, поскольку вагонов много и они разные.
>
>
Вот и я о том же.
Anatoly Podgoretsky (2006-09-28 19:39:00) [30]Визуальный выбор всегда удобен, и вот для этой схемы подходит оповещение клиентов. Зарезервирован/продан/возвращен. Для продажи в кинотеатрах особенно, для продажи на поезда требуется делать немного иначе, поскольку вагонов много и они разные.
ANB (2006-09-28 14:12:00) [31]Я бы посмотрел в сторону доводки интерфейса и отказа от комбобокса. Пример - я прошу 2 билета РЯДОМ. Однако, если не учитывать конфигурацию мест, то 2 места подряд по номерам не всегда будут рядом. Видел я кассу в кинотеатре. Там прямо схема зала и кассирша кликает по свободным местам, резервируя места. Если у нее старая картинка, то при клике на уже занятом другой кассиршей месте, вываливается мессага и ячейка перекрашивается. Резервированные места кладутся в корзину и при продаже уже заносяться в билеты. Очень удобно.
Плохиш (2006-09-28 13:27:00) [32]
> Засстрелиться
кассирам, пока в дурку не попали от постоянного мелькания данных на экране.
MsGuns (2006-09-28 12:12:00) [33]>alabama01 (28.09.06 03:04) [42]
>Решение найдено следующее: пишем dll active-x..
...
>Я несколько упрощенно описал.
Засстрелиться...
Sergey13 (2006-09-28 10:25:00) [34]> [45] alabama01 (28.09.06 10:10)
> Пока трое. Количество будет расти.
До 5? До 6?
Я бы не стал заморачиваться на вариант из [42] alabama01 (28.09.06 03:04), а сделал, как советуют, нормальное резервирование.
alabama01 (2006-09-28 10:10:00) [35]
> atruhin © (28.09.06 09:24) [43]
>
> А что будет при обрыве сети, и если место заблокированно?
>
Я несколько упрощенно описал. Помимо описанного, ХП1 пишет это место, id рейса, и id копии программы в таблицу зарезервированных мест.
Каждая копия программы пишет себя с определенной периодичностью в специальную таблицу. Триггер этой таблицы смотрит все записи, у которых превышен период ожидания и считает эту копию "отломившейся". Соответственно удаляет все последствия потери связи.
> Sergey13 © (28.09.06 09:27) [44]
>
> > [42] alabama01 (28.09.06 03:04)
>
> А сколько у тебя кассиров?
Пока трое. Количество будет расти.
Sergey13 (2006-09-28 09:27:00) [36]> [42] alabama01 (28.09.06 03:04)
А сколько у тебя кассиров?
atruhin (2006-09-28 09:24:00) [37]А что будет при обрыве сети, и если место заблокированно?
alabama01 (2006-09-28 03:04:00) [38]Решение найдено следующее:
пишем dll active-x, которая ,будет работать на сервере и ХП1, которая будет ее запускать. Регистрируем на сервере dll.
Далее:
1) форма продажи при открытии, в отдельном потоке, создает ожидание события Event1;
2) после выбора места в комбобоксе со свободными местами запускаем ХП1 с передачей в параметрах id рейса и номера выбранного места.
3) ХП1 запускает в dll функцию, которая смотрит наличие данного свободного места и, если оно действительно свободно, то записывает его как занятое, и возвращает новое число со списком свободных мест, если же оно уже занято, тогда - 0. Все это описано в критической секции.
4) Если результат не 0, тогда функция сбрасывает событие Event1.
5) Форма продажи получает сброс события и новое число с местами, затем смотрит, если на ней есть такой рейс, то пересчитывает число в места и перересовывает комбобокс с новыми свободными местами.
6) форма продажи снова создает ожидание события Event1;
alabama01 (2006-09-28 01:22:00) [39]
> Sergey13 © (27.09.06 08:28) [36]
> Придумываешь ты. 100 автобусов в день по 60 человек 365
> дней в году = 2190000 записей. Детский лепет при наличии
> индексов.
Не такой уж и лепет, если учесть, что данная операция проводится каждый раз при пробитии билета. те же 2190000 раз в год, а то и больше, когда не требуется продать, а надо просто посмотреть наличие свободных мест.
> evvcom © (27.09.06 08:28) [37]
> Т.е. сервер асинхронно извещает всех своих подписчиков (кассиров)
> о проданном месте? Хорошая фича.
Без нее вообще беда.
> MsGuns © (27.09.06 13:26) [38]
>
> Все эти "лочания" незаметно превращаются в "глючения".
> Прежде чем решать подобные проблемы неплохо хотя б в общих
> чертах познакомиться с подобными системами. Хотя бы просто
> поинтересовавшись как функционирует бронирование в гостинницах
> например у администратора. Или в тех же ж/д кассах.
> Ключевое слово - "резервирование" или его варианты.
Да я, собственно, поэтому и задал вопрос на форум. Да и как осуществить это резервирование, если билеты продаются как горячие пирожки?
> Desdechado © (27.09.06 15:48) [39]
Для скорости.
> Anatoly Podgoretsky © (27.09.06 16:03) [40]
Как?
Anatoly Podgoretsky (2006-09-27 16:03:00) [40]Не надо ничего блокировать, надо резервировать для продажи. Срок резервирования ограничить.