Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

мет_BD Delphi

.pdf
Скачиваний:
18
Добавлен:
26.02.2016
Размер:
702.49 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА 4 Поиск записей

Для поиска записи по любому полю предназначены методы Locate и Lookup. Метод Locate ищет первую запись, удовлетворяющую критерию поиска, и если такая запись найдена, делает ее текущей. В этом случае в качестве результата

возвращается True. Если поиск был неуспешен, возвращается False. Синтаксис метода:

Locate (const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean;

Параметры метода:

Список KeyFields указывает в виде строкового выражения поле или несколько полей, по которым ведется поиск. В случае нескольких поисковых полей их названия разделяются точкой с запятой.

Критерии поиска задаются в вариантном массиве KeyValues так, что i-e значение в KeyValues ставится в соответствие i-му полю в KeyFields. В случае поиска по одному полю в KeyValues указывается одно значение.

Options позволяет указать необязательные значения режимов поиска:

loCaseInsensilive – поиск ведется без учета высоты букв, т.е. если в KeyValues указано «принтер», а в некоторой записи в данном поле встретилось «Принтер» или «ПРИНТЕР», запись считается удовлетворяющей условию поиска;

loPartialKey – запись считается удовлетворяющей условию поиска, если она содержит часть поискового контекста. Например, удовлетворяющими контексту «Ма» будут признаны записи со значениями в искомом поле «Машин», «Макаров» и т.д.

Например, пусть имеется таблица базы данных «Сотрудники кафедры» со строковыми полями «FIO» (ФИО), «Doljnos» (должность), «UchStepen» (ученая степень). Обработчик события поиска записей, содержащих значение «доцент» в поле «Doljnost» и значение «кхн» в поле «UchStepen», при режиме частичного совпадения значений будет выглядеть следующим образом:

procedure TForm1.Button1Click (Sender: TObject); begin

ADOTable1.Locate('Doljnost;UchStepen', VarArrayOf (['доцент', 'кхн']), [loPartialKey]);

end;

Пусть заранее неизвестно, по какому полю необходимо производить поиск. Тогда можно поместить в форму компонент TRadioGroup, в котором перечислить поля поиска, и компонент TEdit для ввода условий поиска. Тогда можно написать следующий обработчик:

procedure TForm1.Button1Click (Sender: TObject); var Pole: string;

begin

Case RadioGroup1.Itemlndex of

0:Pole:='FIO';

1:Pole:='Doljnost;

2:Pole:='UchStepen';

End;

If not Table1.Locate (Pole, Edit1.Text, [loPartialKey, loCaselnsensitive]) Then ShowMessage ('Нет записи');

end;

21

Преимущество показанного способа в том, что вместо выполнения нескольких методов Locate (для поиска по каждому полю) выполняется один метод Locate независимо от поля, по которому производится поиск.

Метод Lookup находит запись, удовлетворяющую условию, но не делает ее текущей, а возвращает значения некоторых полей этой записи. Тип результата - Variant или вариантный массив. Метод Lookup осуществляет поиск только на точное соответствие критерия поиска и значения полей записи. Поиск по частичному соответствию значений отсутствует.

Синтаксис метода:

Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant;

Параметры метода:

В KeyFields указывается список полей, по которым необходимо осуществить поиск. При наличии в этом списке нескольких полей соседние поля разделяются точкой с запятой.

KeyValues указывает поисковые значения полей, список которых содержится

вKeyFields. Если имеется несколько поисковых полей, каждому i-му полю в списке KeyFields ставится в соответствие i-oe значение в списке Key Values. При наличии одного поля, его поисковое значение можно указывать в качестве Key Values непосредственно; в случае нескольких полей – их необходимо приводить к типу вариантного массива при помощи VarArrayOf.

ResultFields содержит список полей, значения которых нужно вернуть в результате поиска.

Если поиск по какой-либо причине не был произведен, метод возвращает зна-

чение False.

Замечание. Независимо от успеха поиска записи указатель текущей записи в наборе данных не изменяется.

Рассмотрим пример поиска в таблице базы данных «Сотрудники» по полю «FIO». Поисковое значение вводится компонент TEdit. В качестве результата будем выдавать значение поля «UchStepen». Обработчик события будет выглядеть следующим образом:

procedure TForm1.LookupButtonClick (Sender: TObject);

var LookupResults: Variant; // результат begin

LookupResults := ADOTable1.Lookup ('FIO', Edit1.Text, 'UchStepen'); // осуществить поиск

Label1.Caption := ''; // отображаем значения результирующих полей // проверяем, содержит ли результат пустое значение или Null:

CASE VarType(LookupResults) of

varEmpty: Label1.Caption := 'Пустой результат'; varNull: Label1.Caption := 'Запись не найдена';

ELSE // результат содержит какое-то значение

Label1.Caption := LookupResults; END; //case

end;

Если соответствующих нашему запросу строк не найдено, то Lookup вернёт пустую (Null) переменную, что выявляется при помощи предложения:

IF VarType(LookupResults)=varNull THEN ...

22

4.1 Использование метода Locate

1 Создать новый проект согласно рисунку 20.

Рисунок 20 – Вид формы для проекта Proba_Poisk.dpr

2 Сохранить форму приложения как «Unit_Poisk.pas», а проект – как «Proect_ Poisk.dpr».

3Создать обработчик нажатия кнопки «Закрыть приложение» с кодом: Close;

4Создать обработчик нажатия кнопки «Locate»:

procedure TForm1.Button1Click (Sender: TObject); var Pole,s: string;

begin // определяем, какой параметр поиска выбран: case RadioGroup1.ItemIndex of

0: begin // поиск по дате прихода товара

Pole:='DataPrih';

s:=DateToStr(DateTimePicker1.Date);

end;

1: begin // поиск по наименованию товара

Pole:='Tovar'; s:=Edit1.Text; end;

end;

if not ADOTable1.Locate(Pole, s, [loCaseInsensitive, loPartialKey]) then

ShowMessage('Запись не найдена'); end;

5 Сохранить изменения и запустить приложение на выполнение.

4.2Использование метода Lookup

1На форму проекта «Proect_Poisk.dpr» поместить еще один компонент TButton, в его свойство Caption ввести строку «Lookup» (рисунок 21).

2Внизу формы разместить два компонента TLabel для отображения результатов поиска (рисунок 21).

23

Рисунок 21 – Измененная форма проекта Proba_Poisk.dpr

3 Создать обработчик нажатия кнопки «Lookup»:

procedure TForm1.Button3Click(Sender: TObject); var pole: string; // по какому полю ищем

s: string; // какое значение ищем

FildsResult: string; // список результирующих полей LookupResult : variant; // массив результатов поиска

begin

// определяем, какой параметр поиска выбран: case RadioGroup1.ItemIndex of

0: begin // поиск по дате прихода товара pole:='DataPrih'; s:=DateToStr(DateTimePicker1.Date); FildsResult:='Tovar;Kolvo';

end;

1: begin // поиск по наименованию товара pole:='Tovar'; s:=Edit1.Text; FildsResult:='DataPrih;Kolvo';

end;

end;

// включаем поиск:

LookupResult:=ADOTable1.Lookup(pole,s,FildsResult); if VarType(LookupResult)=varNull then

ShowMessage('Запись не найдена')

else

if VarType(LookupResult)=varEmpty then ShowMessage('Поиск не проведен')

else

if VarIsArray(LookupResult) then

//если LookupResult является вариантным массивом, функция VarIsArray (LookupResults) возвращает True

begin // покажем значения результирующих полей в TLabel

Label3.Caption:=LookupResult[0];

24

Label4.Caption:=LookupResult[1]; end

else Label3.Caption:=LookupResult; end;

4Сохранить изменения и запустить приложение на выполнение.

5Самостоятельно с помощью TLabel добавить соответствующие подписи с названиями полей для результатов поиска, отображаемых с помощью метода

Lookup.

ЛАБОРАТОРНАЯ РАБОТА 5 Организация запросов к базе данных

Для выборки из базы данных записей, удовлетворяющих некоторому критерию, предназначен компонент TADOQuery.

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

В общем виде запрос на выборку из таблицы данных выглядит так:

SELECT Список_Полей FROM Таблица

WHERE (Критерий_выбора) ORDER BY Список_Полей

где SELECT – команда выбора записей из таблиц и вывода содержимого полей, имена которых указаны в списке; FROM – параметр команды, определяющий имена таблиц, из которых нужно сделать выборку; WHERE – параметр, определяющий критерий выбора (в простейшем случае это инструкция проверки содержимого поля); ORDER BY – параметр, определяющий порядок сортировки записей, удовлетворяющих критерию запроса.

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

Вкачестве примера рассмотрим запрос, обеспечивающий выборку из базы данных «Школа» из таблицы «School» записей, у которых в поле «Class» находится текст «10а», упорядоченных по алфавиту:

SELECT Fam, Name FROM School

WHERE (Class='10a') ORDER BY Name, Fam

Следующий запрос обеспечивает выбор информации об учениках, фамилии которых начинаются на букву «К»:

SELECT Fam, Name FROM School WHERE (Fam>'K') and (Fam<'Л') ORDER BY Name, Fam

Запрос может быть сформирован и записан в свойство SQL компонента TADOQuery во время разработки формы или во время работы программы.

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

в строке свойства SQL окна инспектора объектов.

Если запрос записан в свойство SQL во время разработки формы приложения, то во время работы программы критерий запроса можно изменить простой заменой соответствующей строки текста запроса.

25

Замечание. Перед изменением свойства SQL запрос должен быть закрыт при помощи метода Close.

Если запрос возвращает набор данных, то для выполнения запроса используется метод Open. В противном случае необходимо применять метод ExecSQL.

5.1Запросы на выборку

1Создать новое приложение. Сохранить форму приложения как

«Unit_Query_1.pas», а проект – как «Proect_Query_1.dpr».

2Разместить на форме компоненты TADOQuery и TDataSource и задать для них свойства:

для ADOQuery1: ConnectionString – соединение с базой Sklad.mdb;

для DataSource1: DataSet – ADOQuery1.

3Разместить на форме компонент TDBGrid и установить для него свойство

DataSource в значение DataSource1.

4В свойство SQL компонента ADOQuery1 ввести текст SQL-запроса:

SELECT *

FROM Prihod

WHERE Kolvo>=15

ORDER BY DataPrih, Tovar

5 Закрыть редактор, нажав кнопку ОK.

Как видно из текста запроса, набор данных включает все поля таблицы «Prihod». При этом отображаются только записи, имеющие в поле «Kolvo»значение не менее 15.

6Установить для компонента ADOQuery1 свойство Active в значение True.

7Разместить на форме компонент TBitBtn (страница Additional) и установить для него свойство Kind в значение bkClose.

8Сохранить изменения и запустить программу на выполнение.

Рассмотрим возможность изменения критерия запроса во время работы программы. Пусть программа обеспечивает вывод как всего списка товаров, так и его части. Например, посредством выполнения запроса пусть выводится информация только о конкретном товаре.

9Поместить на форму два компонента TButton с надписями «Запрос» и «Все записи» (рисунок 22).

Рисунок 22 – Вид формы для проекта Proba_Query_1.dpr

10 Создать обработчик нажатия кнопки «Запрос»:

26

procedure TForm1.Button1Click(Sender: TObject); var tov: string [20];

begin

tov:=InputBox('Выборка информации из БД','Укажите товар и щелкните на Ok','');

if tov<>'' then begin

ADOQuery1.Close; // закрыть результат предыдущего запроса // запись нового критерия запроса в свойство SQL в строку №2:

ADOQuery1.SQL[2]:='where'+'(tovar="'+tov+'")'; ADOQuery1.Open; // активизируем выполнение запроса

if ADOQuery1.RecordCount=0 then // если не найдены записи

ShowMessage('В БД нет записей о данном товаре');

end;

end;

Процедура TForm1.Button1Click запускается щелчком кнопки «Запрос». Она принимает от пользователя строку (наименование товара) и записывает в свойство SQL новый критерий запроса. Затем эта процедура вызовом метода Open активизирует выполнение запроса.

11 Создать обработчик нажатия кнопки «Все записи»:

procedure TForm1.Button2Click (Sender: TObject); begin

ADOQuery1.Close;

ADOQuery1.SQL[2]:=''; // очищаем критерий запроса в свойстве SQL

ADOQuery1.Open;

end;

12 Сохранить изменения и запустить программу на выполнение.

5.2 Формируемые запросы

Чтобы сформировать запрос во время работы программы, можно добавить строки SQL-запроса в список SQL, используя метод Add.

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

with Form1.ADOQuery1 do begin

Close; // закрыть результат выполнения предыдущего запроса SQL.Clear; // удалить текст предыдущего запроса

// записать новый запрос в свойство SQL:

SQL.Add('SELECT Fam,Name,Class); SQL.Add('FROM School'); SQL.Add('WHERE'); SQL.Add('(Fam="'+fam+'")'); SQL.Add('ORDER BY Name,Fam');

Open; // активизируем выполнение запроса end;

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

1 Создать новое приложение. Сохранить форму приложения как

«Unit_Query_2.pas», а проект – как «Proect_Query_2.dpr».

2Разместить на форме компоненты TADOQuery и TDataSource и задать для них свойства:

27

для ADOQuery1: ConnectionString – соединение с базой Sklad.mdb;

для DataSource1: DataSet – ADOQuery1.

3Разместить на форме компонент TDBGrid, в свойстве DataSource которого установить значение DataSource1.

4Разместить на форме компонент TLabel, в свойство Caption которого ввести текст «Отобразить поля» (рисунок 23).

Рисунок 23 – Вид формы проекта Proba_Query_2.dpr

5Разместить на форме компонент TComboBox, заполнив свойство Items списком возможных комбинаций полей:

tovar,dataprih,kolvo

tovar,dataprih

tovar,kolvo tovar,dataprih,kolvo,zena_ed tovar,dataprih,zena_ed tovar,kolvo,zena_ed tovar,zena_ed

6Создать обработчик события OnChange выбора элемента списка в ComboBox1: procedure TForm1.ComboBox1Change(Sender: TObject);

var s0,s1,s2: string; begin

case ComboBox1.ItemIndex of 0,3: begin

s0:='select p.tovar,p.dataprih,p.kolvo'; s1:='from prihod p';

end; 1,4: begin

s0:='select p.tovar,p.dataprih'; s1:='from prihod p';

end; 2,5: begin

s0:='select p.tovar,p.kolvo'; s1:='from prihod p';

end;

6: begin

s0:='select p.tovar,t.zena_ed'; s1:='from prihod p, tovary t'; s2:='where p.tovar=t.tovar';

end; end; //case

28

if ComboBox1.ItemIndex in [3,4,5] then begin

s0:=s0+', t.zena_ed'; s1:=s1+', tovary t'; s2:='where p.tovar=t.tovar';

end;

ADOQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add(s0); ADOQuery1.SQL.Add(s1); ADOQuery1.SQL.Add(s2);

ADOQuery1.Open;

end;

7Разместить на форме компонент TBitBtn (страница Additional) и установить для него свойство Kind в значение bkClose.

8Сохранить изменения и запустить программу на выполнение.

5.3 Запросы с параметром

Создадим приложение, позволяющее получать информацию о конкретном

товаре, поступившем в определенный день. Для динамического запроса «выдать записи по приходу товара, определяемого параметром :TOV, за дату, определяе-

мую параметром :DATPR» будем вводить текущие значения параметров в компоненты TEdit и TDateTimePicker. Открытие набора данных, представляемого TADOQuery, будем производить после нажатия кнопки «Запрос» (рисунок 24).

Рисунок 24 – Вид формы проекта Proba_Query_3.dpr

1 Создать новое приложение. Сохранить форму приложения как

«Unit_Query_3.pas», а проект – как «Proect_Query_3.dpr».

2 Разместить на форме компоненты ADOQuery и TDataSource и задать для них свойства:

для ADOQuery1: ConnectionString – соединение с базой Sklad.mdb;

для DataSource1: DataSet – ADOQuery1.

3 Разместить на форме компонент TDBGrid и установить для него свойство

DataSource в значение DataSource1.

4 В свойство SQL компонента ADOQuery1 ввести текст SQL-запроса:

SELECT * FROM Prihod

WHERE (Tovar=:tov) and (DataPrih=:datpr)

29

Замечание. В критерии запроса используется два параметра :tov и :datpr.

5 У компонента ADOQuery1 раскрыть свойство Parameters. Откроется окно со списком параметров (рисунок 25).

Рисунок 25 – Список параметров динамического запроса

6Каждому параметру из списка необходимо поставить в соответствие определенный тип. В свойстве DataType для параметра tov установить значение ftString, а для параметра datpr – ftDateTime. Закрыть редактор параметров.

7Разместить на форме компоненты TEdit и TDateTimePicker, с помощью компонентов TLabel оформить поясняющие надписи (рисунок 24).

8Разместить на форме компонент TButton, задать для его свойства Caption значение «Запрос».

9Разместить на форме компонент TBitBtn, установив его свойство Kind=bkClose.

10Создать обработчик нажатия кнопки «Запрос»:

procedure TForm1.Button1Click(Sender: TObject); begin

ADOQuery1.Close; // закрыть результат предыдущего запроса //параметру Tov передать в качестве значения текст из Edit1:

ADOQuery1.Parameters[0].Value:=Edit1.Text;

//параметру Datpr передать содержимое DateTimePicker1:

ADOQuery1.Parameters[1].Value:= StrToDate(DateToStr(DateTimePicker1.Date));

ADOQuery1.Open; // активизируем выполнение запроса

if ADOQuery1.RecordCount=0 then

//если в результате нет записей с запрашиваемыми данными

ShowMessage('В БД нет записей с такими данными'); end;

11 Сохранить изменения и запустить программу на выполнение.

5.4 Формирование набора данных из нескольких таблиц

Проиллюстрируем создание набора данных из нескольких таблиц с помощью компонента TQuery.

1 Создать новое приложение. Сохранить форму приложения как

«Unit_Query_4.pas», а проект – как «Proect_Query_4.dpr».

2Разместить на форме компоненты ADOQuery и TDataSource, задав свойства:

для ADOQuery1: ConnectionString – соединение с базой Sklad.mdb;

для DataSource1: DataSet – ADOQuery1.

3Разместить на форме компонент TDBGrid и установить для его свойства

DataSource значение DataSource1.

4В свойство SQL компонента ADOQuery1 ввести текст SQL-запроса:

SELECT P.DataPrih, P.Tovar, P.Kolvo, T.Zena_Ed,

(P.Kolvo*T.Zena_Ed) As Stoim

FROM Tovary T, Prihod P

30