Форум программистов, компьютерный форум, киберфорум
Наши страницы
MS Access
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Cupuc
0 / 0 / 0
Регистрация: 26.01.2017
Сообщений: 5
1

Блокировка записи через VBA посредством ADODB

26.01.2017, 16:03. Просмотров 855. Ответов 16
Метки нет (Все метки)

Здравствуйте.
Всё в базе работает через VBA (Select, Update, формы и т.д.). Решил проверку записи на изменение сделать через блокировку посредством ADODB.Recordset. Создал глобальный рекордсет. Открывает и блокирует выбранную запись. При попытке со второй БД зайти на эту запись всё честно пишет, что запись заблокирована и вы не можете ее редактировать. Только проблема в том, что после этого невозможны никакие изменения в таблице, даже если перейдешь на незаблокированные записи. Есесвенно закрываю рекордсет как положено. Подскажите, что не так? Если же не наезжать на заблокированную запись, то все норм. Обе копии работают в штатном режиме. С DAO точно такая же проблема, тестировал.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
'Определяем глобальные переменные
Dim LockRST As ADODB.Recordset 
Dim LockCnn As ADODB.Connection 'Необходима чтобы открывать в пессимисте
 
'На открытие формы активируем
Set LockCnn = New ADODB.Connection
LockCnn.Open CurrentProject.BaseConnectionString
Set LockRST = New ADODB.Recordset
LockRST.ActiveConnection = LockCnn
LockRST.CursorType = adOpenKeyset
LockRST.LockType = adLockPessimistic
 
'Процедура блокировки в которую передают уникальный ID
 Private Sub CheckLockRecord(ByVal ID As Integer)
    Call FreeLockRST 'Вызываем процедуру очистки рекордсета
On Error GoTo ErrorHandler
    LockRST.Open "Select [Busy] From [Table] Where [ID] = " & ID 'Открываем запись. 
    If LockRST.RecordCount > 0 Then
        LockRST.Fields("Busy").Value = True 'Блокируем запись
    End If
    Exit Sub
ErrorHandler:
    'Если установлена блокировка
    LockRST.Close
    If Err.Number = -2147467259 Then 'На DAO 3218 что ли.
        MsgBox ("Данная запись уже заблокирована. Вы можете только просматривать ее.")
    Else
        MsgBox Err.Number & ": " & Err.Description 
    End If
End Sub
 
'Освобождаем Рекордсет
Private Sub FreeLockRST()
On Error GoTo ErrorHandler
    If Not LockRST Is Nothing And LockRST.State = adStateOpen Then 'Проверили на существование и открытие.
        LockRST.CancelUpdate 'Отменяем Update 
        LockRST.Close
    End If
    Exit Sub
ErrorHandler:
    MsgBox Err.Number & ": " & Err.Description
End Sub
Перед любыми изменениями освобождаю запись посредством процедуры FreeLockRST. Все работает правильно, так как если не было наложений двух рекордсетов все апдейтится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2017, 16:03
Ответы с готовыми решениями:

Добавление записи в таблице Access после выполнения стартовой формы посредством VBA
Привет всем. Решил продублировать тему здесь, а то в VBA куча просмотров, а...

Блокировка записи по времени. Не блокирует через определенное время
Здравствуйте! Написал условие, чтобы запись блокировалась через три минуты, но...

Открыть форму с фильтром по записи через VBA
Помогите почему то не получается.Есть ленточная форма с клиентами klient рядом...

Внесение записи в таблицу через форму. Вычисляемое поле. Макросы, без VBA
Здравствуйте! Пожалуйста, помогите сделать следующее: при внесении записи в...

Низкая скорость записи в базу данных (ADODB.Recordset)
Описание Файл эксель смотрит в ThisWorkbook.Path и находит базу данных. ...

16
Андрэич
2836 / 768 / 41
Регистрация: 20.05.2012
Сообщений: 2,056
26.01.2017, 18:32 2
Visual Basic
1
2
3
adLockPessimistic
надо
optimistic
если правильно прочитал\понял...

Добавлено через 4 минуты
adLockPessimistic(2) - пессимистическая блокировка. Провайдер гарантирует успешное редактирование записей. Запись блокируется сразу после начала редактирования и до момента сохранения записей.
adLockOptimistic(3) - оптимистическая блокировка. Провайдер осуществляет блокировку записей только в момент сохранения изменений, т.е. когда вы вызываете метод Update()

