
- •Раздел 1. Проектирование баз данных. 2
- •Раздел 2. Разработка приложений для работы с Базами Данных в среде Delphi. 25
- •Раздел 1. Проектирование баз данных.
- •1.1. Основы построения баз данных. Модели данных.
- •1.1.1. Реляционная модель данных.
- •1.1.2. Нормализация базы данных.
- •1.2. Проектирование базы данных методом “сущность-связь”.
- •Раздел 2. Разработка приложений для работы с Базами Данных в среде Delphi.
- •2.1. Технология создания информационной системы.
- •2.1.1.Создание таблиц базы данных в Database Desktop.
- •2.1.2. Целостность базы данных.
- •Программа bde Administrator и модули данных.
- •Компоненты доступа и работы с данными. Тема: Наборы данных. Состояние и режимы наборов данных.
- •Тема: Объекты поля. Операции с полями.
- •Тема. Отображение и выбор значения поля.
- •Тема. Визуальные компоненты отображения записей из набора данных.
- •Закладки.
- •Тема. Ограничения на вводимые значения.
- •Тема. Сортировка набора данных.
- •Тема. Операции с таблицей базы данных.
- •Тема. Фильтрация записей.
- •Тема. Поиск записей.
- •Тема. Модификация набора данных.
- •Тема. Работа с отчетами
- •Отчет для связанных наборов данных
- •Составной отчет
- •Модули данных
- •Конструктор отчетов Rave Report
- •Реляционный способ доступа к данным.
- •Основные сведения о языке sql.
- •Оператор выбора Select.
- •Агрегирование и группирование записей.
- •Объединение таблиц.
- •Вложенные запросы.
- •Модификация записей.
- •Примеры баз данных
Тема. Поиск записей.
Поиск – это нахождение записи, удовлетворяющей определенным условиям, возврат значений ее полей и переход на найденную запись.
Скорость поиска повышается за счет индексирования.
Методика SetKey. Поиск выполняется по индексированному полю.
Методы:
SetKey – обнуляется буфер значений, используемый для поиска, набор данных переводится в режим dsSetKey. В этом состоянии набор данных воспринимает последующий оператор присваивания значения полю не как присваивание, а как задание ключа поиска.
Функция GotoKey:Boolean; - перемещает курсор на запись, указанную для текущего ключа, и при успешном поиске возвращает значение True.
Например,
// поиск первой записи, соответствующей заданному в LETovar
// названию товара
TbTovar.IndexFieldNames:='T_Nazv';
TbTovar.SetKey;
TbTovar.FieldByName('T_Nazv').AsString:=LETovar.Text;
TbTovar.GotoKey;
GotoNearest – переводит курсор на наиболее похожую (совпадающую по первым символам) запись набора данных.
Например,
TbTovar.IndexFieldNames:='Tovar';
TbTovar.SetKey;
TbTovar.FieldByName('T_Nazv').AsString:=LETovar.Text;
TbTovar.GotoNearest;
Методика Find. Набор данных должен быть проиндексирован по полям, по которым осуществляется поиск. В этот метод передается массив значений ключевых полей в той последовательности, в которой они входят в индекс.
функция FindKey(const KeyValues: array of const): Boolean; - обеспечивается переход к записи, удовлетворяющей заданным значениям. Параметр KeyValues – массив значений ключевых полей в той последовательности, в которой они входят в индекс. Возвращает True, если поиск успешный.
Например,
TbTovar.IndexFieldNames:='T_Nazv;T_Cena';
if not TbTovar.FindKey([LETovar.Text,'50'])
then MessageDlg(‘Запись не найдена!',mtError,[mbOk],0);
FindNearest(const KeyValues: array of const); - перемещает курсор на запись, наиболее близкую к указанному значению ключевого поля (индекса). Массив-параметр должен содержать столько значений, сколько полей определено в составном индексе. В противном случае для недостающих полей будет передано значение NULL.
Например,
TbTovar.IndexFieldNames:='Т_Nazv;T_Cena';
TbTovar.FindNearest(['т','50']);
Например,
// поиск нужной записи по первым задаваемым символам
procedure TForm1.LE_tovarChange(Sender: TObject);
begin
TbTovar.FindNearest([LE_tovar.text]);
end;
Метод Locate. Допускает выполнение поиска по неиндексированным полям. Индексирование ускоряет поиск.
функция Locate(const KeyFields: String; const KeyValues: Variant: Options: TLocateOptions): Boolean; - выполняет для указанных полей KeyFields поиск первой записи, содержащей значения KeyValues, и при успешном завершении делает эту запись текущей. Параметр Options задает параметры поиска.
loCaseInsensitive – регистр букв не учитывается;
loPartialKey – допускается частичное совпадение значений.
Например,
TbTovar.Locate(‘T_Cena’,20,[]);
// ищется первая запись с ценой 20;
TbTovar.Locate('T_Prim',LETovar.Text,[loCaseInsensitive, loPartialKey]);
функция VarArrayOf(const Values: array of Variant): Variant; - формирует тип Variant из задаваемого массива параметров любого типа. Используется при поиске по нескольким полям.
Например,
TbTovar.Locate('T_Nazv;T_Cena',VarArrayOf([LETovar.Text, LECena.Text]),[loCaseInsensitive,loPartialKey]);
Метод Lookup.
функция Lookup (const KeyFields: string;
const KeyValues : Variant;
const ResultFields: string) : Variant;
Параметры KeyFields и KeyValues аналогичны методу Locate. Третий параметр – строка, перечисляющая поля, значения которых возвращаются в виде массива Variant. Метод Lookup не изменяет положение курсора, но считывает информацию из полей записи. Поиск выполняется при точном соответствии значений поиска и значений в полях записи с учетом регистра букв.
Например,
TbTovar.IndexFieldNames:='T_Nazv;T_Cena';
LECena.Text:=TbTovar.Lookup('T_Nazv',LETovar.Text,'T_Cena');
Если поиск неудачный, то возвращается значение NULL. Для распознавания такого результата используется функция
VarIsNull (const V:Variant): Boolean; - возвращает True, если V=NULL, и False в противном случае.
Если результатом поиска является массив, то в случае успешного поиска некоторые поля найденной записи могут быть пустыми. Необходимо проверять значение каждого элемента результирующего массива на равенство NULL. Элементами поиска могут быть поля как входящие в индекс, так не входящие в него.
Пример. Поиск методом Lookup в таблице Tovar.
procedure TForm1.TbTovarCalcFields(DataSet: TDataSet);
begin
TbTovarSumma.AsCurrency:=
TbTovarT_Cena.AsCurrency*TbTovarT_Kol_vo.AsInteger;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
TbTovar.Active:=True;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
TbTovar.Active:=False;
end;
procedure TForm1.BtnPoiskClick(Sender: TObject);
var Res:Variant;
begin
Res:=TbTovar.Lookup('T_Nazv;T_Cena',
VarArrayOf([LETovar.Text,LECena.Text]),
'T_Kol_vo;T_Prim');
// анализ результата поиска
if VarIsNull(Res) then ShowMessage('Такой записи нет!')
else begin
// проверка первой составляющей
if VarIsNull(Res[0]) then ShowMessage('Нет количества!')
else
Label1.Caption:=Label1.Caption+String(Res[0]);
// проверка второй составляющей
if VarIsNull(Res[1]) then ShowMessage('Нет примечания!')
else Label2.Caption:=Label2.Caption+String(Res[1]);
end;
end;
Навигация с псевдофильтрацией.
Перемещаться по набору данных можно как по отфильтрованному, при выключенной фильтрации. Условия фильтрации должны быть заданы через Filter и выключены через Filtered.
Методы
Function FindFirst: Boolean; Function FindLast: Boolean; Function FindNext: Boolean; Function FindPrior: Boolean;
- перемещают указатель текущей записи соответственно на первую, последнюю, следующую и предыдущую записи, удовлетворяющие условию фильтрации, которое задано через Filter.
Во время этих методов набор данных автоматически переводится в режим dsFilter, записи временно фильтруются, и выполняется переход на нужную запись.
Пример. Поиск с псевдофильтрацией в таблице Tovar.
procedure TForm1.FormCreate(Sender: TObject);
begin
TbTovar.Active:=True;
TbTovar.FilterOptions:=[foCaseInsensitive];
TbTovar.Filtered:=False;
end;
procedure TForm1.BtnFindClick(Sender: TObject);
begin
TbTovar.IndexFieldNames:='T_Nazv;T_Cena';
TbTovar.Filter:='T_Nazv='+#39+LETovar.Text+#39;
TbTovar.Filtered:=False;
TbTovar.FindFirst;
end;
procedure TForm1.BtnFirstClick(Sender: TObject);
begin
TbTovar.FindFirst;
end;
procedure TForm1.BtnPriorClick(Sender: TObject);
begin
TbTovar.FindPrior;
end;
procedure TForm1.BtnNextClick(Sender: TObject);
begin
TbTovar.FindNext;
end;
procedure TForm1.BtnLastClick(Sender: TObject);
begin
TbTovar.FindLast;
end;