Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Продажа билетов несколькими кассирами [D7, MSSQL]


Страницы:   1 2 3 4

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]

Не надо ничего блокировать, надо резервировать для продажи. Срок резервирования ограничить.


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо