- •Глава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
Для изменения порядка перехода нажмите клавишу Shift и кнопку мыши над нужным объектом. При этом номер объекта будет убран, а все остальные объекты перенумерованы. При повторном нажатии объект будет помещен в конец списка. Очевидно, что применение данного метода для большой формы займет довольно много времени.
Более быстрый метод состоит в нажатии на первый объект в последовательности без нажатия на клавишу Shift. При этом объекту присваивается номер один, а все остальные номера исчезают. Затем, нажимая Shift, обойдите все остальные объекты в нужном порядке. Когда все сделано, нажмите кнопку Reorder.
Второй способ изменения порядка активизации полей - с помощью списка. В этом случае после выбора пункта меню Tab Order откроется диалоговое окно, показанное на рис. 9.14.
Рис. 9.14.
На левой стороне окна появляется прокручиваемый список всех объектов формы. Нажимая и перетаскивая кнопки слева от имен, можно как угодно изменять порядок активизации объектов.
Как видно из рис. 9.14, напротив каждого объекта находится маленькая пиктограмма, служащая для облегчения определения типа объекта. Кроме того, кнопки By Row и By Column позволяют быстро автоматически определить требуемый порядок, хотя на сложных формах их применение может и не дать желаемого результата. Добившись нужного порядка активизации объектов, нажмите кнопку OK.
В этой форме мы допустили возможность транспортировки данных в Microsoft Word и Microsoft Excel (с построением диаграммы). Как мы это сделали, будет рассказано в следующей главе.
Описанные в данной главе формы используются в примере SAMPLE.EXE, поставляемом на дискете.
Создание формы "Прием заказов" на Access
Мы уже неоднократно упоминали о широких возможностях Access как хорошего помощника в нелегком труде программиста. Здесь мы сосредоточимся на создании относительно сложной формы, при проектировании которой только Мастерами не обойтись.
Так же как в Visual FoxPro, основным инструментом для проектирования формы в Access является Конструктор формы, показанный на рис. 9.15. Для создания новой формы с помощью Конструктора формы в контейнере БД активизируйте вкладку Форма и нажмите кнопку Создать. В появившемся диалоговом окне Новая форма выберите в списке пункт Конструктор.
converted to PDF by HupBaH9I
Рис. 9.15. Конструктор формы в Access 7.0
При загрузке Конструктора формы в Access, как и в остальных средствах, поддерживающих визуальное программирование, автоматически загружаются панели инструментов, служащие для создания объектов в форме и установки свойств объектов.
Как правило, это панели Конструктор Форм, Панель орматирования и Панель элементов. Для нашего примера мы объявили переменные объектного типа на уровне модуля для того,
чтобы они были видны из всех процедур всех модулей текущей базы данных, а при создании ссылки на эту базу данных - и из других баз данных.
'Создание переменных рабочего пространства, которые будут использоваться 'для начала и конца транзакций
Public mywksp As Workspace Public mywksp1 As Workspace
'Создание переменных наборов данных
Public rstOrd As Recordset Public rstcust As Recordset Public rstAc As Recordset
Объекты типа Workspace необходимы нам для начала, завершения и отката транзакций. Объекты типа Recordset будут использоваться для работы с необходимыми нам данными, так как в некоторых случаях нам придется использовать формы, которые не имеют источника данных и соответственно не могут иметь связанных с какими-либо полями элементов управления. Например, форма "Прием заказов" не имеет источника данных.
Прием заказа начинается с нажатия на кнопку с соответствующим названием - "Прием заказа". После этого выполняется следующий код:
Private Sub Кнопка1_Click()
'Это строка условия поиска продавца в таблице Salesman Dim strSearch As String
'Инициализируем переменную рабочего пространства
Set mywksp = DBEngine.Workspaces(0)
' Инициализируем переменную набора данных
Set rstOrd = mywksp.Databases(0).OpenRecordset("order_", _ dbOpenDynaset) 'начинаем транзакцию
mywksp.BeginTrans
'Строка для поиска кода продавца создается из названия поля ' Last_name и login текущего пользователя приложения
strSearch = "Last_name=" & Chr(34) &_ mywksp.UserName & Chr(34) 'Добавляем запись
rstOrd.AddNew
converted to PDF by HupBaH9I
'Идентификатор продавца заносится в новую добавленную запись rstOrd!key_salman = DLookup("key_salman",_"salesman", strSearch) rstOrd.UPDATE
Me!cmbCust.Enabled = True
Me!txtFam.Enabled = True End Sub
В результате выполнения этого кода в таблицу order_ вносится одна запись, но, обратите внимание, началась транзакция. Эти изменения еще не окончательные, мы можем при определенных обстоятельствах сделать откат. При работе программы предполагается, что каждый продавец, оформляющий сделку, будет запускать приложение со своим пользовательским именем, а с помощью этого имени будет находиться идентификатор, который и попадет в новую запись таблицы order_. Для этого мы используем свойство Username объекта mywksp.
strSearch = "Last_name=" & Chr(34) & mywksp.UserName &_ Chr(34) 'Добавляем запись
rstOrd.AddNew
'Идентификатор продавца заносится в новую 'добавленную запись
rstOrd!key_salman = DLookup("key_salman",_ "salesman", strSearch)
После чего необходимо заняться поисками покупателя в предположении, что он уже совершал покупку до этого, либо ввести данные о нем в базу данных. При этом данные о покупателе будут сохраняться даже в том случае, если покупка не будет совершена, так как в дальнейшем вы можете использовать его адрес и имя для рассылки рекламных проспектов, приглашений на презентацию, для статистической обработки (жители какого квартала действительно покупают автомобили, а какого любят просто заходить в магазин) и для прочих нужд (зайти к клиенту в гости, находясь по соседству). С этой целью мы начинаем параллельную транзакцию в коде события Click, кнопки с подписью "Новый клиент":
Private Sub cmbNcl_Click()
Set mywksp1 = DBEngine.Workspaces(0)
Set rstcust = mywksp1.Databases(0).OpenRecordset("customer", _ dbOpenDynaset) mywksp1.BeginTrans
DoCmd.OpenForm "Клиенты", acNormal, , , acAdd End Sub
Эта транзакция завершится уже в форме "Клиенты". При этом, несмотря на все прекрасные перспективы дальнейшего использования данных о клиенте, существует возможность отката и в этом случае, например, если клиент вдруг неожиданно скроется, не успев назвать свой адрес и факс. Без них он для вас неинтересен.
Если клиент настаивает на том, что он совершал у вас покупку, то можно поискать его в вашей базе данных с помощью комбинированного списка. Применение фильтра ускорит поиск, фильтр можно установить с помощью единственного текстового поля, которое присутствует в нашей форме. Этого мы добиваемся с помощью кода, который выполняется при наступлении события
LostFocus (Потеря фокуса):
Private Sub txtFam_LostFocus()
If Len(Trim(txtFam)) >> 0 Then Me!cmbCust.RowSource = "SELECT DISTINCTROW _ customer.key_customer,customer.name_customer,_
customer.address, customer.tel FROM customer Where _ customer.name_customer like " & Chr(34) & Trim(txtFam) &_
"*" & _ Chr(34) & ";"
Else
Me!cmbCust.RowSource = "SELECT DISTINCTROW _ customer.key_customer,customer.name_customer, _ customer.address, customer.tel FROM customer ;"
End If End Sub
В данном коде используется свойство комбинированного списка - динамически изменять содержимое списка значений, другими словами, возможность использовать свойство RowSource
converted to PDF by HupBaH9I
для чтения и записи.
Выбрав клиента, необходимо выбрать и автомобиль для него. Для этого предназначена форма "Наличие автомобилей, дата выпуска, цена", которая вызывается с помощью кнопки "Выбор автомобиля". Используется метод OpenForm объекта DoCmd:
Private Sub cmbCAuto_Click() DoCmd.OpenForm _
"Наличие автомобилей, дата выпуска, цена", acNormal End Sub
Форма "Наличие автомобилей, дата выпуска, цена" имеет установленное свойство RecordSource (Источник данных). Источником данных для этой формы служит запрос с одноименным названием. Для поиска автомобилей предназначены два комбинированных списка: с помощью первого вы отфильтровываете данные по названию производителя, а с помощью второго - по моделям. После этого из ограниченного списка данных вы легко выбираете автомобиль для вашего клиента. При этом используется замечательное свойство форм использовать фильтр и динамически менять его. Это становится ясно из следующего фрагмента кода. Как уже неоднократно отмечалось, с отфильтрованными данными Access работает значительно быстрее, особенно если вы их не изменяете, а просто просматриваете.
Private Sub name_model_AfterUpdate() If Len(Trim(name_model)) >> 0 Then
Me.FilterOn = False
Me.Filter = "name_model=" & Chr(39) _ & Me!name_model & Chr(39) & _
"and name_firm=" & Chr(39) & Me!name_firm & Chr(39) Me.FilterOn = True
End If End Sub
После этого вы можете просмотреть подробную информацию о конкретной модели. Для чего вызывается еще одна форма, которая называется "Подробно о модели", устанавливается она с отфильтрованными данными.
Private Sub Кнопка9_Click() DoCmd.OpenForm "Подробно о модели", _
acNormal, , "[Name_model]=" & Chr(39) & _ Me![name_model] & Chr(39), acReadOnly End Sub
После того как вы выберете автомобиль, подходящий вашему клиенту, можете передать управление форме "Прием заказов". При этом начинается заполняться таблица Account. Но, как вы помните, все это происходит в рамках транзакции, поэтому изменения еще не окончательны.
Private Sub Кнопка8_Click() Dim FStr As String
FStr = "name_customer=" & Chr(39) &_ Forms![Прием заказов].cmbCust & Chr(39) Set rstAc = mywksp.Databases(0).OpenRecordset("account", _ dbOpenDynaset) rstAc.AddNew
rstAc!key_customer = DLookup("key_customer", _ "customer", FStr) rstAc!key_auto = Me!key_auto
rstAc!date_write = Now() rstAc.UPDATE
Forms![Прием заказов].cmbAc.Enabled = True
DoCmd.Close acForm, "Наличие автомобилей,_дата выпуска, цена" End Sub
После возврата в форму "Прием заказов" вы принимаете окончательное решение о продаже автомобиля. Пользователь имеет последнюю возможность отказаться. После нажатия на кнопку "Оформление счета" транзакция завершается.
mywksp.CommitTrans
rstOrd.Close
rstAc.Close