Шаг 101 - Свойство LockEdits

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

Значение
Задаваемое или возвращаемое значение является выражением типа Boolean, указывающим режим блокировки, описание которого приведено в следующем списке:

Замечания
Свойство LockEdits применимо к обновляемым объектам Recordset.
Если страница заблокирована, то ни один из других пользователей не сможет изменять записи на этой странице. Если для свойства LockEdits задано значение True, и другой пользователь уже заблокировал страницу, то при вызове метода Edit возникает ошибка. Другим пользователям разрешается чтение данных с блокированных страниц.
Если для свойства LockEdits задано значение False, то ошибка возникает при вызове метода Update для страницы, заблокированной другим пользователем. Для просмотра изменений, внесенных в запись другим пользователем, следует вызвать метод Move с аргументом 0. Однако в этом случае все внесенные вами в запись изменения будут потеряны.
При работе с источниками данных ODBC, подключенными к ядру Microsoft Jet, свойство LockEdits всегда получает значение False, т.е. устанавливается режим нежесткой блокировки. В ядре базы данных Microsoft Jet отсутствуют средства контроля над механизмами блокировки, используемыми на серверах внешних баз данных.
Пользователь имеет возможность установить значение свойства LockEdits при первом открытии объекта Recordset с помощью аргумента блокировки метода OpenRecordset. Указанная в аргументе блокировки константа dbPessimistic задает для свойства LockEdits значение True, а любое другое значение аргумента блокировки устанавливает для свойства LockEdits значение False.

Пример
Следующая программа демонстрирует установление жесткой блокировки с помощью значения True свойства LockEdits, а затем установление нежесткой блокировки с помощью значения False свойства LockEdits. Иллюстрируется также способ обработки ошибок, требуемый при изменении значения поля в сетевой базе данных. Для выполнения данной процедуры требуются функции PessimisticLock и OptimisticLock.

Sub LockEditsX()

	Dim dbsNorthwind As Database
	Dim rstCustomers As Recordset
	Dim strOldName As String

	Set dbsNorthwind = OpenDatabase("Борей.mdb")
	Set rstCustomers = dbsNorthwind.OpenRecordset("Клиенты", dbOpenDynaset)
	With rstCustomers
		' Сохраняет исходные данные.
		strOldName = !Название

		If MsgBox("Демонстрация жесткой блокировки...", 	vbOKCancel) = vbOK Then
		' Попытка изменить данные при действующей 
		' жесткой блокировке.
			If PessimisticLock(rstCustomers, !Название, "Мухомор") Then
				MsgBox "Запись успешно изменена."
				' Восстанавливает исходные данные...
				.Edit
				!Название = strOldName
				.Update
			End If

		End If

		If MsgBox("Демонстрация нежесткой блокировки...", vbOKCancel) = vbOK Then
			' Попытка изменить данные при действующей 
			' нежесткой блокировке.
			If OptimisticLock(rstCustomers, !Название, "Мухомор") Then
				MsgBox "Запись успешно изменена."
				' Восстанавливает исходные данные...
				.Edit
				!Название = strOldName
				.Update
			End If
		End If
		.Close
	End With
	dbsNorthwind.Close
End Sub

Function PessimisticLock(rstTemp As Recordset, fldTemp As Field, strNew As String) As Boolean

	dim ErrLoop as Error
	PessimisticLock = True
	With rstTemp
		.LockEdits = True

		' После задания для свойства LockEdits значения True,
		' перехватываются ошибки при вызове метода Edit.
		On Error GoTo Err_Lock
		.Edit
		On Error GoTo 0
		' Если метод Edit еще выполняется, ошибки не возникают;
		' пользователь имеет возможность изменять данные.
		If .EditMode = dbEditInProgress Then
			fldTemp = strNew
			.Update
			.Bookmark = .LastModified
		Else
			' Загружает текущую запись для просмотра изменений,
			' сделанных другим пользователем.
		.Move 0
		End If

	End With
	Exit Function
	
Err_Lock:

	If DBEngine.Errors.Count > 0 Then
		' Отображает семейство Errors.
		For Each errLoop In DBEngine.Errors
			MsgBox "Код ошибки: " & errLoop.Number & vbCr & errLoop.Description
		Next errLoop
		PessimisticLock = False
	End If
	Resume Next

End Function

Function OptimisticLock(rstTemp As Recordset, 	fldTemp As Field, strNew As String) As Boolean
	dim ErrLoop as Error
	OptimisticLock = True
	With rstTemp
		.LockEdits = False
		.Edit
		fldTemp = strNew
		' После задания для свойства LockEdits значения False,
		' перехватываются ошибки при вызове метода Update.
		On Error GoTo Err_Lock
		.Update
		On Error GoTo 0
		' Если метод Edit не выполняется, ошибки не возникают;
		' пользователь имеет возможность изменять данные.
		If .EditMode = dbEditNone Then
			' Переводит указатель текущей записи на последнюю
			' измененную запись.
			.Bookmark = .LastModified
		Else
			.CancelUpdate
			' Загружает текущую запись для просмотра изменений,
			' сделанных другим пользователем.
			.Move 0
		End If
	End With
	Exit Function
	
	Err_Lock:

	If DBEngine.Errors.Count > 0 Then
		' Отображает семейство Errors.
		For Each errLoop In DBEngine.Errors
			MsgBox "Код ошибки: " & errLoop.Number & vbCr & errLoop.Description
		Next errLoop
		OptimisticLock = False
	End If
	Resume Next
End Function

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 19.03.2002