Анимация
JavaScript
|
Главная Библионтека Па№ль имсгрументов для размещения объеетоа на форме I 1 t г t I I 5 I ь I if - .Jill Макет I n«iHht*e С0Бмтня Дду™* вся Текущая запись ..... ййссеаки .... Пйслв встйвки...... До ввн селения................. Уйалвний ................. Qo muTMpiiuewn Del........ ПоЕге поат1армлв»№)аОв1 Откры+мв ....... Эвгрруам........... ftpywfl ..... Закрптис .. ... Потеря «рокусв. .. К«и<стие инолки Окно проегплроеаниа фор/чь1 Окно задания свойств для формы и ее объектов Рис. 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 ", начинаем транзакцию mywksp.BeginTrans Строка для поиска кода продавца создается из названия поля Last name и login текущего пользователя приложения strSearch = "Last name=" & Chr(34) & mywksp.UserName & Chr(34) Добавляем запись rstOrd.AddNew dbOpenDynaset) Идентификатор продавца заносится в новую добавленную запись 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. Beg i nTrans 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 для чтения и записи. Выбрав клиента, необходимо выбрать и автомобиль для него. Для этого предназначена форма "Наличие автомобилей, дата выпуска, цена", которая вызывается с помощью кнопки "Выбор автомобиля". Используется метод 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 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 [ 109 ] 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |