|
Программирование >> Разработка пользовательского интерфейса
Параметры Режим таблицы Вид Клавиатура р Блокировка по умолчанию- йтсуггстЕует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 для работы с этими объектами. Иногда имеет смысл проверять
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |