Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 15
1

Блокирование файла с общим доступом на время выполнения процедуры

29.08.2019, 12:44. Просмотров 681. Ответов 5

Собственно, как заблокировать файл?
Есть книга с общим доступом. Пользователь вызывает форму, заполняет ее, и по кнопке ОК данные записываются в таблицу с общим доступом в следующем порядке: сохраняется книга, вбиваются данные в последнюю строку таблицы, сохраняется книга. Первое сохранение нужно для того, чтобы обновить книгу с учетом всех последних изменений, и вычислить последнюю строку для записи данных. Второе сохранение нужно, для того чтобы другие пользователи не записали данные раньше, и правильно вычислили последнюю строку для записи.

Проблема 1. Если два пользователя одновременно нажмут ОК, то у одного данные запишутся, у второго будет ошибка Run-time error 1004 Файл заблокирован. Эту проблему планирую решить следующим способом:
Visual Basic
1
2
3
4
5
6
Do
On Error Resume Next
ActiveWorkbook.Save
i = i + 1
If Err.Number = 0 Then Exit Do
Loop Until Err.Number = 1004 Or i > 5
Проблема 2. Появляется, если решить проблему 1 приведенным способом. Если два пользователя нажмут одновременно ОК. Пользователь 1, к примеру, нажал раньше, сохранил, после его сохранения книгу сохранит пользователь 2. После этого данные обеих пользователей запишутся в одну и ту же последнюю строку, т.к. для пользователя 2 не обновится книга с учетом изменения пользователя 1. И у пользователя 2 будет ошибка - в этих ячейках уже есть данные.
Помогла бы какая-та блокировка файла для сохранения, которую можно было бы снять после отработки алгоритма.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.08.2019, 12:44
Ответы с готовыми решениями:

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

Открытие текстового файла для чтения с общим доступом
Всем здравствуйте. Есть текстовый файл cо строками одинакового формата. Используется он для...

Время выполнения процедуры
Здравствуйте, У меня есть процедура в mssql. Она выполняет кучу действий с огромным количеством...

Время выполнения процедуры
Как вычислить время выполнения процедуры? Добавлено через 5 минут Точнее даже продолжительность...

5
1552 / 515 / 125
Регистрация: 14.01.2013
Сообщений: 2,392
01.09.2019, 14:54 2
Лучше, конечно, вынести данные в нормальную БД, а в Екселе оставить только интерфейс. Но, раз уж така задача поставлена, может при открытии формы писать в реестр (али ещё куда) имя открывшего и флаг, что кубышка занята? А при закрытии флаг обнулять. Точнее, перед открытием, сначала, проверять флаг, "а не в работе ли файло?", а потом уже остальной алгоритм.
1
Модератор
Эксперт Python
27069 / 14205 / 2743
Регистрация: 12.02.2012
Сообщений: 23,296
Записей в блоге: 3
01.09.2019, 15:47 3
Kubuntovod, есть и другие способы. Например, использование winApi (мьютексы, семафоры). Но самое правильное - это, конечно, использование СУБД. Или переход к WEB-приложению.
0
1552 / 515 / 125
Регистрация: 14.01.2013
Сообщений: 2,392
01.09.2019, 16:25 4
Catstail, да, есть, конечно. Но ТСу всё это будет сложновато, скорее всего. А реестр (VBA-шные GetSetting, SaveSetting) вполне по силам.
0
Модератор
Эксперт Python
27069 / 14205 / 2743
Регистрация: 12.02.2012
Сообщений: 23,296
Записей в блоге: 3
01.09.2019, 18:28 5
Цитата Сообщение от Kubuntovod Посмотреть сообщение
А реестр (VBA-шные GetSetting, SaveSetting) вполне по силам.
- да. Но это не сильно хорошее решение:

1) по сути конкуренция за xls подменяется конкуренцией за реестр. Не уверен, что проблема не перенесется...
2) требуется особая обработка сбоев (если в реестре останется признак блокировки - то работа вообще застопорится)
0
0 / 0 / 0
Регистрация: 18.04.2013
Сообщений: 15
02.09.2019, 09:18  [ТС] 6
Всем спасибо за ответы. СУБД в этом случае лучшее решение, но нам к сожалению нужен Excel.
Про флаг была мысль, но не в реестр, а простой текстовый файл в сетевой папке. Отмел эту идею, т.к. попахивает она новыми проблемами.
Решил вообще оставить пока эту затею Проблему 1 решил другим способом - возврат к форме заполнения, если файл занят (выдает ошибку 1004). Если уж продолжатся конфликты, то буду думать в сторону флага.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.09.2019, 09:18

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Время выполнения процедуры в С++ 3.1
Столкнулся с проблемой. Нужно подсчитать за сколько тактов процессора(времени) выполняется код...

БД с общим доступом
Всем привет, помогите, нужно создать БД в MS Access, что бы она лежала на сервере (т.е. на общим...

Найти время выполнения процедуры
Используя О- символику, найдите время выполнения (как функции от N) процедуры или функции в...

Папка с общим доступом
Такая проблема. От имени администратора создал папку и в свойстве папки указал, чтобы был общий...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.