|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Добрый день! У нас осуществляется телемаркетинг тремя телемаркетологами. Есть общий список задач на обзвон (предикторы они у нас зовутся). По логике каждый берет в работу первого свободного и работает с ним. Вот цепочка запросов: Вызывается запрос на обновление (во вложении скрин схемы): Код: sql 1. 2. 3. 4. 5.
Который ссылается на запрос Предиктор_резервирование_фильтр : Код: sql 1. 2.
Который ссылается на запрос Предиктор_резервирование_выборка : Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
В третьем запросе мы всегда проверяем резервацию: Код: sql 1. 2.
Однако периодически происходит конфликт, когда два телемаркетолога получают одно и тоже задание в работу. После Update я запрашиваю идентификатор зарезервированной записи. и создаются связанные записи в таблице звонков. И телемаркетологу открывается форма с установленным фильтром. Но, когда оба телемаркетолога получают задание, то происходит следующее: в предикторах стоит информация о последней резервации. Разница между двумя актами резервации - 2-3 секунды. Во всех указанных выше запросах стоит блокировка изменяемой записи. В аксе (он кстати 2010-й) стоит блокировка на уровне страниц. При выполнении запроса в ручном режиме, такого конечно не происходит, такое я могу получить только при стресс-тесте системы, когда в один момент два телемаркетолога целенаправленно нажимают на кнопки... Видимо Update первого телемаркетолога происходит после Select, но до Update второго. Как Вы решаете вопросы управления очередью задач? Подскажите пожалуйста. Как быть? Блокировать таблицу? Что здесь вообще происходит?))) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2016, 11:06 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
ТоликmanКак Вы решаете вопросы управления очередью задач? Код: sql 1. 2. 3. 4. 5. 6. 7.
Код: vbnet 1.
Код: sql 1. 2. 3.
Если запись возвращена - резервирование выполнено, обрабатываем. По окончании обработки Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2016, 11:31 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
ТоликmanДобрый день! День сурка? http://www.sql.ru/forum/1235972/access-lokalnaya-set-i-zapros-na-vyborku?hl= Я так понимаю обновление DDE не помогло ? Добавьте галочку в таблицу выбора "занят/свободен" - на форме висит и обновляется по таймеру список для работы (захвата) со статусом. - взять в обработку можно только со статусом "свободен". - после выбора в списке сначала делаем на него принудительно requery (на случай устаревшего статуса) и если статус по прежнему "свободен" - меняем его тут же на "занят" и берем в обработку... Оставьте в покое эти хлипкие и неуверенные признаки "занят/свободен" (наличие или отсутствие где-то, каких-то записей да еще с признаками...) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2016, 11:44 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
vmag, Я хотел сначала ее продолжить, но понял что уже немного другой запрос :) Автономные файлы выключили везде принудительно, но да, ошибка сохранилась. Сейчас телемаркетолог не видит список, он просто нажимает "Следующее задание" и ему открывается форма с конкретным заданием. И я уже так сделал, там прямо в таблице самих задач добавил два поля - Кем зарезервировано и когда. Обновляю как раз эти поля. И все равно в конфликтных ситуациях происходит обновление одной и той же записи! ((( ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2016, 12:03 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Провел еще один эксперимент: Установил во всех трех запросах блокировку всей таблицы. И получил ситуацию - одновременно могут работать только два сотрудника, третий (последний подключившийся) видит ошибку "Таблица заблокирована"... И блокировка снимается только по факту закрытия всего аксесса любым из первых двух участников. Таблица входит в блокировку на этапе выполнения соответствующего запроса, а выходит из нее только после закрытия акса. Видимо, дело в том, что сама таблица также используется в других формах, и поэтому блокировка сохраняется до момента закрытия последней связанной формы - а это главная форма, которая показывает одну цифру: количество доступных задач... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2016, 12:09 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Akina, Два вопроса: 1. Принципиально вложить один запрос в другой прямо в тексте SQL? Чем это отличается от создания двух запросов в аксе, где первый ссылается на результаты второго? 2. sleep 100? Какие конфликты он должен обойти? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2016, 12:14 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
1) Избегаем материализации и получаем атомарность действия. 2) Это типа "демонстрация намерений". На самом деле желательно больше, по максимуму возможного, но чтобы не выпадать из зоны комфорта по скорости работы. Принципиально здесь - вторым запросом проверить, что при апдейте выбранной записи в неё записаны именно те данные, которые записывались, а не чьё-то ещё поверх. Хотя Акс для таких моментов явно инструмент неподходящий, с его-то файловым контролем блокировок. Желательно использовать полноценный SQL-сервер (а взять хотя бы и СЕ). ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2016, 15:02 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Akina, 1) я просто думал, что акс при составлении запроса соединяет их в своем движке и только потом выполняет - зря я так думал? Ладно, тогда это может и поможет... 2) А что там файловой блокировкой, я думаю что видимо в ней тоже есть проблема, точнее в моих знаниях об этом... ??? Про сервер - это тонкий ход. Стратегия жестокая конечно же. Сейчас я хочу показать что в данной маленькой задаче надо перейти к автоматизации. Некоторое время поработать и показать эффективность персонала. И после этого инициировать разработку системы на базе нормального сервера, конечно же... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2016, 15:24 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Толикmanзря я так думал? Угу... ТоликmanА что там файловой блокировкой Блокирование в БД Аксесс осуществляется записью информации об объектах блокирования в файл блокировок (.LDB, одноимённый с БД). Так что на самом деле это и не блокирование вовсе, а так... всё чисто "на доверии". ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2016, 15:57 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
ТоликmanИ после этого инициировать разработку системы на базе нормального сервера, конечно же...Ну так и показывай сразу на базе SQL-сервера. MS SQL Compact Edition для этого вполне подходящая платформа, хотя никто не мешает использовать и другие бесплатные серверы (Firebird, MySQL), благо с драйверами к ним проблем нет. Только настроить всё на выполнение запросов на стороне сервера... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2016, 15:59 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Akina, Я вообще не админ :) Базу дают на уровне региона, а мне нужен макрорегион. Остальные регионы не получат доступ... Я бы такие проблемы не испытывал... ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2016, 20:22 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Блин. Если запрос выполняется в одну и ту же секунду, то система бронирует одну задачу за несколькими сотрудниками. Судя по всему проблему в том, что в очередь встает файл с блокировкой... Надо продумать систему заблаговременной резервации, т.е. вышел на работу, и система зарезервировала тебе на 5 задач вперед. и управлять это заблаговременной очередью... таким образом перезаписываться будут будущие задачи, а не текущие. Может есть такой опыт? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2016, 11:59 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
если конфликтуют несколько приложений - клиентов, возможно стОит где-то повесить один экземпляр акцесса, который синхронно будет распределять задачи, по таймеру, а остальные - клиентские - только смотреть на результат его деятельности? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2016, 12:31 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
просто закронить на машине где база лежит маленький vbs-скриптик, который коннектится и за 5-6 запросов через ADO все распеределяет. Раз 3 секунды. я бы наверное так сделал... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2016, 12:35 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Вашу тему можно реализовать по другому - при запуске экземпляра одним из сотрудников - выдать ему право распределять очередь, а все остальные смотрят на его результаты - здесь можно и потратить пару секунд при запуске... Соответственно создать таблицу, в которой регистрируется этот экземпляр-координатор. Вот это идея, спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2016, 12:44 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
- мне в этом варианте не нравится, что если он акс срубит, то как бы ой. Но, может как-то додумать до точки и выйдет? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2016, 13:58 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Vladimir Baskakov, Мониторить сессии, у меня запускается фоновая форма, которая раз в 5 минут обновляет дату активности сотрудника. И есть запрос, который показывает активных сотрудников (дата активносте < 7 минут назад). Соответственно каждый должен мониторить дату актуализации данного счетчика, как только зависание произошло - стать лидером. Но я сейчас пробую пока по другому... Пробую регистрировать в очередь сразу 3 задания. И каждый раз регитрсировать по три задания (включая обновление ранее зарегитсрированных). И поменять очередность - сначала привязываем задание, а потом резервируем следующие задания. Таким образом в работу будет поступать задание, которое уже точно ни кем не пере-запишется. И каждый раз очередь будет на 3 задания вперед. Таким образом конфликт может быть только при первой регистрации очереди - такой разовый конфликт можно предусмотреть. Конфликты сами по себе останутся, но они будут происходить по задачам, до которых пользователь еще не дошел - ну как бы да и ладно. В итоге период синхронизации равен времени отработки одного задания - т.е. с запасом... При выходе убивать лишнюю резервацию. Также делать проверку по активным сессиям (если свет вырубило) - если активной сессии нет, а резервация есть - то задачи можно брать в работу... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2016, 15:57 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
http://www.sql.ru/forum/1228109/dve-mashiny-edut-po-doroge-s-2-polosami-navstrechu-drug-drugu-kak-im-ne-stolknutsya так, вспомнилось. В общем случае, по моему, если надежного механизма лока записей (семафоров) нет - коллизий исключить нельзя. это из параллельного программирования. можно, только чтобы важным делом занимался ровно 1, заранее всем известный, процесс. Мы можем предлагать - как сделать похожее на лок, за счет флажков, но - логически - коллизии не избежать .... как мне показалось. Другой вопрос - цена коллизии с т-зр бизнеса? ну позвонят одному клиенту 2 манагера (очень редко почти никогда) - - может и фиг с ним? ...... у одного будет занято. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2016, 16:30 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Vladimir Baskakov, Vladimir BaskakovДругой вопрос - цена коллизии с т-зр бизнеса? ну позвонят одному клиенту 2 манагера (очень редко почти никогда) - может и фиг с ним? ...... у одного будет занято. Я тоже на это ставку делал, позвонят раз в месяц и бог с ним... Каждый день!!! по несколько коллизий! Там проблема возникает еще у некоторых - обновление в таблицах происходит с задержкой. Как-будто акс откладывает запрос реальных данных и тянет их из кэша - подключился с тимвивера на оба компа - смотрел в одну и ту же таблицу, данные отличались - в одной с новыми данными, в другой нет (F5 не помогало). Но достаточно было начать вносить данные, как таблица обновлялась и появлялись новые/измененные записи... Здесь я вообще не знаю с чем бороться. На одном ресурсе решил проблему, там папка реплецировалась на двух зардах. Но на обычном компе такая проблема осталась, хотя автономные файлы выключены везде где можно... Как будто у акса есть свой кэш... И из-за этого в одном регионе телемаркетологи даже в растянутом по времени диапазоне попадают на одно задание... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2016, 21:06 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Тема наверное закрыта. Это мои кривые руки. Проблема крылась именно в сессиях. Некорректно сохранялись активные сессии, тем самым система думала, что сотрудник не работает и выдавала его задачу в работу дргим... Всем спасибо, выработанное решение с очередью на будущее и единым диспетчерским процессом я сохраню в копилку. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2016, 21:37 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Толикman, ну раз уж я начал тему, возьми мой пример потестируй на своей сетке (решение по признакам, флажкам или как там...) имхо теоретически коллизии могут быть, но на практике - думаю не получится у тебя... - таблицы вынеси в отдельный файл, а к файлу с формой и запросами прилинкуй их на разных машинах... Описание: 1. Выбираем юзера. - слева его рабочие заявки (хоть закрывай форму - будут и завтра) - в середине не обработанные заявки, - справа выполненные - кнопки соответствуют спискам над ними. 2. Выбираем в середине заявку, нажимаем Взять заявку в обработку! Другой юзер (хоть его список старый, уже не сможет эту заявку взять себе). Ну и тонкости: - Перед захватом заявки рекомендуется нажать Обновить статус не обработанных заявок. - можно отменить и взятую заявку и уже обработанную - падают назад в не отработанные... П.С. - на код особо не смотри - процентов 50-60 сделано мастерами (кнопки) - посмотри лучше схему БД - поймешь смысл... - Изюм: перед пометкой что заявка будет захвачена DLOOK апом проверяется её статус на свободность, в этом месте тебе будет ОООчень трудно сделать коллизию... - ну и толком не тестировал, прощай косяки если чё... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2016, 23:17 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Кстати - вот оно и готовое рабочее место главного менеджера (выше) - добавить еще один список справа (Все обрабатываемые заявки)... - а если потом еще прикрутить к форме таймер и мозги - то можно на автомате пихать свалившуюся новую заявку менеджеру, у которого их меньше всего и главный юзер-распределяло уже не нужен ... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2016, 23:29 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Если речь зашла про многопользовательские приложения, хотелось бы напомнить о механизмах, без знания которых вы будете получать ошибки. 1) это наличие кэша, который по умолчанию обновляется с задержкой. Так что при получении критичных данных нужно кэш обновлять: Код: vbnet 1.
2) опять же тот же кэш, который не сразу выплевывается на сетевой ресурс, поэтому критичные данные нужно записывать с использованием транзакций примерно так: Код: vbnet 1.
3) Блокируем таблицу с критичными данными: Код: vbnet 1.
4) Не забываем, что по умолчанию попытка повторно заблокировать ресурс в случае наличия блокировки происходит через 100 милисекунд и может случиться так, что два или более приложения будут пытаться заблокировать ресурс через одно и то же время - соревноваться. Для предотвращения этого в разных экземплярах приложения нужно поменять эту установку на случайное число: Код: vbnet 1.
Вот здесь это подробно расписано: https://support.microsoft.com/en-us/kb/191253 ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 06:49 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
MrShinЕсли речь зашла про многопользовательские приложения, хотелось бы напомнить о механизмах, без знания которых вы будете получать ошибки. 1) это наличие кэша, который по умолчанию обновляется с задержкой. Так что при получении критичных данных нужно кэш обновлять: Код: vbnet 1.
2) опять же тот же кэш, который не сразу выплевывается на сетевой ресурс, поэтому критичные данные нужно записывать с использованием транзакций примерно так: Код: vbnet 1.
3) Блокируем таблицу с критичными данными: Код: vbnet 1.
4) Не забываем, что по умолчанию попытка повторно заблокировать ресурс в случае наличия блокировки происходит через 100 милисекунд и может случиться так, что два или более приложения будут пытаться заблокировать ресурс через одно и то же время - соревноваться. Для предотвращения этого в разных экземплярах приложения нужно поменять эту установку на случайное число: Код: vbnet 1.
Вот здесь это подробно расписано: https://support.microsoft.com/en-us/kb/191253 MrShin, вот за все это огромное спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 08:14 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
ТоликmanMrShin, вот за все это огромное спасибо! Так, на всякий случай - в моем варианте физически нельзя получить одну и ту же заявку более чем одному юзеру, это реализовано на уровне схемы БД... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 08:41 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
vmagТак, на всякий случай - в моем варианте физически нельзя получить одну и ту же заявку более чем одному юзеру, это реализовано на уровне схемы БД... Так MrShin пишет про кэши, на уровне схем то все ОК, но если кэш не залился в сеть, то схема ни схема а другой юзер не видит этих данных, или я ошибаюсь? Я попробую сегодня/завтра протестировать твой вариант) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 10:26 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Толикmanно если кэш не залился в сеть да мне как то эти кэши ... - Запрос на изменение в таблице прямой (захват заявки) - Проверка перед захватом тоже прямо в таблице (кинжальная) имхо должно работать - максимальная плюха которая теоретически может быть это когда все по команде нажмут одновременно кнопку "Взять заявку в обработку!" и все захотят одну и ту же заявку - при этом заявка упадет только кому-то одному, а у других ничего не изменится, только в списке свободных заявок этой заявки уже не будет... но и эту ситуацию можно обыграть - при нажатии кнопки "Взять заявку..." посчитать в начале сколько заявок в работе у этого юзера (в левом списке), а после захвата обновить список и опять посчитать сколько стало, если количество не изменилось, то выдать комментарий - Извини, не успел!... Чем меньше надобности в танцах с бубнами - тем надежнее система... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 11:02 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
vmag- Проверка перед захватом тоже прямо в таблице (кинжальная) Как же, акс ведь из кеша может дернуть эту инфу, я такое наблюдал... а потом он тупо запустит запрос на изменение, который не позарится на внесенные недавно изменения, вот это и генерирует проблему... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 14:26 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
ТоликmanЯ попробую сегодня/завтра протестировать твой вариант) ТоликmanКак же, акс ведь из кеша может дернуть эту инфу, я такое наблюдал... после тестирования, пожалуйста отпишитесь о результате, для меня это тоже важно, до сих пор проблем не было, от 5 до 10 юзеров ни разу не перехлестнулись лет за 10, правда ситуация немного другая, но подход такой же - захваты по признакам сразу из таблиц и сразу в таблицах, а не на базе запросов и в запросах... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 15:44 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
vmagпожалуйста отпишитесь о результате, для меня это тоже важно Сегодня и завтра не выйдет потестить, только в ПН. Сейчас все подготовлю для этого. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 22:08 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
MrShin, Вопросы появились: Если я выключу транзакции в запросе к одной таблице, чем я рискую? По логике вещей - ничем, верно? Там идет обновление 3-х записей в одной таблице. Риск потери данных из-за выключения компа точно такой же, как и при завершении транзакций, верно? Про 100 милисекунд - как на практике происходит соревнование за доступ к ресурсу? Жесткий диск разве сам не выстраивает очередь? Один юзер получит доступ, а другой получит отказ и повторит попытку только через следующие 100 милисекунд, верно? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2016, 23:53 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Толикman, Транзакция на один запрос имеет смысл только для того, чтобы быстрее сбросить кэш, так что вам не особо это нужно. Вообще я сам не совсем понял, зачем требуется менять задержку, если таблица СНАЧАЛА блокируется и на чтение и на запись, а уже только потом что-то делается с данными. Задержка и число попыток требуются вообще-то при попытке записи изменений, когда таблица/запись оказывается заблокирована другим пользователем, в данном случае ошибка произойдет уже на этапе создания рекордсета и повторных попыток Акс автоматом делать не будет, насколько я понимаю, хотя могу и ошибаться. Полного описания как именно происходят блокировки с временными циклами я не видел. Возможно, реальная блокировка происходит все-же не в момент открытия рекордсета, а позднее, тогда задержка уже нужна. В общем, в вашем случае я бы не особо заморачивался с многопользовательскими штучками, т.к. вероятность того, что ваши 3 несчастных пользователя нажмут кнопку одновременно ничтожно мала. Они нужны, когда автоматические процессы меняют тысячи записей подряд, и действуют несколько таких процессов одновременно. В этом случае вероятность коллизий резко возрастает. А для такого рода задач я бы Акцесс не выбрал, для этого есть серверные базы данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2016, 06:01 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
MrShinВ общем, в вашем случае я бы не особо заморачивался с многопользовательскими штучками, т.к. вероятность того, что ваши 3 несчастных пользователя нажмут кнопку одновременно ничтожно мала. Они нужны, когда автоматические процессы меняют тысячи записей подряд, и действуют несколько таких процессов одновременно. В этом случае вероятность коллизий резко возрастает. А для такого рода задач я бы Акцесс не выбрал, для этого есть серверные базы данных. я акс использую как замену екселю, когда надо добиться корректного заполнения обязательных полей :) ну и как обычно уносит в автоматизацию, там это хоть как то реализовано. Я до последнего отказываюсь от VBA, мне в 99 из 100 случаев достаточно штатных макросов, что позволяет избежать потребности в безусловном разрешении выполнения всех кодов VBA. Раньше я каждый чих пытался прописать в VBA, но когда понял, что в аксе лучше ничего серьезного даже не проектировать, то ушел от этой концепции, и зачастую оказывается, что есть более оптимальные решения и без VBA, просто не хватает знаний возможностей приложения. Транзакции по умолчанию включены во всех запросах (созданных через конструктор) акса. И как я понял, при выполнении макроса, акс открывает транзакцию и только после его завершения закрывает ее. а у меня там прилично запросов подряд выполянется, сначала резервируется клиент, а потом дописываются данные в связанные таблицы (подтягивается список услуг, информация по речевому модулю и всякая мелочь) - видимо все это идет в рамках одной транзакции... А когда еще и форма открывается (также из штатного макроса) то транзакция видимо вообще закрывается после закрытия формы, соответственно только тогда и происходит отложенная запись изменений. Такие выводы делаю из-за очень частых конфликтов (я тоже считаю что вероятность в один момент направить запрос к БД крайне мала, там ведь даже не секундами считается). Сейчас выключил в ключевых запросах транзакцию, буду пробовать так... Если и это не поможет, то напишу логику на VBA. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2016, 12:27 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
ТоликmanЯ до последнего отказываюсь от VBA у меня есть мопед, но я до последнего не пользуюсь мотором - кручу педали когда езжу... Тут как-то кажется DB. (могу ошибаться) сказал: на акцессе можно реализовать всё, ну по крайней мере - почти всё... естественно, вне VBA эта фраза теряет всякий смысл... Думаю, владей бы вы VBA - этого топика не было бы вообще... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2016, 14:17 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Конечно, я ждал такой реакции, хорошо еще фото помидора не прикрепили :) Все, что я ниже написал - это моя призма. vmagу меня есть мопед, но я до последнего не пользуюсь мотором - кручу педали когда езжу... Не согласен с аналогией. VBA - это лом, против которого нет приема. Он нужен когда штатных функций недостаточно. Например хешировать пароль, создать несколько экземпляров одной формы, импортировать данные из excel с динамической шапкой и т.д.. - но тут же возникают проблемы безопасности... Но когда на форуме поднимаются темы, типа: "Как выполнить несколько запросов подряд", "как посчитать количество рабочих дней", "как обратиться к элементу подчиненной-подчиненной формы" и первые советы сразу из VBA. Хотя для всего этого у акса уже есть инструменты, не требующие VBA, но мы их не изучаем, потому что проще на VBA. vmagТут как-то кажется DB. (могу ошибаться) сказал: на акцессе можно реализовать всё, ну по крайней мере - почти всё... естественно, вне VBA эта фраза теряет всякий смысл... Конечно. Даже больше. Если заменить в фразе Access на Excel, то утверждение также останется верным! Я как то делал базу, она анализировала данные одного биллинга (excel не тянул), раздулась до гига. И когда кто-то задел витую пару и произошел кратковременный дисконнект, то рухнула вся база в процессе выполнения сложного запроса, слава богу на сервере есть резервные копии. Тогда для меня стала очевидна ниша акса - это чисто прикладные задачки. И что на счет параметров безопасности? Представляете какая дыра появляется, когда разрешаешь выполнять все VBA-макросы без подтверждения? Ведь на VBA можно сделать все! Или нужна подпись, а если есть центр сертификации на корпоративной сетке, то значит где-то есть и MSSQL, зачем вообще тогда Access - максимум - интерфейс к MSSQL (Вот здесь можно, может даже нужно, работать с VBA, чтобы при компиляции скрыть логику)... Акс отличная песочница, для тех кто хочет получить основы БД, но нельзя на нем строить серьезные решения. А раз нельзя, то зачем сразу все усложнять в VBA? Вот хорошая фраза: Закон МейераУсложнять — просто , упрощать — сложно Стоит тебе уйти с рабочего места, как твои плоды сразу прекращают обслуживаться - в VBA никто разбираться не будет, развития решение получать не будет. Будут либо тебя дергать, либо откажутся от твоего решения. А подключать нового человека из вне - вопрос доверия. Чем проще решение на выходе - тем лучше. Лично мое использование акса сводится к автоматизации повторяющихся запросов и создания форм ввода данных, и лишь для этого VBA явно не нужен. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2016, 13:33 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Толикman, нет ли противоречия в этих утверждениях? Толикman...для всего этого у акса уже есть инструменты, не требующие VBA, но мы их не изучаем, потому что проще на VBA...Толикman...Стоит тебе уйти с рабочего места, как твои плоды сразу прекращают обслуживаться - в VBA никто разбираться не будет... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2016, 15:07 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
хм-м-м, да здесь же о другом. Все кто мутит решения в аксе - это мы, здесь и общаемся. А на работе такие решения появляются в двух случаях: 1. Сотрудник разбирается в аксе - таких единицы; 2. Заказчик (директор/начальник) нашел доверенного фрилансера; И стоить сотруднику уволится/сменить должность или фрилансеру перестать заниматься поддержкой своих решений (все развиваются, все растут, времени не хватает), как решение оказывается заброшенным, и со временем у заказчика появляются потребности по ее развитию. А если решение написано на VBA, то встает вопрос о читаемости кода, здесь заказчик редко предъявляет требования. А с не читаемым кодом кто будет работать? Ушли от темы... прошу прощения. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2016, 16:05 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
решается такая задача следующим образом: есть табличка "задачи", есть табличка "распределенные задачи". отработанная задача удаляется из "распределенные задачи" по таймеру автомат закидывает в "распределенные задачи" очередную задачку тому, у кого задачи кончились ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2016, 19:11 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
_bobрешается такая задача следующим образом: есть табличка "задачи", есть табличка "распределенные задачи". хватит одной таблицы "задачи" с признаком состояния этой задачи, и тогда не нужно будет еще и других таблиц: - решенные задачи - не решаемые задачи .... _bobпо таймеру автомат закидывает в "распределенные задачи" очередную задачку тому, у кого задачи кончились такие вопросы нужно решать комплексно (технически+организационно) ибо много вопросов: - что значит задачи кончились? (если таймер сработал, а у всех есть еще текущие задачи) - я хитрый менеджер - мне упали задачи, я их не делаю, остальные делают, у меня их всегда больше всех, я уехал по своим делам, в конце дня сделал штук 10 и так каждый день, в конце месяца получил как все оклад (нужно вводить кучу правил, нормы, нормативы) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2016, 20:19 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
vmag_bobрешается такая задача следующим образом: есть табличка "задачи", есть табличка "распределенные задачи". хватит одной таблицы "задачи" с признаком состояния этой задачи, и тогда не нужно будет еще и других таблиц: - решенные задачи - не решаемые задачи .... _bobпо таймеру автомат закидывает в "распределенные задачи" очередную задачку тому, у кого задачи кончились такие вопросы нужно решать комплексно (технически+организационно) ибо много вопросов: - что значит задачи кончились? (если таймер сработал, а у всех есть еще текущие задачи) - я хитрый менеджер - мне упали задачи, я их не делаю, остальные делают, у меня их всегда больше всех, я уехал по своим делам, в конце дня сделал штук 10 и так каждый день, в конце месяца получил как все оклад (нужно вводить кучу правил, нормы, нормативы) технически+организационно это решается автоматизацией колл-центра с очередями, сдельной оплатой и многим другим ТС задал конкретный вопрос: как решить технически на акцессе умничать не надо ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2016, 07:52 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
ТоликmanА на работе такие решения появляются в двух случаях: 1. Сотрудник разбирается в аксе - таких единицы; 2. Заказчик (директор/начальник) нашел доверенного фрилансера; Маловато у вас информации по этому поводу. Многие крупные компании сознательно выбирают Акс в качестве основы для вспомогательных решений именно из-за мощности, гибкости и достаточно простой поддержки приложений. В большинстве своем, конечно, сама база на основе SQL серверов, но есть и исключения. Например General Motors для планирования заказов по запчастям использует Access с "родной" файловой базой, причем работает это на основе данных, выгружаемых из SAP. SAP, конечно, хорош, но интерфейс уж больно убогий, а написание нормального дружественного интерфейса стоит баснословных денег. Знаю многие другие крупные компании, использующие Акцесс совсем не по упомянутым причинам. Что касается VBA - да, если вы используете Акс только для построения запросов, то он особо и не нужен. Потом людям начинает хотеться бОльших удобств, и вы начинаете упираться в "потолок" возможностей штатных средств и все равно приходится переделывать на VBA. Сами приложения получаются при правильном подходе не намного отличающимися от решений на том же "промышленном" VB.NET, если это, конечно, не требуем многопоточности и еще некоторых возможностей, которых нет в VBA. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2016, 07:53 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
А если решение написано на VBA, то встает вопрос о читаемости кода, здесь заказчик редко предъявляет требования. А с не читаемым кодом кто будет работать? А если решение написано на куче макросов, в нем разобраться намного проще? кто с этим будет работать...... Если заказчик не предъявил требований, а разработчику все равно, то неуправляемую лапшу и на макросах можно сделать, особенно в случаях как этот - когда нужно точно добиваться обновления кешей и проталкивать изменения в какие-то моменты.... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2016, 09:59 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
vmag, Протестировали мы. Выбрали юзеров и по команде нажали на кнопки. У обоих в списках задач появилась эта задача. Конечно после следующего requery список задач в работе обновится, но как бы на это надо давать таймер и повторять запрос. Я реализовал без VBA эту тему. Запрос на бронирование очереди сделал с выборкой на 3 записи. Таким образом резервируется 3 записи вперед. И каждый раз при выборе нового задания система отбирает 3 записи, еще не отработанные сотрудником, включая ранее им зарезервированные. Т.е. добавляется одна новая запись - на ней ставится резервация. Вот запрос на выборку: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
И запрос на обновление: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Здесь видно, что сначала в работу попадают задачи, зарезервированные раньше остальных. Конфликты остались, но они происходят в задачах до которых юзер еще не дошел, и у него есть 2 задания в запасе для нивелирования конфликта. Если юзер закрывает акс, то все остальные видят, что пользователь перестал быть активным и разбирают его задачи. Кстати достаточно удобно стало планировать отложенные звонки - сразу проставляется сотрудник и нужная дата отложенного звонка, когда время подходит этот звонок попадает в общую гребенку и на основании активных сессий попадает в работу тому же, или другому сотруднику. Единственный возможный явный конфликт - если при старте системы все одновременно начнут работать - здесь я создал форму-прелоадер, которая по таймеру (раз в 2 сек) проверяет успешно ли записались данные - это окно вываливается единожды при начале работы. Стресс тест не выдал конфликтов. В целом стало даже быстрее работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2016, 15:15 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Толикmanvmag, Протестировали мы. Выбрали юзеров и по команде нажали на кнопки. У обоих в списках задач появилась эта задача. Конечно после следующего requery список задач в работе обновится, но как бы на это надо давать таймер и повторять запрос. Забыл написать, в том сообщении приложен твой файл БД (сразу после конфликта) и скриншоты с двух ПК. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2016, 15:18 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
ТоликmanПротестировали мы. Выбрали юзеров и по команде нажали на кнопки. У обоих в списках задач появилась эта задача. мдя... очевидное - невероятное... верю на слово... напрашивается необходимость все таки одного централизованного раздатчика в данном случае... ну раз дожал свой вариант - молодец, чего уж сказать тут... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2016, 17:12 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
vmagнапрашивается необходимость все таки использовать нормальную базу, допустим https://msdn.microsoft.com/ru-ru/library/hh510202.aspx , а акс как фронт-енд, возможно? с нормальными индексами, блокировками. ну и часть кода на vba, которая правильно с этим обращается. ну или использовать как блокировщик допустим файл с каким-то именем на сетевом ресурсе, https://msdn.microsoft.com/ru-ru/library/office/gg264163.aspx открываем монопольно. Открылся - работаем, не открылся - говорим юзеру - попробуй попозже.... сразу как только критическая секция пройдена, и данные гарантированно сброшены на диск - файл закрывается. (вба, с транзакциями, с прочтением и запушиванием буферов) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2016, 17:51 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Vladimir Baskakovну или использовать как блокировщик допустим файл с каким-то именем на сетевом ресурсе, + ну да... перед захватом заявки пробовать создавать файл с именем например НОМЕР_ЗАЯВКИ.TXT, а после исполнения его удалять ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2016, 09:13 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
vmag, Так можно придумать собственную логику блокировки записей) Мы здесь же отбрасываем вариант с использованием серверной БД, запрос был - как решить в Аксе. Вариант с назначением диспетчера вполне актуальный, но: 1. Придется запускать отдельный файл на чьей то машине, и контролировать факт его работы. При этом этот диспетчер должен видимо каждую секунду/три распределять очередь. Ведь если появится новый сотрудник, он же не должен ждать минуту-две пока этот диспетчер очнется с очередной иттерацией. А частые запросы - это все таки нагрузка. Да может потребоваться отдельная машина, ну как минимум отдельный экземпляр. 2. Если вшить логику диспетчера в каждый клиентский экземпляр и определять лидерство - кто первый, тот и диспетчер, и также по секундам раскидывать очередь, то возникает еще одна проблема - запросы влияют на отклик интерфейса - это очень плохо. Вариант с использованием файлов: 1. Дублирует логику самого акса, костыль еще тот. Писать в файл - это подключать API насколько я помню, это достаточно серьезные интеллектуальные вложения, по-моему... Конечно сейчас все копируется. Но все же. 2. какие еще подводные камни? Пока идет запись, другие могут только ждать. Работа с файловой системой влечет дополнительные сетевые ресурсы, там же каждый раз проверяется используется ли файл другим или нет, и это может порождать задержки, а если мы будем постоянно опрашивать, пока файл не будет удален, то эти задержки кратно растут. Поэтому я искал решение проблемы распределения очереди при возникновении такой потребности. И вариант с резервированием на несколько задач вперед вполне подошел. Я выключил транзакции, блокировку оставил на уровне страниц, и получил решение с постоянным доступом к данным. С точки зрения пользователя все работает. С точки зрения решения, происходит управление конфликтами (они просто предусмотрены). Нет задержек из-за блокировок, нет нагрузки на сеть по секундам (единственная нагрузка - раз в 5 минут обновляется сессия по сотрудникам с каждого клиента), нет тормозов в интерфейсе. Думаю что это оптимальное решение. Не требует сложной логики на VBA, т.е. можно реализовать штатными средствами (Макросами), можно простыми командами VBA. Достаточно продумать логику двух запросов - на выборку и обновление. Кстати кому интересны наблюдения за макросами: Пока непрерывно выполняется макрос - блокировка не снимается, и если в конце макроса открывается форма - блокировка связанных с формой таблиц может сохраниться. Чтобы блокировки с таблиц снялись надо сделать перерыв, причем это зависит от скорости работы машины, на домашнем ПК с SSD мне 250 миллисекунд было недостаточно, а 300 уже достаточно, на рабочем с сеткой это значение приблизилось к 450/500. Прерывание можно делать формой с таймером управляя событиями "Открытие" и "Таймер", при этом останавливать сам макрос не обязательно, достаточно открыть форму в режиме диалогового окна. Надеюсь кому-нибудь данный опыт поможет. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2016, 09:41 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
Толикman, Привык как-то доводить дела до конца... В этом файле учтена возможность синхронного нажатия по команде клавишей Enter и совет от Vladimir Baskakov (хотя и измененный)... - В старой версии несколько юзеров смотрели одновременно одно и то же (статус заявки) и захватывали одно и то же, в результате только у одного из них на экране была гарантировано правдивая картинка результата, остальным нужно было повторное обновление списка рабочих заявок... - В этой версии уже никто не смотрит, а пробует застолбить выбранную заявку во временной таблице tmp, естественно это получится только у одного юзера... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2016, 00:32 |
|
3 телемаркетолога и Access
|
|||
---|---|---|---|
#18+
С Наступающим всех! Типа подарки начинаются... Последний (надеюсь) сетевой вариант формы разбора заявок менеджерами с попыткой избежать конфликтов при этом: - всё та же таблица tmp для захвата заявок, но теперь она ещё и информативная, - используется для отображения выполняемых в данный момент заявок, никогда не переполняется, ибо чистится при выполнении заявки или отказе от выполнения заявки менеджером. - хотел показать преимущества использования VBA: информативность, прозрачность, наглядность и т.д. Естественно можно прикрутить дату, время и получать статистику по взрослому... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2016, 17:56 |
|
|
start [/forum/topic.php?all=1&fid=45&tid=1612865]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
230ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
74ms |
get tp. blocked users: |
1ms |
others: | 485ms |
total: | 834ms |
0 / 0 |