Анимация
JavaScript


Главная  Библионтека 

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

key auto

key model

date issue

cost

100001

07.07.94

10000

100002

06.06.95

10500

100003

05.10.95

10500

100004

08.09.95

25000

100005

10.12.95

30000

100006

02.01.96

30000

100007

10.10.95

37000

100008

12.06.96

26000

Вторая таблица - MODEL - вот так:

key model name model key firm swept volume quantity drum capacity

145 1.4

1351

146 1.9

1929

740I 4.0

3982

840Ci 4.0

3982

M3 3.0

3201

GMC Jimmy 4.3

4300

Для связи таблицы используется поле key model. С помощью связующего поля мы легко можем получить любую информацию, которая хранится в этих таблицах.

Вам может понадобиться изменить идентификатор одного из автомобилей в таблице Model. Как сделать, чтобы записи не остались одинокими в первой таблице - Automobil passenger car? Можно провести замену с помощью команды REPLACE, то есть найти записи с этим идентификатором и заменить на новое значение. Но лучше использовать ссылочную целостность и написать триггер для выполнения изменений данных в таблице Model. В нем следует написать код, который будет искать все соответствующие записи в таблице Automobil passenger car. Теперь у пользователя будет создаваться впечатление, что умный компьютер сам знает, что нужно поменять идентификатор автомобиля во всех таблицах, в которых он присутствует. Если вам не хочется писать триггеры самостоятельно, то в некоторых случаях Visual FoxPro сможет вам помочь, если вы воспользуетесь диалоговым окном Referential Integrity, которое можно вызвать из меню Database.

Работа с данными в Microsoft Access

Для ввода и редактирования данных в Microsoft Access используются формы, которые могут иметь несколько режимов, таблицы и запросы. При открытии формы, по умолчанию, если вы не подключили свое меню, становится активным меню Форма, в котором имеются команды для поиска, сортировки и фильтрации данных. Аналогичные команды присутствуют в меню, связанном с таблицами и запросами. Как правило, при простом редактировании данных в таблицах этих средств более чем достаточно.

Среди средств поиска наиболее простым является использование диалогового окна Поиск, с помощью которого вы можете последовательно находить нужные вам записи. Это диалоговое окно позволяет искать данные как в текущем поле, так и в других полях используемого источника данных. Вы можете последовательно находить несколько записей, удовлетворяющих выражению или его части, введенному в строке образца. Поиск можно проводить как вверх по таблице от текущей записи, так и вниз, либо по всей таблице. Но совершенно очевидно, что таким образом поиск можно производить только по одному полю, либо при случайном стечении обстоятельств по нескольким, к примеру, слово "Петрович" может быть и отчеством и фамилией.

В форме вы можете с помощью Мастера кнопок построить кнопку, которая будет служить для поиска записей. После того как вы создадите подобную кнопку с характерным рисунком бинокля или надписью "Поиск записи", откройте окно кода для события Click. Скорее всего там будут следующие строчки:

- общие характеристики автомобилей. Одна таблица Automobil passenger car будет выглядеть примерно так:



Sub Кнопка40 Click() On Error GoTo Err Кнопка40 Click Screen .PreviousControl.SetFocus

DoCmd.DoMenuItem acFormBar, acEditMenu, 10, , acMenuVer70 Exit Кнопка40 Click:

Exit Sub Err Кнопка40 Click:

MsgBox Err.Description

Resume Exit Кнопка40 Click End Sub

По сути, код события Click для этой кнопки просто выполняет команду Найти меню Правка. С тем же успехом вы могли создать макрос с единственной макрокомандой Команда меню, имеющей аргументы :

• Строка меню - Форма

• Название меню - Правка

• Команда - Найти

После этого просто перетащите графический образ макроса из вкладки Макрос в любое место формы, и вы получите кнопку, которая будет выполнять то же самое, что и кнопка, созданная Мастером, а если вы назовете макрос "Поиск записи", то и надпись на кнопке будет аналогичной. Ваш макрос делает то же, что и следующая строчка из процедуры, созданной Мастером:

DoCmd.DoMenuItem acFormBar, acEditMenu, 10, , acMenuVer70

Выполнить этот макрос, когда не активна строка меню Форма, невозможно, впрочем, как невозможно воспользоваться и методом объекта DoCmd DoMenuItem из процедуры Мастера. Мы все время зависим от наличия на экране меню Форма. Единственное преимущество кода события по сравнению с нашим макросом заключается в том, что первый обработает ошибку, когда выяснит, что не может выполниться. Будет выдано сообщение, связанное с этой ошибкой, а наш макрос просто "повиснет", выведя на экран окно обработчика ошибок макросов. Впрочем, даже если меню присутствует на экране, то совсем не обязательно, что будет найдена запись, соответствующая введенному образцу.