http://www.script-coding.com/ADO.html
0
Cupuc
0 / 0 / 0
Регистрация: 26.01.2017
Сообщений: 5
27.01.2017, 09:32  [ТС] 3
Цитата Сообщение от Андрэич Посмотреть сообщение
Visual Basic
1
2
3
adLockPessimistic
надо
optimistic
если правильно прочитал\понял...

Добавлено через 4 минуты
adLockPessimistic(2) - пессимистическая блокировка. Провайдер гарантирует успешное редактирование записей. Запись блокируется сразу после начала редактирования и до момента сохранения записей.
adLockOptimistic(3) - оптимистическая блокировка. Провайдер осуществляет блокировку записей только в момент сохранения изменений, т.е. когда вы вызываете метод Update()

http://www.script-coding.com/ADO.html
У меня как раз смысл в том, что нужно блокировать и держать запись, чтобы понять, что она занята. Есть ли у оптимистика возможность понять, что запись занята? В пессемистике я тупо ловлю ошибку о занятости.
0
Панург
Мы один, давай на "ты"
1641 / 717 / 139
Регистрация: 16.06.2016
Сообщений: 1,419
27.01.2017, 10:01 4
Cupuc, а что значит "Всё в базе работает через VBA ". Звучит несколько странно, как "Всё в базе работает через ж...". И это "жжжж..." не с проста!
Чем не устроило стандартное решение?
1
Миниатюры
Блокировка записи через VBA посредством ADODB  
Cupuc
0 / 0 / 0
Регистрация: 26.01.2017
Сообщений: 5
27.01.2017, 10:06  [ТС] 5
Цитата Сообщение от Панург Посмотреть сообщение
Cupuc, а что значит "Всё в базе работает через VBA ". .......
Чем не устроило стандартное решение MS?
1. К примеру стандартными средствами невозможно сделать на компоненте список иерархический каталог с возможностью разворачивать и сворачивать ветви. На VBA я это сделал, небольшим кодом. И таких моментов куча, где стандартные компоненты Access полный УГ по сравнению с той возможностью доработки их через VBA.

2. От версии к версии сам Майкрософт пишет, что некоторые параметры компонент несовместимы. И это на мой взгляд достаточно, чтобы на них не делать. Да и параметры самих компонент желают оставлять лучшего.
0
Панург
Мы один, давай на "ты"
1641 / 717 / 139
Регистрация: 16.06.2016
Сообщений: 1,419
27.01.2017, 14:42 6
Cupuc, а зачем тогда Access? Делал бы в любой другой среде.
Забавные доводы...
0
Cupuc
0 / 0 / 0
Регистрация: 26.01.2017
Сообщений: 5
27.01.2017, 14:51  [ТС] 7
Цитата Сообщение от Панург Посмотреть сообщение
Cupuc, а зачем тогда Access? Делал бы в любой другой среде.
Забавные доводы...
Ну да Это Вы моему начальству объясните. Я долго пытался ...
0
Панург
Мы один, давай на "ты"
1641 / 717 / 139
Регистрация: 16.06.2016
Сообщений: 1,419
27.01.2017, 14:59 8
я так понимаю начальство за спиной сидит? Принёс бы базейку с фронтэндом сваяным в какомнить C# и тебя бы выгнали?

Добавлено через 4 минуты
Тебя точно выгонят когда твои перделки и свистелки не заведутся в Win nn x64 и Access nn x64 ...
0
Cupuc
0 / 0 / 0
Регистрация: 26.01.2017
Сообщений: 5
27.01.2017, 15:07  [ТС] 9
Цитата Сообщение от Панург Посмотреть сообщение
я так понимаю начальство за спиной сидит? Принёс бы базейку с фронтэндом сваяным в какомнить C# и тебя бы выгнали?

Добавлено через 4 минуты
Тебя точно выгонят когда твои перделки и свистелки не заведутся в Win nn x64 и Access nn x64 ...
Нет не выгонят. Все работает под 64 и 32. Приносить ничего нельзя, а так я давно бы Firebird и Qt поставил и сделал бы. Все бесплатно и намного надежнее.
Лан, спасиб. Еще поигрался ничего не помогает. Сделаю тупо.
0
alvk
Эксперт MS Access
5616 / 3509 / 171
Регистрация: 12.08.2011
Сообщений: 8,943
31.01.2017, 08:10 10
Цитата Сообщение от Панург Посмотреть сообщение
и Access nn x64 .
А зачем ставить это безобразие? 32-битный нормально работает на win64 и вообще, не софт рулит программистом, а наоборот.
0
Панург
Мы один, давай на "ты"
1641 / 717 / 139
Регистрация: 16.06.2016
Сообщений: 1,419
31.01.2017, 09:29 11
Цитата Сообщение от alvk Посмотреть сообщение
А зачем ставить это безобразие?
Затем, что не всегда можно самому подбирать программное обеспечение. Есть корпоративные стандарты. И что кем рулит часто решает не программист.
1
alvk
Эксперт MS Access
5616 / 3509 / 171
Регистрация: 12.08.2011
Сообщений: 8,943
31.01.2017, 10:32 12
Цитата Сообщение от Панург Посмотреть сообщение
Есть корпоративные стандарты. И что кем рулит часто решает не программист.
Но в таком случае решают в начале пути, а не посерёд работы, либо, если уж совсем невмоготу, то предупреждают заранее. Например, в Альфа-банке, когда переходили с 98 винды на 2000, предупредили за 2 месяца.
Что касается 64-битного офиса, то таких корпоративных стандартов никогда не встречал, может приведёте пример, где стандарт именно 64-битная версия Акцесса?
0
commun
427 / 218 / 10
Регистрация: 29.10.2014
Сообщений: 890
31.01.2017, 22:55 13
Цитата Сообщение от Cupuc Посмотреть сообщение
после этого невозможны никакие изменения в таблице, даже если перейдешь на незаблокированные записи.
это же по-моему изменение свойств поля, всего поля по всем записям
Цитата Сообщение от Cupuc Посмотреть сообщение
LockRST.Fields("Busy").Value = True
0
YuryK
1030 / 847 / 337
Регистрация: 08.12.2016
Сообщений: 3,283
01.02.2017, 06:24 14
Цитата Сообщение от commun Посмотреть сообщение
всего поля по всем записям
такого не бывает. Во-первых, это поле текущей записи, во-вторых, запись в этом наборе только одна.
Цитата Сообщение от Cupuc Посмотреть сообщение
после этого невозможны никакие изменения в таблице
при штатном "снятии блокировки" перед Close идет CancelUpdate, а при аварийном сразу Close. Там точно не нужно такой же CancelUpdate? Может к ошибке приводит не только LockRST.Fields("Busy").Value = True , но и Open или Close.
З.Ы. я не утверждаю, а только предполагаю. Отладчик тебе в помощь.
0
commun
427 / 218 / 10
Регистрация: 29.10.2014
Сообщений: 890
01.02.2017, 20:43 15
YuryK, да, попробуйте еще проверить это:
'тип блокировки adLockOptimistic-разреш др польз работать с записью,заблокированной кодом ADO
'adLockPessimistic-полностью отключ др пользователей,пока ADO вносит измен в запись

Добавлено через 55 секунд
у Вас второе
0
YuryK
1030 / 847 / 337
Регистрация: 08.12.2016
Сообщений: 3,283
01.02.2017, 23:18 16
Цитата Сообщение от commun Посмотреть сообщение
да, попробуйте еще проверить это
тут я пас, я на Дельфях только. Это я тебе предлагаю под отладчиком проверить, почему невозможны изменения. Кстати, ты не уточнил, невозможность сопровождается твоим MsgBox ("Данная запись уже заблокирована. Вы можете только просматривать ее.") или проявляется как-то иначе?
0
commun
427 / 218 / 10
Регистрация: 29.10.2014
Сообщений: 890
03.02.2017, 20:45 17
YuryK, а что не ясно? пиши вместо своего adLockPessimistic свойство adLockOptimistic, таблица не должна блокироваться(молча) при обращении к ней других пользователей-см.выше у Андрэича
0
03.02.2017, 20:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2017, 20:45

Изменение поля посредством VBA
Такая проблема. Нужно при нажатии на форме кнопки изменить данные в таблице. ...

Об экспорте данных посредством VBA
Помогите, плз, разобраться в таком вопросе. Передо мной стоит задача экспорта...

Создание таблицы посредством VBA
Добрый день! Скажите пожалуйста, у типов полей: BINARY, TINYINT, INTEGER,...


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

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

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