Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 занята ли таблица другим пользователем?  [new]
nataSid
Member

Откуда:
Сообщений: 118
Привет.
Программа работает в сети с 4 пользователями.
Хочу чтобы пользователь, выходящий последний из программы копировал таблицы в архив.

При выходе я делаю close all (т.е. в текщем сеансе таблицы закрыты).
Как узнать занята ли таблица или БД другим пользователем в сети?
19 май 04, 08:08    [686108]     Ответить | Цитировать Сообщить модератору
 Re: занята ли таблица другим пользователем?  [new]
Вячеслав Клепинин
Member

Откуда: Санкт-Петербург
Сообщений: 336
Если у Вас VFP8, то можно попробовать так:
1. Закройте все таблицы
2. Откройте нужную таблицу (или несколько таблиц) эксклюзивно, используя TRY .. ENDTRY:
l_ErrOpen = .F.
TRY
   USE MyTable IN 0 EXCLUSIVE
CATCH
   l_ErrOpen = .T.
ENDTRY
IF l_ErrOpen
   = MESSAGEBOX('Таблица MyTable открыта другим пользователем')
ELSE
*  Действия по архивированию
ENDIF
Таблица может быть открыта эксклюзивно только тогда, когда с ней не работают другие пользователи.
Но имейте в виду: если Вы открыли таблицу эксклюзивно, а другой пользователь пытается открыть её в режиме разделяемого доступа, то у него произойдёт ошибка. Её так же нужно отслеживать.

Успехов!
19 май 04, 08:52    [686146]     Ответить | Цитировать Сообщить модератору
 Re: занята ли таблица другим пользователем?  [new]
nataSid
Member

Откуда:
Сообщений: 118
А как узнать какой пользователь держит (сетевое имя, например) ?
19 май 04, 09:17    [686185]     Ответить | Цитировать Сообщить модератору
 Re: занята ли таблица другим пользователем?  [new]
Вячеслав Клепинин
Member

Откуда: Санкт-Петербург
Сообщений: 336
Вроде как никак... Если только спросить у сисадмина, чтобы глянул у себя...
19 май 04, 09:39    [686234]     Ответить | Цитировать Сообщить модератору
 Re: занята ли таблица другим пользователем?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Для копирования таблиц вовсе не обязательно ждать пока другие пользователи закончат работу. Можно копировать даже таблицы с которыми сейчас работают другие пользователи. Для этой цели лучше всего использовать объект "Scripting.FileSystemObject" примерно так:

LPARAMETERS tcSourceDir,tcTargetDir
*tcSourceDir - директория-источник (откуда копируем)
*tcTargetDir - директория-цель (куда копируем)
LOCAL loFSO
loFSO=CREATEOBJECT('Scripting.FileSystemObject')

LOCAL loSourceFolder, loTargetFolder
loSourceFolder=m.loFSO.GetFolder(m.tcSourceDir)
IF m.loFSO.FolderExists(m.tcTargetDir)=.F.
* Указанная директория-цель - не существует
ELSE
	loTargetFolder=m.loFSO.GetFolder(m.tcTargetDir)
ENDIF

LOCAL loSourceFile
FOR EACH loSourceFile IN m.loSourceFolder.Files
	lcFileName=m.loFSO.BuildPath(m.loTargetFolder.Path,m.loSourceFile.name)
	m.loSourceFile.Copy(m.lcFileName,.T.)
ENDFOR

В принципе, можно копировать и сразу всю директорию не сканирую каждый файл в отдельности. Просто при копировании по файлу за раз можно организовать индикатор прогресса, если таблицы достаточно большого размера.

Подробнее об объекте Scripting.FileSystemObject и как его можно использовать в FoxPro почитай здесь

http://kodu.neti.ee/~juri4/vfpplus/vbs_fso_01_ru.htm
19 май 04, 09:53    [686265]     Ответить | Цитировать Сообщить модератору
 Re: занята ли таблица другим пользователем?  [new]
Вячеслав Клепинин
Member

Откуда: Санкт-Петербург
Сообщений: 336
to ВладимирМ

> Для этой цели лучше всего использовать объект "Scripting.FileSystemObject"

Можно просто селектом. Scripting.FileSystemObject не очень-то шустрый. Особенно если файлы многометровые.
Только как быть в случае, если несколько пользователей одновременно запустили архивирование?
19 май 04, 10:31    [686350]     Ответить | Цитировать Сообщить модератору
 Re: занята ли таблица другим пользователем?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Можно просто селектом.

Существует команда COPY TO, которая также может копировать открытые таблицы. Однако, как и в случае с SELECT-SQL будет проблема с копированием собственно файла базы данных (DBC)

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

Решение элементарное - создать в директории-цели пустую табличку и перед началом копирования попытаться ее заблокировать. Удалось - копируем, нет - копирует другой пользователь.

Хотя, сама постановка задачи весьма странная. Обычно такими делами занимается администратор на регулярной основе. Раз в день (неделю, месяц) запускается процедура резервного копирования. Наряду с другими регулярными процедурами по обслуживанию базы данных.

Привязка любых служебных операций (резервное копирование, восстановление индексов, проверка целостности данных и т.п.) к моменту старта или завершения программы - это не очень хорошее решение. Неоправданные тормоза.
19 май 04, 10:43    [686380]     Ответить | Цитировать Сообщить модератору
 Re: занята ли таблица другим пользователем?  [new]
Sergey Ch
Member

Откуда: Благовещенск
Сообщений: 8873
Вопрос уже обсуждался на форуме.
1. Создать таблицу, куда будут пользователт себя писать
2. В программе - таймер по проверке себя в табл.
3. При выходе - удалять себя из таблицы...
19 май 04, 11:17    [686505]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить