Программирование >>  Разработка пользовательского интерфейса 

1 ... 66 67 68 [ 69 ] 70 71 72 ... 147


Key auto key model

date

cost

swept quantity capaci

issue

volume

drum

100001

07.07.94

10000

1351

100002

06.06.95

10500

1351

100003

05.10.95

10500

1929

100004

08.09.95

25000

3982

100005

10.12.95

30000

3982

100006

02.01.96

30000

3982

100007

10.10.95

37000

3201

100008

12.06.96

26000

4300

В приведенной выше таблице сразу видна избыточность данных. Информация в полях swept volume, quantity drum, capacity явно дублируется; представьте, сколько записей придется вам редактировать, если характеристики одного из автомобилей надо изменить хотя бы потому, что перед этим они были введены с ошибкой. Разумнее разделить эту таблицу на две, в одной хранить информацию о автомобиле, характерную для каждого отдельного экземпляра, а в другой

t1=SECONDS()

? t1-t

? Mlook

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

Иной раз возникают задачи глобального изменения значений какого-нибудь из полей. К примеру, раньше все были гражданами СССР, а теперь стали гражданами России.

Чтобы одновременно поменять все значения в поле, часто применяется следующая команда:

REPLACE ALL citizenship WITH Россия

Тем, кто знаком с SQL, возможно, больше по душе следующая конструкция: UPDATE kadry SET citizenship = Россия которая работает раза в полтора быстрее.

Тем не менее наибольшей скорости глобального изменения гражданства можно добиться, имея уникальный ключ для всех работников. Например:

SELE kadry

SET ORDER TO rabId FOR I = 1 TO 100000

SEEK I

REPLACE citizenship WITH Россия NEXT

Данная программа выполнит замену в три раза быстрее, чем программа, использующая команду REPLACE с опцией ALL. Единственный ее недостаток - это необходимость строгого соблюдения правил присваивания идентификатора каждой записи. В противном случае надо обрабатывать еще и ошибку, которая может возникнуть, если не будет найдена подходящая запись. Если глобальный поиск выполняется часто, можем посоветовать создать индекс по выражению RECNO(), то есть по функции, которая возвращает номер записи по порядку.

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



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 служит для установки флажка В текущем поле . Дело в том, что последний элемент управления, который был активным до нажатия на кнопку Поиск, может быть



1 ... 66 67 68 [ 69 ] 70 71 72 ... 147

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика