Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Одновременная работа с файлами по сети несколькими пользователями. Excel VBA

1.8K
01 ноября 2010 года
ziv
71 / / 04.07.2003
Ситуация такая:
на компьютерах, работающих в ЛВС, стоит программа, часть данных, которой расположены на сервере. Пользователи, во время работы, часть файлов загружают только для чтения (забрать данные) и 1 файл, конфигурационный, для чтения и записи.

структура конфигурационного файла:
1 столбец - номер конфигурации, 2й и далее - данные.

соответственно, когда один из пользователей сохраняет свои данные, программа проверяет - не записаны ли аналогичные данные ранее, если нет, то сохраняет новый номер конфигурации.

пока к файлу обращаются последовательно, проблем нет, как только произошло одновременное открытие файла - проблема.

как вариант, сейчас пробую при открытии делать проверку "ActiveWorkBook.ReadOnly", но мне не нравится, что приходится файл открывать, да и табличка "Файл стал доступным" достает (можно ли ее ликвидировать?)
лучшим был бы вариант - проверять, открыт ли файл другим пользователем и если открыт, то гонять цикл ожидания с каким-нибудь прогресс-баром.
можно ли это осуществить?
405
01 ноября 2010 года
Dmitrii
554 / / 16.12.2004
Цитата: ziv
... лучшим был бы вариант - проверять, открыт ли файл другим пользователем и если открыт, то гонять цикл ожидания с каким-нибудь прогресс-баром.
можно ли это осуществить?

Можно. Например, путём обращения с помощью ADSI к службе [color=green]"Сервер"[/color] ([color=green]"LanmanServer"[/color]) компьютера, являющегося файловым сервером.
Пример на VB(A,S):

Код:
strServer = "здесь - NetBIOS-имя файлового сервера"
strList = vbNullString
On Error Resume Next
Set objCollection = GetObject("WinNT://" & strServer & "/LanmanServer")
If Err.Number = 0 Then
    For Each objItem In objCollection.Resources
        strList = strList & objItem.Get("User") & " -> " & objItem.Get("Path") & vbNewLine
    Next
    Set objCollection = Nothing
    Set objItem = Nothing
    If Len(strList) > 0 Then
        MsgBox strList
    Else
        MsgBox "Открытых файлов не найдено."
    End If
Else
    MsgBox "Ошибка обращения к службе ""СЕРВЕР"": " & Err.Number & vbNewLine & Err.Description
    Err.Clear
End If


Примечание: для обращения к службе необходимы соответствующие привилегии.
1.8K
01 ноября 2010 года
ziv
71 / / 04.07.2003
Спасибо!

А как можно убрать сообщение о том, что файл свободен для записи?
405
02 ноября 2010 года
Dmitrii
554 / / 16.12.2004
Цитата: ziv
А как можно убрать сообщение о том, что файл свободен для записи?

Скорее всего, никак, поскольку это сообщение генерируется не приложением, а ОС (нажатие кнопки "Уведомить" создаёт подписку на соответствующее системное событие).

1.8K
03 ноября 2010 года
ziv
71 / / 04.07.2003
Цитата: Dmitrii
Скорее всего,


Спасибо.
А если я, перед записью в файл, буду оставлять некую метку, например в текстовый файл писать "1" или "0" (файл свободен/занят) - на сколько это коряво?

Попробовал под Access сделать сохраняемые таблицы, но там то-же самое - база занята - только время потерял :)
кстати, а то, что база под Акцесс кем-то уже открыта, можно определить более простым путем, чем используя ADSI?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог