powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Узнать, удасться ли OPEN EXCLUSIVE?
15 сообщений из 15, страница 1 из 1
Узнать, удасться ли OPEN EXCLUSIVE?
    #32469430
guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перед расчётом отчёта мне нужно монопольный доступ к базе.
Как узнать смогу ли я открыть базу в EXCLUSIVE какой-либо функцией или выдавать OPEN my_base EXCLUSIVE и потом по ON ERROR DO my_err определять по ошибке, что попытка неудачна?
...
Рейтинг: 0 / 0
Узнать, удасться ли OPEN EXCLUSIVE?
    #32469469
Используйте функцию ISEXCLUSIVE(алиас_таблицы)
Возвращает .Т., если таблица открыта эксклюзивно.
...
Рейтинг: 0 / 0
Узнать, удасться ли OPEN EXCLUSIVE?
    #32469498
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маленький совет:

Если расчеты поместить непосредственно в отчет и перед командой REPORT написать:

SET LOCK ON

, то монопольный режим не понадобится, потому что команда REPORT сама будет блокировать то, что ей нужно.
А еще есть команда FLOCK(), которая прекрасно включается там, где надо.

На практике эти штуки вредны, но менее вредны, чем эксклюзивный доступ. Потому что не нужно дожидаться, когда все пользователи закроют файл таблицы.
...
Рейтинг: 0 / 0
Узнать, удасться ли OPEN EXCLUSIVE?
    #32469710
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IsExclusive() также как и IsRLock() отображают результат работы текущего пользователя. Они ничего не могут сказать о статусе таблицы, открытой другим пользователем.

Реально только отлавливать ошибку в момент открытия таблицы (ON ERROR или TRY...CATCH).

Лучше поступать так, как написал Urri .

А вообще-то, я не вижу смысла блокировать данные перед выполнением отчета.
...
Рейтинг: 0 / 0
Узнать, удасться ли OPEN EXCLUSIVE?
    #32470203
guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, чего-то не понимаю...
Формирую отчёт. Если в этот момент кто-то изменяет запись, участвующую в отчёте, в отчёт пойдут некорректные данные. Отсюда мысль - заблокировать базу.
...
Рейтинг: 0 / 0
Узнать, удасться ли OPEN EXCLUSIVE?
    #32470492
Вообще-то база данных и таблица - несколько разные понятия в VFP.
Как правило, отчёт формируется на основании одной или двух таблиц.
Совет: сделайте выборку из таблицы в курсор и печатайте его в отчёте.
...
Рейтинг: 0 / 0
Узнать, удасться ли OPEN EXCLUSIVE?
    #32470672
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прежде чем предпринимать какие-либо действия следует оценить:

1) Вероятность возникновения исключительной ситуации
2) Ущерб, который может нанести факт возникновения исключительной ситуации
3) Стоимость предотвращения исключительной ситуации с учетом первых 2 пунктов и последствий для других пользователей.

В твоем случае ты формируешь отчет.

1) Вероятность изменения данных другим пользователем.

Это зависит от времени формирования отчета: чем больше времени необходимо на его формирование, тем выше вероятность внесения изменений другими пользователями

2) Возможный ущерб

Если речь идет о какой-либо итоговой справке, то скорее всего берется некая выборка, за достаточно длинный промежуток времени. В этом случае +/-, который может произойти из-за действий другого пользователя не играет принципиальной роли. Ну будет мелкое расхождение, ну и что?

Кроме того, следует иметь в виду, что обычно FoxPro работает не напрямую с исходными данными, а с некоторыми буферами. Как системными, так и своими собственными.

Это значит, что далеко не всегда изменения сделанные одним пользователем немедленно будут видны другому пользователю. Как правило, другой пользователь может увидеть изменения спустя какой-то промежуток времени.

Кроме того, при подготовке отчетов, как правило, формируют некоторую временную таблицу, которая потом и выводится в отчет. В этом случае изменения сделанные другим пользователем вообще роли не играют.

