Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Горев “Эффективная работа с СУБД”.pdf
Скачиваний:
208
Добавлен:
28.06.2014
Размер:
4.71 Mб
Скачать

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

Соседние файлы в предмете Программирование на Delphi