Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Узнать, удасться ли OPEN EXCLUSIVE?
|
|||
|---|---|---|---|
|
#18+
Перед расчётом отчёта мне нужно монопольный доступ к базе. Как узнать смогу ли я открыть базу в EXCLUSIVE какой-либо функцией или выдавать OPEN my_base EXCLUSIVE и потом по ON ERROR DO my_err определять по ошибке, что попытка неудачна? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2004, 16:42 |
|
||
|
Узнать, удасться ли OPEN EXCLUSIVE?
|
|||
|---|---|---|---|
|
#18+
Используйте функцию ISEXCLUSIVE(алиас_таблицы) Возвращает .Т., если таблица открыта эксклюзивно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2004, 16:55 |
|
||
|
Узнать, удасться ли OPEN EXCLUSIVE?
|
|||
|---|---|---|---|
|
#18+
Маленький совет: Если расчеты поместить непосредственно в отчет и перед командой REPORT написать: SET LOCK ON , то монопольный режим не понадобится, потому что команда REPORT сама будет блокировать то, что ей нужно. А еще есть команда FLOCK(), которая прекрасно включается там, где надо. На практике эти штуки вредны, но менее вредны, чем эксклюзивный доступ. Потому что не нужно дожидаться, когда все пользователи закроют файл таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2004, 17:11 |
|
||
|
Узнать, удасться ли OPEN EXCLUSIVE?
|
|||
|---|---|---|---|
|
#18+
IsExclusive() также как и IsRLock() отображают результат работы текущего пользователя. Они ничего не могут сказать о статусе таблицы, открытой другим пользователем. Реально только отлавливать ошибку в момент открытия таблицы (ON ERROR или TRY...CATCH). Лучше поступать так, как написал Urri . А вообще-то, я не вижу смысла блокировать данные перед выполнением отчета. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2004, 19:45 |
|
||
|
Узнать, удасться ли OPEN EXCLUSIVE?
|
|||
|---|---|---|---|
|
#18+
Может, чего-то не понимаю... Формирую отчёт. Если в этот момент кто-то изменяет запись, участвующую в отчёте, в отчёт пойдут некорректные данные. Отсюда мысль - заблокировать базу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2004, 11:17 |
|
||
|
Узнать, удасться ли OPEN EXCLUSIVE?
|
|||
|---|---|---|---|
|
#18+
Вообще-то база данных и таблица - несколько разные понятия в VFP. Как правило, отчёт формируется на основании одной или двух таблиц. Совет: сделайте выборку из таблицы в курсор и печатайте его в отчёте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2004, 13:27 |
|
||
|
Узнать, удасться ли OPEN EXCLUSIVE?
|
|||
|---|---|---|---|
|
#18+
Прежде чем предпринимать какие-либо действия следует оценить: 1) Вероятность возникновения исключительной ситуации 2) Ущерб, который может нанести факт возникновения исключительной ситуации 3) Стоимость предотвращения исключительной ситуации с учетом первых 2 пунктов и последствий для других пользователей. В твоем случае ты формируешь отчет. 1) Вероятность изменения данных другим пользователем. Это зависит от времени формирования отчета: чем больше времени необходимо на его формирование, тем выше вероятность внесения изменений другими пользователями 2) Возможный ущерб Если речь идет о какой-либо итоговой справке, то скорее всего берется некая выборка, за достаточно длинный промежуток времени. В этом случае +/-, который может произойти из-за действий другого пользователя не играет принципиальной роли. Ну будет мелкое расхождение, ну и что? Кроме того, следует иметь в виду, что обычно FoxPro работает не напрямую с исходными данными, а с некоторыми буферами. Как системными, так и своими собственными. Это значит, что далеко не всегда изменения сделанные одним пользователем немедленно будут видны другому пользователю. Как правило, другой пользователь может увидеть изменения спустя какой-то промежуток времени. Кроме того, при подготовке отчетов, как правило, формируют некоторую временную таблицу, которая потом и выводится в отчет. В этом случае изменения сделанные другим пользователем вообще роли не играют. 3) Последствия предотвращения исключительной ситуации. Ну, если рассматривать вопрос бокировки (FLOCK()), то очевидно, что пока один пользователь выполняет отчет никто не сможет внести никаких изменений. А если речь идет об эксклюзивном открытии (EXCLUSIVE), то никто вообще не сможет работать с данной программой пока выполняется отчет. Это при том, что надо еще предусмотреть штатный вход и выход из режима блокировки. Тоже та еще задача. Итого: Вероятность события - невысокая Последствия - незначительные Стоимость предотвращения - высокая Т.е. ты потратишь кучу времени и сил, на практически бесполезную работу. Ну, разве что, с целью самообразования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2004, 14:48 |
|
||
|
Узнать, удасться ли OPEN EXCLUSIVE?
|
|||
|---|---|---|---|
|
#18+
Как уже советовали, лучший вариант - сделать выборку в курсор. А узнать, удасться ли предположительно OPEN EXCLUSIVE можно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2004, 08:52 |
|
||
|
Узнать, удасться ли OPEN EXCLUSIVE?
|
|||
|---|---|---|---|
|
#18+
В яблочко! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2004, 19:43 |
|
||
|
Узнать, удасться ли OPEN EXCLUSIVE?
|
|||
|---|---|---|---|
|
#18+
>Cyv А если между FCLOSE() и IF llResult ... кто то всё таки умудриться открыть базу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2004, 20:44 |
|
||
|
Узнать, удасться ли OPEN EXCLUSIVE?
|
|||
|---|---|---|---|
|
#18+
Если уж есть такая навязчивая идея- открыть эксклюзивно- то я бы прислушался к совету <ВладимирМ>, особенно в части TRY...CATCH (правда это только с 8 версии?) Но надо учитывать, что если отчет работает с самой таблицой, открытой эксклюзивно, да еще есть предварительный просмотр, то пользователь может находится в нем неограниченное время. Все это время у остальных пользователей программа просто не будет работать. Выход 1. открыть таблицу эксклюзивно (используя TRY...CATCH) 2. Если исключения не возникло- выбрать данные Select-ом в Cursоr 3. закрыть таблицу 4. В отчете работать с курсором. А учитывая всё вышеперечисленное проще сделать так: 1. Открывать таблицу Share (или использовать уже открытую) 2. Сделать FLOCK() 3. Проверить результат FLOCK() 4. Если удачно- выбрать данные Select-ом в Cursоr 5. Сделать UNLOCK() 6. Запустить отчет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2004, 21:07 |
|
||
|
Узнать, удасться ли OPEN EXCLUSIVE?
|
|||
|---|---|---|---|
|
#18+
vl2000 А если между FCLOSE() и IF llResult ... кто то всё таки умудриться открыть базу? Ключевое слово в моём ответе - "предположительно" . Вероятность конфликта достаточно мала и ею можно принебречь (если речь конечно не идёт о запуске ракет ;-)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2004, 08:57 |
|
||
|
Узнать, удасться ли OPEN EXCLUSIVE?
|
|||
|---|---|---|---|
|
#18+
Ну, этой незначительной вероятности можно избежать так (код годится для любой версии): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Но, повторюсь, подход изначально неверен . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2004, 10:17 |
|
||
|
Узнать, удасться ли OPEN EXCLUSIVE?
|
|||
|---|---|---|---|
|
#18+
А какой смысл блокировать данные при формировании отчета, если после формирования отчета их тут же могут изменить? Актуальность то все равно нарушится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2004, 11:34 |
|
||
|
Узнать, удасться ли OPEN EXCLUSIVE?
|
|||
|---|---|---|---|
|
#18+
VFP8: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2004, 13:18 |
|
||
|
|

start [/forum/topic.php?fid=41&tid=1596846]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
22ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 310ms |

| 0 / 0 |
