Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lopp.DOC
Скачиваний:
6
Добавлен:
31.03.2015
Размер:
187.39 Кб
Скачать
    1. Поиск данных в файле

Задачи на поиск данных в файле обычно имеют следующую формулировку: По какой специальности учится Петров А.Б.? Предположим, что существует файл, среди полей которого имеются ФАМИЛИЯ и СПЕЦИАЛЬНОСТЬ. Поиск выполняем по полю ФАМИЛИЯ, при нахождении требуемой записи считываем значение из поля СПЕЦИАЛЬНОСТЬ. Для организации поиска очень важно, проводится он по индексированным (по ключу или по вторичному индексу – это несущественно) или по неиндексированным полям. Поиск по неиндексированному полю предполагает полный перебор всех записей файла до нахождения нужной записи или до конца файла. Поиск может быть прерван до достижения конца файла, если нас интересует лишь одна запись с требуемым значением в поле и такая запись была найдена или заранее известно, что существует только одна такая запись. В противном случае придется просматривать весь файл. В общем случае недопустим перенос всего файла в массив (запись) и поиск там. Файлы предназначены для хранения большого количества информации, которое обычно не помещается во внутренней памяти ЭВМ. Такой способ обработки допустим, если имеем дело с небольшими файлами и требуется их многократный просмотр.

Проиллюстрируем сказанное на примерах: пример 1 содержит поиск по неиндексированному полю до нахождения первой записи с требуемым значением; пример 2 содержит поиск по индексированному полю. Для примера 1 используем файл студентов. Вид экрана после успешного поиска представлен на рис. 7.2. Если поиск кончился неудачно (студента нет в файле), то выдается соответствующее сообщение.

Запомните правило! Не должно быть программ, которые после завершения не выдают ответа. В любом случае должно быть выдано сообщение о результате работы программы, каким бы ни был этот результат.

Приведем реализацию кнопки НАЧИНАЙ:

procedure TForm1.Button1Click(Sender: TObject);

Var

s1,s2 :string;

b1 :Boolean;

begin

b1:=true;

s1:=Edit1.Text; {Заданная фамилия студента}

with Table1 do

begin

First; {Поиск начинается с первой записи}

while b1 AND NOT EOF do

{ Цикл выполняется до конца файла или до нахождения требуемого студента}

begin

s2:=FieldByName('FAM').AsString;

if s1=s2 then

begin{Студент найден}

Edit2. Text:=IntToStr(FieldByName('SPEC').AsInteger);

b1:=false;

end;

next; {Переход к следующей записи файла}

end;

end;

if b1 then

ShowMessage('Нет такого студента'); {Если студент не найден}

end;

Предупреждение:операция сравнения символьных строк (if s1=s2 ...) опасная: при малейшем несовпадении строк (лишний пробел в начале, использование больших/маленьких букв) равенства не будет!

Рис. 7.2. Поиск по неиндексированному полю

Рассмотрим поиск по индексированному полю, несущественно по ключевому или по вторичному. Вспомним, что файл студентов был индексирован по полю специальность, имя индекса SPEC_IND. Для индексации необходимо войти в Database Desktop, как поступить дальше – см. выше! Вид главной формы с ответом приведен на рис. 7.3. Поиск по индексированному полю заканчивается при нахождении первой записи с заданным значением. Вспомните, что в ключевом поле повторение значений недопустимо, в поле вторичного индекса это, в общем случае, разрешено.

Рис. 7.3. Поиск по индексу

Реализация кнопки НАЧИНАЙ:

procedure TForm1.Button1Click(Sender: TObject);

Var

s1 :integer;

begin

with Table1 do

begin

IndexName:='SPEC_IND'; {Задаем имя индекса}

s1:=StrToInt(Edit1.Text);{Требуемое значение индексного поля}

if Findkey([s1]){Поиск по индексу}

then Edit2.text:=FieldByName('FAM').AsString

else ShowMessage('Не найден');

end;

end;

Дадим некоторые разъяснения к этой программе:

  • если вторичный индекс определен по одному полю, то вместо имени индекса, как в примере, можно задать имя индексного поля, в данном случае IndexFieldNames:='SPEC';

  • имя индекса (но не индексного поля) можно задать в свойстве IndexName объекта Table, в таком случае в процедуре соответствующий оператор не требуется;

  • можно проводить одновременно поиск по нескольким индексным полям, в таком случае IndexFieldNames присваивается несколько имен полей, разделенных точками с запятой, а в FindKey в квадратных скобках должны быть значения для каждого поля.

Имеется процедура поиска FindNearest, которая дает положительный результат поиска всегда: будет найдена наиболее близкая к заданному значению запись. Фактические параметры для него задаются точно так, как для FindKey.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]