Программирование >>  Разработка пользовательского интерфейса 

1 ... 82 83 84 [ 85 ] 86 87 88 ... 147


Параметры

Режим таблицы Вид Клавиатура

р Блокировка по умолчанию- йтсуггстЕует1 С Всех записей С Изменяемой записи

Таблицы/запросы Общие Модуль

Формы/отчеты Правка/поиск

р Режим открытия по умолчанню-(* Общий доступ с Монопольный доступ

р Операции DDE-

П Пропуск команд DDE

Р Обновление связей DDE

Время ожидания OLE/DDE (с): Число повторов обновления: Период обновления ODBC (с): Период обновления (с): Период повторов обновления(мс): 250

1500

Отмена

11рименить

Рис. 7.20.

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

Если вы выберете блокировку изменяемой записи, то для других пользователей будет заблокирована запись, которую вы редактируете, и соседние с ней записи, так как Access устанавливает блокировку для страницы. Страницой для таблиц Access является набор записей размером в 2 килобайта. Эту блокировку иногда называют пессимистической .

При выборе блокировки всех записей остальные пользователи не смогут открыть таблицу.

При этом следует обратить внимание на тот факт, что если вы работаете с данными с помощью формы, то можете установить для нее блокировки с помощью свойства RecordLocks, которые могут отличаться от установок по умолчанию для текущего сеанса работы Access. Эти типы блокировок строго соответствуют тем видам, которые вы устанавливаете с помощью диалогового окна Параметры.

Свойство RecordLocks помимо форм присутствует еще у запросов и отчетов. При этом для отчетов нет возможности установить блокировку изменяемой записи, скорее всего потому, что отчет их изменять не может.

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

того как появится диалоговое окно, показанное на рис. 7.20, необходимо перейти на вкладку Другие. После этого, используя набор кнопок Блокировка по умолчанию , вы можете выбрать необходимый тип блокировки.



Помимо визуальных средств установки различных режимов блокировки, вы можете использовать объект Application для их изменения.

В следующем примере с помощью метода SetOption объекта Application устанавливается пессимистическая блокировка (блокировка страницы), а с помощью метода GetOption и функции MSGBOX() выводится номер текущей блокировки.

Public Sub mygetoption() Dim mystr As String

Application.SetOption Блокировка по умолчанию , 2 mystr = Application.GetOption( Блокировка по умолчанию ) MsgBox (mystr) End Sub

Для форм, отчетов и запросов вы обращаетесь к свойству RecordLocks, но учтите, что для уже открытых экземпляров объектов на различных пользовательских машинах свойство не изменится. То есть, изменив свойство некоего объекта, вам попутно надо убедить пользователя закрыть и снова открыть объект, для того чтобы он смог воспользоваться всеми преимуществами нового значения. Пример изменения свойства Recordlocks для запроса:

Public Sub myqueryproperties()

Dim db As DATABASE, qd As QueryDef

Set db = DBEngine.Workspaces(0).Databases(0)

db.QueryDefs( Моя таблица query ).Properties( recordLocks ) = 2

End Sub

Пример изменения свойства RecordLocks для формы: Public Sub ActiveFormRecordLocksChange Screen.ActiveForm.RecordLocks = 2

End Sub

Учтите, что, как правило, во время работы формы изменять это свойство нет смысла, так как несмотря на то, что вы его установите, форма будет использовать блокировку прежнего типа.

Поэтому рекомендуем следующую последовательность действий для конкретного использования данной процедуры:

1. Создайте функцию, которая будет содержать одну строчку: ActiveFormRecordLoc1ksChange, то есть вызов процедуры, которая у вас может называться по-другому.

2. Создайте макрос, выполняющий одно действие RunCode, аргументом которого будет вызов нашей функции, которая, к примеру, может называться fActiveFormLocksChange.

3. Создайте пользовательскую панель инструментов, в которую необходимо перетащить графическое изображение макроса из вкладки Макросы.

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

Очевидно, что то же самое вы можете проделать и для отчетов.

Для того чтобы вы были уверены, что все операции, которые вы хотите провести, были выполнены, используйте методы BeginTrans, CommitTrans и RollBack объекта Workspace.

Метод BeginTrans начинает транзакцию. Под транзакцией подразумевается серия изменений, которые проводятся над данными и структурой базы данных. Если по какой-либо причине операции, входящие в текущую транзакцию, не могут быть завершены, то система возвращается в исходное состояние. При этом помните, что на рабочей станции должно быть достаточно места на диске, так как при выполнении транзакции вся информация об операциях в нее входящих заносится на диск.

Транзакции должны завершаться с помощью обращения к методу CommitTrans. Транзакции могут быть вложенными, не забывайте, что для того, чтобы завершить транзакцию более высокого уровня, вначале необходимо завершить вложенные транзакции. Если по каким-либо причинам приложение не сможет обратиться к методу CommitTrans, то система вернется в первоначальное состояние.

Количество вложенных транзакций в Access, так же как и в Visual FoxPro, не может превышать пяти. При этом обратите внимание на следующий факт. Метод CommitTrans для текущего объекта Workspaces делает все изменения необратимыми. В то же время, если транзакция вложенная, то



откат транзакции на более высоком уровне приведет систему в первоначальное состояние.

В нижеприведенном примере применяется транзакция для перехода на вторую запись и изменения значения для поля Фамилия. Перед завершением транзакции верхнего уровня предлагается принять решение: заносить изменения на диск или нет.

Sub ForceTrans()

Dim db As DATABASE, wks As Workspace, rst As Recordset

Dim otvet As Integer

Set wks = DBEngine.Workspaces(0)

Set db = wks.Databases(0)

Set rst = db.OpenRecordset( Моя таблица , dbOpenDynaset)

wks.BeginTrans

wks.BeginTrans

rst.MoveLast

rst.AbsolutePosition = 2

rst. Edit

rst.ФАМИЛИЯ = Макашарипов

rst.UPDATE

wks.CommitTrans

otvet = MsgBox( Изменить , vbYesNo + vbDefaultButton1, Ваше решение )

If otvet = vbYes Then

wks.CommitTrans

Else

wks.Rollback

End If End Sub

Кроме вложенных транзакций в Access можно использовать параллельные транзакции. Эти транзакции действуют независимо друг от друга. Но при этом вам необходимо создать еще один объект типа Workspace. Соответственно каждая транзакция завершается независимо друг от

друга.

Следующий пример будет работать, только если установлен режим блокировки Отсутствует . В данном примере обратите внимание на две последние строчки кода. Даже если вы поменяете эти строчки местами, ничего не изменится, то есть вторая транзакция не работает с данными, реально хранящимися на диске.

Public Sub multipletrans()

Dim db As DATABASE, wks As Workspace, rst As Recordset Dim db1 As DATABASE, wks1 As Workspace, rst1 As Recordset Set wks = DBEngine.Workspaces(0) Set db = wks.Databases(0)

Set rst = db.OpenRecordset( Моя таблица , dbOpenDynaset) Set wks1 = DBEngine.Workspaces(0) Set db1 = wks1.Databases(0)

Set rst1 = db1.OpenRecordset( Моя таблица , dbOpenDynaset) wks.BeginTrans

rst.FindFirst [Фамилия]=Клинтон rst. Edit

rst. ФАМИЛИЯ = Доул

rst.UPDATE

wks1.BeginTrans

rst1.FindFirst [Фамилия]=Доул rst1.Edit

rst1.ФАМИЛИЯ = Клинтон

rst1.UPDATE

wks.CommitTrans wks1.CommitTrans End Sub

Транзакции являются глобальными в рамках объекта Workspace. Поэтому ваши транзакции могут охватывать несколько баз данных и, соответственно, все множество объектов, которые в них содержатся.

Объекты типа Database и Recordset имеют свойство Transactions, которое может принимать значения True или False. От их значений зависит, сможете ли вы использовать методы BeginTrans, CommitTrans и Rollback для работы с этими объектами. Иногда имеет смысл проверять



1 ... 82 83 84 [ 85 ] 86 87 88 ... 147

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика