- •Глава1 Постановка задачи и разработка бизнес-правил
- •1.1.Некоторые определения
- •Глава2 Основы теории проектирования баз данных
- •Глава3 Обзор возможностей и особенностей различных СУБД
- •3.5.MS SQL Server
- •Глава4 Основы языка программирования
- •4.3. "Горячая десятка"
- •Глава5 Объектно-ориентированное программирование
- •5.1.Объектная модель и ее свойства
- •Объекты для работы с данными
- •Объекты для управления работой приложения
- •Объекты для оформления интерфейса пользователя
- •Объекты-контейнеры
- •Невизуальные объекты
- •Объекты OLE
- •Глава6 Создание базы данных
- •6.1.Visual FoxPro
- •Создание и модернизация структуры базы данных
- •Использование словаря данных
- •Создание и модернизация структуры таблиц
- •Глава7 Средства работы с данными
- •Запросы выборки
- •Запросы добавления
- •Запросы обновления
- •Запросы удаления
- •Запрос добавления
- •Запрос - Создание таблицы
- •Запрос удаления
- •Запрос обновления
- •Перекрестный запрос
- •Microsoft Access
- •Глава8 Использование технологии клиент-сервер
- •8.1. Работа с внешними данными с помощью технологии ODBC
- •Команды Transact-SQL
- •Создание представлений
- •Создание триггеров
- •Синхронный и асинхронный процессы
- •Создание внешних представлений
- •9.1.Инструментарий разработчика
- •Создание формы "Прием заказов" на Access
- •Разработка меню в Visual FoxPro
- •Разработка меню в Access
- •Глава10 Использование готовых компонентов в приложении
- •10.1.Основные преимущества модульного проектирования прикладных программ
- •Управление объектами Excel
- •Управление объектами Word for Windows
- •Построение графиков с помощью MS Graph 5.0
- •Построение отчета в Word for Windows
- •Запись информации в Schedule+
- •10.4.Применяем ActiveX
- •Иерархический список
- •Календарь
- •Глава11 Подготовка отчетных данных
- •11.1.Создание отчетов в Visual FoxPro
- •Управление режимом печати
- •Глава12 Подготовка и отладка пользовательского приложения
- •12.1.Общие принципы отладки приложения
- •Отладка программы в Access
- •Обработка ошибок процессора баз данных в Access
- •Отладка программы в Visual Basic
- •Визуальные средства проектирования
- •Поставка программного пакета
- •Требования к установке
- •Project Manager
- •Работа с кодом программы
- •Создание базы данных
- •Работа с данными
- •Расширение возможностей технологии клиент-сервер
- •Построение пользовательского интерфейса
- •Расширение функций OLE
- •Отладка приложения
converted to PDF by HupBaH9I
∙Транзакции используют данные, кэшированные в буфере транзакции, а не данные на диске, для того чтобы использовать самые новые данные.
∙Транзакции не могут переписать существующий индексный файл с помощью команды
INDEX.
∙Транзакции могут использоваться только с таблицами, принадлежащими базам данных.
Если вы включили ручную блокировку таблицы или файла во время транзакции с помощью функций FLOCK() и RLOCK(), то необходимо обязательно снять блокировку. Команда END TRANSACTION не снимет блокировку.
Во вложенных транзакциях команды ROLLBACK и END TRANSACTION работают с изменениями, которые произошли после последней команды BEGIN TRANSACTION.
Изменения внутри вложенных транзакций не запишутся на диск, пока не завершится самый верхний уровень, то есть не будет выполнена самая последняя команда END TRANSACTION.
Если транзакции выполняются над одними и теми же данными, то преимущество имеет то изменение, которое было выполнено последним, независимо от того, на каком уровне оно находится. Например:
USE Account
BEGIN TRANSACTION
BEGIN TRANSACTION
REPLACE count WITH 103 FOR count=203
END TRANSACTION
REPLACE count WITH 203 FOR count 103
END TRANSACTION
В таблице значение поля так и останется равным 203.
Перепишем данный пример так, что последняя команда REPLACE будет выполняться перед следующим уровнем вложенности:
USE Account
BEGIN TRANSACTION
REPLACE count WITH 203 FOR count 103
BEGIN TRANSACTION
REPLACE count WITH 103 FOR count=203
END TRANSACTION
END TRANSACTION
Теперь значение поля останется тем же, что и было - 103.
Несколько советов по увеличению производительности при работе в сети в приложениях Microsoft Visual FoxPro
Если локальная станция имеет достаточно места на жестком диске или достаточно RAM, то вы можете улучшить производительность, разместив временные файлы на локальном диске или на RAM диске. Перенаправление этих файлов на локальный диск или диск RAM увеличивает производительность за счет уменьшения обращения к сетевому диску. Вы можете указать альтернативное местонахождение для этих файлов, включив выражения EDITWORK, SORTWORK, PROGWORK и TMPFILES в ваш файл CONFIG.FPW.
Если есть возможность отсортировать данные, то имеет смысл это сделать, так как работа с таблицами происходит быстрее, если у вас не включены индексы. То есть используйте поиск с помощью команды, а затем отключайте порядок индекса.
Если есть возможность работать с какими-то файлами монопольно, то используйте эту возможность, так как при монопольном режиме доступ к таблицам осуществляется быстрее. Чтобы уменьшить вероятность попытки одновременного доступа к записи или таблице,
сокращайте время блокировок, что можно осуществить, блокируя записи только при сохранении данных на диск, а не во время их редактирования. Оптимистическая буферизация обеспечивает вам кратчайшее время блокировки.
Microsoft Access
Средства настройки оболочки Access позволяют установить режимы по умолчанию для открытия баз данных и таблиц. Для этого используется команда Параметры в меню Сервис. После
converted to PDF by HupBaH9I
того как появится диалоговое окно, показанное на рис. 7.20, необходимо перейти на вкладку Другие. После этого, используя набор кнопок "Блокировка по умолчанию", вы можете выбрать необходимый тип блокировки.
Рис. 7.20.
При выборе кнопки "Отсутствует" вы сможете установить только нежесткую блокировку записи. С помощью такой блокировки все редактируемые записи доступны для других пользователей, но при этом, когда вы отредактируете запись и попытаетесь сохранить изменения, то столкнетесь с одним из двух вариантов. Первый, самый простой: кроме вас запись никто не редактировал и сделанные изменения заносятся на диск. Второй: после того как вы начали редактировать данные, кто-то успел изменить их раньше вас и записать изменения на диск. В последнем случае появится окно сообщения, в котором будет предложено три варианта выхода из сложившейся ситуации: игнорировать чужие изменения и записать на диск свои, скопировать измененную запись в буфер обмена, сохранить чужие изменения и отменить свои. Этот режим иногда называется "оптимистической" блокировкой.
Если вы выберете блокировку изменяемой записи, то для других пользователей будет заблокирована запись, которую вы редактируете, и соседние с ней записи, так как Access устанавливает блокировку для страницы. Страницой для таблиц Access является набор записей размером в 2 килобайта. Эту блокировку иногда называют "пессимистической".
При выборе блокировки всех записей остальные пользователи не смогут открыть таблицу. При этом следует обратить внимание на тот факт, что если вы работаете с данными с помощью
формы, то можете установить для нее блокировки с помощью свойства RecordLocks, которые могут отличаться от установок по умолчанию для текущего сеанса работы Access. Эти типы блокировок строго соответствуют тем видам, которые вы устанавливаете с помощью диалогового окна Параметры.
Свойство RecordLocks помимо форм присутствует еще у запросов и отчетов. При этом для отчетов нет возможности установить блокировку изменяемой записи, скорее всего потому, что отчет их изменять не может.
В диалоговом окне Параметры можно установить режим по умолчанию для открытия баз данных. Но учтите, что режим доступа к базам данных можно выбирать при их открытии с помощью диалога открытия. Если базы данных открываются монопольно, то остальные пользователи не смогут открыть их, поэтому данный режим вряд ли подходит для сетевого использования.
converted to PDF by HupBaH9I
Помимо визуальных средств установки различных режимов блокировки, вы можете использовать объект 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 делает все изменения необратимыми. В то же время, если транзакция вложенная, то
converted to PDF by HupBaH9I
откат транзакции на более высоком уровне приведет систему в первоначальное состояние.
В нижеприведенном примере применяется транзакция для перехода на вторую запись и изменения значения для поля Фамилия. Перед завершением транзакции верхнего уровня предлагается принять решение: заносить изменения на диск или нет.
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 для работы с этими объектами. Иногда имеет смысл проверять