|
|
|
Проблема с CommitTrans...
|
|||
|---|---|---|---|
|
#18+
Тут такое дело... Необходимо было сделать поле-номер, альтернативу счетчику, но с возможностью правки. Т.е. при открытии некой формы дефаултом определенному полю давалось макс.значение по таблице. Но: Если до момента сохранения этой записи этим пользователем кто-то другой захочет ввести новую запись и откроет эту же форму у себя, макс.значение будет таким же как у пользователя 1. Поэтому было реализовано следующее: создана системная таблица, в кот. помещалась инфа о том, кто/что делает (например вводит новую запись), а остальным давался отлуп на это время. Так вот: самое интересное, что при открытии вышеозначенной формы какбы первым пользователем (проверяется процедурой) производится запись в сист.таблицу, НО! Эта запись почему-то не сразу оказывается записаной физически! Примечание: клиентская часть (интерфейс - линки) + серверная (таблицы), все .mdb. Пытался через CommitTrans с параметром dbFlushOSCacheWrites - ругается, не знает такой. (хотя в Хэлпе есть...). Я это к тому, что видимо в буфере, зараза, сидит, и не сразу на диск сбрасывается... А проблема в том, что другой пользователь, даже после "регистрации" первого в теч. 1-2 сек. может тоже какбы "зарегистрироваться", не найдя физически в таблице отметку первого... Как выйти мне из этой коллизии? Помогите советом, пожалуйста! Борис ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2003, 21:44 |
|
||
|
Проблема с CommitTrans...
|
|||
|---|---|---|---|
|
#18+
dbFlushOSCacheWrites тебе не помогла даже если бы работала.\r Смотри в недописаный пока еще фак. Там есть пример из Гетца как идентификаторы раздавать в многопользовательских системах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2003, 22:18 |
|
||
|
Проблема с CommitTrans...
|
|||
|---|---|---|---|
|
#18+
1) Почему? 2) Так какой же вариант из предложенных выбрать? Гетца? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2003, 22:25 |
|
||
|
Проблема с CommitTrans...
|
|||
|---|---|---|---|
|
#18+
Честно скажу, с такой проблемой давно не встречался. А в акцессе стараюсь ее обходить, например, теми же счетчиками. Но, кажется, в акцессе должно бы заработать так: открываем служебную таблицу (говорю про мдб), например, тем же openRecordset, или иначе, насильно заставляя сделать Refresh ( Метод Refresh немедленно обновляет записи в базовом источнике данных указанной формы в режиме формы или в режиме таблицы в соответствии с изменениями данных, внесенных текущим и другими пользователями в сети. - из справки), и читаем из нее новый значение твоего счетчика. Причем счетчик в простейшем случае (не зря же он так сделан в самом акцессе) не должен обращать внимание на отмены и пр. ерундистику. Внесены изменения =(максимальное значение из имеющихся или "я") +1. Чем больше хочешь, тем больше фрикций надо отслеживать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2003, 22:25 |
|
||
|
Проблема с CommitTrans...
|
|||
|---|---|---|---|
|
#18+
Ой, пока размечтался, забыл про фак... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2003, 22:26 |
|
||
|
Проблема с CommitTrans...
|
|||
|---|---|---|---|
|
#18+
Да нет, ну фак, фак... Среди предложенных решений отметил для себя 2: Гетца и Alter... Последний не понял... А суть проблемы в следующем: 1) Открывается форма 1 пользователем; 2) Присваивается значение опред.полю (ака счетчик) = максимому по таблице (OnLoadForm); 3) Заполняются другие поля 1 пользователем; а в это время... ;) 4) 2 пользователь открывает у себя эту же форму; 5) получает максимум по таблице - такой же как и 1, т.к. 1 еще не сохранил запись в саму таблицу и максимум, даже по встроенному счетчику, будет такой же... 6) конфликт... Вот какие были у меня соображения... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2003, 22:42 |
|
||
|
Проблема с CommitTrans...
|
|||
|---|---|---|---|
|
#18+
2 borisb Почему? Потому что 1. 1-й пользователь проверяет системную таблицу - видит что никто не добавляет новых записей 2. 2-й пользователь проверяет системную таблицу - видит что никто не добавляет новых записей 3. 1-й пользователь регистрится в системной таблице и начинает добавлять (высчитывает новый идентификатор) 4. 2-й пользователь регистрится в системной таблице и начинает добавлять. Высчитывает идентификатор - получает то же самое что и 1-й пользователь в п.3 Проглючит даже если все моментально записывается куда нужно. Надо где-то что-то блокировать. Где и что - решай сам, если Гетцевый пример по каким-либо причинам не подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2003, 22:43 |
|
||
|
Проблема с CommitTrans...
|
|||
|---|---|---|---|
|
#18+
Слегка апаздал borisb писал:6) конфликт... Ну и 7) Подсчитал новое значение идентификатора 8) Подставил новое значение идентификатора 9) Попытался опять сохранить. И так хоть до посинения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2003, 22:49 |
|
||
|
Проблема с CommitTrans...
|
|||
|---|---|---|---|
|
#18+
Подскажите тогда как/где использовать Гетцовские ф-ции: adhAssignID, adhGetNextAutoNumber... Там в комментах типа на ДоВставки надоть инструкцию вставлять... Не врубился пока, как это чудо работает ;). У меня есть: 1) поле Long, максимум по кот. мне и нужно вычислять; 2) форма, содержащая это самое поле. На Загрузку этой формы и поставлено у меня вычисление максимума и +1... Как задействовать выщеописанные ф-ции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2003, 22:59 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32294681&tid=1678848]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
57ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 348ms |

| 0 / 0 |
