Форум сайта python.su
baluПредположим, что есть некая таблица со списком свободных на данный момент машин.
Смысл в таком обновлении?
Офлайн
2 Smar. Выхода 2. Либо перечитывать данные по таймеру. Самая простая реализация, но имеет следующие минусы:
1) важно решить как часто надо обновлять данные, чтобы и не загружать железо и обновлять почаще.
2) в периоды между обновлениями данные могут устареть
3) велика вероятность возникновения ситуации, когда ты перечитываешь данные и заносишь их в таблицу, а в это время уже данные изменились. Либо ты делаешь операцию над записью, и в это время начинается обновление по таймеру - тут надо делать блокировку таймера, а это чревато конфликтом внесенных данных.
Реализация посложней. 1 раз загрузить в таблицу, а при операции над записью перечитывать данные для конкретной записи, обновляя и строку в таблице, и данные в форме заполнения. Если данные не подходят пользователь получает отлуп. Также желательно делать аналогичную проверку во время операции модификаци уже на уровне СУБД.
Офлайн
SmarНе, ну с таких позиций… нужно архитектуру и ui планировать для разруливания таких ситуаций. Грид, IMHO, не самое лучшее решение.baluПредположим, что есть некая таблица со списком свободных на данный момент машин.
Смысл в таком обновлении?
Оператор выбирает из этого списка машину и отправляет ее по маршруту. Естественно машина из категории свободных переходит в категорию занятых. Все пока удачно складывается. Но в это же самое время или чуть по позже оператор на другой локальной станции выбирает эту же самую машину(данные грида у него не изменились и машина числиться в числе свободных) и отправляет ее по другому маршруту. Вопрос: Что делать водителю? И по какому маршруту он пошлет операторов и прогу?
Вот для того чтобы лишних вопросов не возникало и нужно динамическое обновление всех гридов после изменений в бд.
Пример из головы. На самом деле может быть все намного серьезнее.
Отредактировано (Март 12, 2008 11:04:43)
Офлайн
j2aВернемся к модели:
Та же самая модель с машинами, но, допустим, ты сделал, что в гриде статус машины push-ится всем пользователям. Пользователь видит - машина свободна, начинает отправлять ее по маршруту. Пока вводит данные о маршруте, другой диспетчер эту же машину успевает отправить по другому маршруту. Статус в гриде поменяется, но диспетчер этого уже не увидит.
Я просто к тому, что за-push-ивание данных в грид не спасет. Нужно думать о блокировках. Т.е. если диспетчер открыл запись на редактирование, то другие это сделать не могут.
j2aВ wxPython при реализации MVC модели с бд используется PyGridTableBase. Напрямую этот класс не связан с гридом, но имеет все те же недостатки, что и собственно грид(см. выше). Увы, но это так. Но если честно я не знаю другого инструмента в wx.
Грид, IMHO, не самое лучшее решение.
Офлайн
SmarТе же яйца, только в профиль.j2aВернемся к модели:
Та же самая модель с машинами, но, допустим, ты сделал, что в гриде статус машины push-ится всем пользователям. Пользователь видит - машина свободна, начинает отправлять ее по маршруту. Пока вводит данные о маршруте, другой диспетчер эту же машину успевает отправить по другому маршруту. Статус в гриде поменяется, но диспетчер этого уже не увидит.
Я просто к тому, что за-push-ивание данных в грид не спасет. Нужно думать о блокировках. Т.е. если диспетчер открыл запись на редактирование, то другие это сделать не могут.
При выборе свободной машины оператор автоматически переводит ее в разряд занятых.
Технически организовать это не сложно. Предположим в таблице есть поле “Выбор” имеющее значения True\False. Выборка в грид идет по условию False. При выборе машины поле принимает значение True, что противоречит условию. Соответственно машина должна автоматом исчезнуть из грида. Ничто не мешает ей туда вернуться в случае отмены выбора. Вот эти изменения и должны дойти до всех локальных станций. Тогда необходимость что либо блокировать на данном этапе пропадает.
SmarЯ к тому, чтобы вообще пересмотреть ui. Так ли необходимо оператору постоянно видеть список свободных машин? Возможно, он нужен только тогда, когда она добавляет новую заявку? Возможно, есть смысл использовать другой контрол, не грид? Тут необходим анализ сценариев работы.j2aВ wxPython при реализации MVC модели с бд используется PyGridTableBase. Напрямую этот класс не связан с гридом, но имеет все те же недостатки, что и собственно грид(см. выше). Увы, но это так. Но если честно я не знаю другого инструмента в wx.
Грид, IMHO, не самое лучшее решение.
Отредактировано (Март 12, 2008 13:27:54)
Офлайн
j2aСогласен, путей обхода этой проблемы не много, их очень много.
Я к тому, чтобы вообще пересмотреть ui. Так ли необходимо оператору постоянно видеть список свободных машин? Возможно, он нужен только тогда, когда она добавляет новую заявку? Возможно, есть смысл использовать другой контрол, не грид? Тут необходим анализ сценариев работы.
Офлайн
SmarНет. Это проблема при текущем подходе. Я редко встречал ситуации, когда pushable grid был бы акутален (плюс, он еще очень плохо масштабируется). Чаще всего, это ошибки в проектировании системы/ui. Я не говорю, что у тебя эта ситуация. Но программисту чаще легче сделать pushable grid, чем пересмотреть и проанализировать сценарии работы.j2aСогласен, путей обхода этой проблемы не много, их очень много.
Я к тому, чтобы вообще пересмотреть ui. Так ли необходимо оператору постоянно видеть список свободных машин? Возможно, он нужен только тогда, когда она добавляет новую заявку? Возможно, есть смысл использовать другой контрол, не грид? Тут необходим анализ сценариев работы.
Дело не в конкретной модели. В конце концов это всего лишь модель.
Обойти проблему-не значит ее решить. Как показывает практика не решенная проблема в конце концов вернется, при чем в самый неподходящий момент. Я пытаюсь понять можно ли вообще это решить, а не как это обойти.
Офлайн
Согласен, легче. Но почему-то легче не стало. :)
Офлайн
SmarЧем не подходит предложенный мной вариант?
Согласен, легче. Но почему-то легче не стало.
Офлайн
baluПо первому варианту:
Smar написал:
Согласен, легче. Но почему-то легче не стало.
Чем не подходит предложенный мной вариант?
Офлайн