3) Последствия предотвращения исключительной ситуации.

Ну, если рассматривать вопрос бокировки (FLOCK()), то очевидно, что пока один пользователь выполняет отчет никто не сможет внести никаких изменений. А если речь идет об эксклюзивном открытии (EXCLUSIVE), то никто вообще не сможет работать с данной программой пока выполняется отчет.

Это при том, что надо еще предусмотреть штатный вход и выход из режима блокировки. Тоже та еще задача.

Итого:

Вероятность события - невысокая
Последствия - незначительные
Стоимость предотвращения - высокая

Т.е. ты потратишь кучу времени и сил, на практически бесполезную работу. Ну, разве что, с целью самообразования.
...
Рейтинг: 0 / 0
Узнать, удасться ли OPEN EXCLUSIVE?
    #32471472
Cyv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как уже советовали, лучший вариант - сделать выборку в курсор.
А узнать, удасться ли предположительно OPEN EXCLUSIVE можно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
LOCAL lnHandle,llResult
lnHandle = FOPEN( "MYTABLE.DBF" , 12 )
llResult = lnHandle >  0 
=FCLOSE(lnHandle)
	
IF llResult		
    USE  "MYTABLE.DBF"  EXCLUSIVE
    *... Do something
    USE
ENDIF		
...
Рейтинг: 0 / 0
Узнать, удасться ли OPEN EXCLUSIVE?
    #32472724
guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В яблочко!
...
Рейтинг: 0 / 0
Узнать, удасться ли OPEN EXCLUSIVE?
    #32472783
vl2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Cyv
А если между FCLOSE() и IF llResult ...
кто то всё таки умудриться открыть базу?
...
Рейтинг: 0 / 0
Узнать, удасться ли OPEN EXCLUSIVE?
    #32472800
vl2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если уж есть такая навязчивая идея- открыть эксклюзивно- то я бы прислушался к совету <ВладимирМ>, особенно в части 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. Запустить отчет
...
Рейтинг: 0 / 0
Узнать, удасться ли OPEN EXCLUSIVE?
    #32472984
Cyv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vl2000
А если между FCLOSE() и IF llResult ...
кто то всё таки умудриться открыть базу?
Ключевое слово в моём ответе - "предположительно" . Вероятность конфликта достаточно мала
и ею можно принебречь (если речь конечно не идёт о запуске ракет ;-)).
...
Рейтинг: 0 / 0
Узнать, удасться ли OPEN EXCLUSIVE?
    #32473126
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, этой незначительной вероятности можно избежать так (код годится для любой версии):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
olderror = on('error')
lsuccess=.t.
on error lsuccess=.f.
use mytable exclusive
on error &olderror
if used('mytable')
  *** Значит, таблица была открыта эксклюзивно
  *** (на результат lsuccess, в общем, плевать ;-))
  *** Делаем, что хотим, потом
  use in mytable
endif

Но, повторюсь, подход изначально неверен .
...
Рейтинг: 0 / 0
Узнать, удасться ли OPEN EXCLUSIVE?
    #32473298
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какой смысл блокировать данные при формировании отчета, если после формирования отчета их тут же могут изменить? Актуальность то все равно нарушится.
...
Рейтинг: 0 / 0
Узнать, удасться ли OPEN EXCLUSIVE?
    #32473571
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VFP8:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
  TRY
    USE ( m.gcdat+lcfile ) EXCLUSIVE
    REPORT FORM FileName1 && ......
    WAIT WINDOWS 'The operation has been complited...' TIMEOUT  10 
    THISFORM.RELEASE
  CATCH
    WAIT WINDOWS 'We are sorry, but somebody else open this table. Please try again later...' TIMEOUT  10 
    THISFORM.RELEASE
  FINALLY
  ENDTRY
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Узнать, удасться ли OPEN EXCLUSIVE?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]