Если нужная запись не будет найдена, на экран будет выведено стандартное сообщение Access: "Поиск записей в приложении Microsoft Access завершен. Элемент не найден"

В качестве примера организации поиска данных рассмотрим создание своей собственной формы, которая будет возвращать то сообщение, которое мы хотим получить в случае неудачного поиска.

Пример формы "ПОИСК" вы найдете в файле базы данных AUTOSTORE.MDB, который находится на дискете, прилагаемой к данной книге. Форма "AUTOMOBIL PASSENGER CAR" имеет кнопку для поиска данных в текущем текстовом поле. При ее нажатии вызывается форма

"ПОИСК".

В модуле Bookmodule объявляются две переменные: LastForm типа Form и lastcntr типа Control:

Dim LastForm As Form Dim lastcntr As Control

Первая служит для передачи переменной формы, а вторая для передачи переменной последнего активного элемента управления для использования их в форме "ПОИСК".

В событии Click кнопки Поиск формы "AUTOMOBIL PASSENGER CAR" записываем следующий код:

Sub Кнопка40 Click()

Set LastForm = Screen.ActiveForm

Set lastcntr = Screen.PreviousControl

mybook=LastForm.Bookmark

PoiskSub End Sub

Процедура PoiskSub служит для установки флажка "В текущем поле". Дело в том, что последний элемент управления, который был активным до нажатия на кнопку Поиск, может быть



не связанным ни с каким полем - для него будет отсутствовать понятие "текущее поле". Следовательно, флажок нужно сделать недоступным, так как его значение используется для дальнейшего поиска:

Public Sub PoiskSub()

DoCmd.OpenForm "Поиск" Select Case lastcntr.ControlType

Case 109, 106, 110, 111

If Not IsNull(lastcntr.ControlSource) Then Forms![Поиск].[Flag3] = True

Else

Forms![Поиск].[Flag2] = False Forms![поиск].[Flag3] = False

End If Case Else

Forms![Поиск].[Flag2] = False Forms![поиск].[Flag3] = False End Select End Sub

Таким образом мы передали в процедуру обработки события Click последний активный элемент и последнюю активную форму как параметры и при этом выяснили, был ли последний активный элемент управления связанным или нет.

Для поиска мы используем методы из серии Find объекта RecordSet и метод FindRecord объекта DoCmd.

Набор данных для формы мы создаем с помощью свойства RecordSource. Это может быть таблица, запрос или выражение SQL. С помощью свойства RecordsetClone мы получаем ссылку на объект Recordset, указанный в свойстве RecordSource. Если источник данных для формы "AUTOMOBILE PASSENGER CAR" - таблица с тем же именем, то с помощью свойства RecordsetClone формы мы ссылаемся на объект, который создается с помощью следующей конструкции:

Dim myDb As DataBase, rst As Recordset

Set Mydb = dbEngine.Workspaces(0).Databases(0) Set rst = MyDb.OpenRecordset("AUTOMOBIL PASSENGER CAR", dbOpenDynaset)

Учтите, что объект Recordset функционирует сам по себе, то есть перемещение с помощью методов серии Move и Find не влияет на текущую отображаемую в форме запись. С целью синхронизации перемещения необходимо использовать свойство Bookmark, которое определяет текущую запись. Для этого свойство Bookmark формы сохраняют в переменной строкового типа, а потом присваивают это значение свойству Bookmark объекта Recordset, на который ссылаются с помощью свойства RecordsetClone формы.

В коде кнопки Поиск формы "AUTOMOBIL PASSENGER CAR" имеется следующая строчка:

mybook=LastForm.Bookmark

В коде кнопки Найти для формы "ПОИСК" свойство Bookmark устанавливается следующим образом:

LastForm.RecordsetClone.Bookmark=mybook

После поиска, если он удачен, значение свойства Bookmark объекта Recordset присваивается свойству Bookmark формы.

Как вы помните, весь этот процесс мы затеяли для того, чтобы выводить свое собственное сообщение при неудачном поиске. При этом мы рассмотрели вопросы взаимодействия формы с объектами доступа к данным (DAO).

Как правило, скорость работы в Access понижается с увеличением числа записей в таблице, что, впрочем, происходит и во многих других приложениях. Для того чтобы снизить негативные последствия этого явления, в Access предлагается использовать развитую систему фильтров. Фильтры можно устанавливать при работе с формой с помощью меню, макрокоманд или методов объекта DoCmd в программном коде.

Например, используя опцию "Фильтр по выделенному", вы можете, последовательно выделяя поля, устанавливать достаточно сложные фильтры. Последовательность действий выглядит следующим образом:



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