Анимация
JavaScript
|
Главная Библионтека
Вторая таблица - MODEL - вот так: key model name model key firm swept volume quantity drum capacity
Для связи таблицы используется поле 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 |