- •7.1 Организация доступа к данным средствами технологии ado
- •7.2 Обзор средств доступа к базам данных
- •7.3 Краткая характеристика указанных компонентов
- •7.4 Создание простого приложения с базой данных
- •7.5 Основные свойства и методы компонента Table
- •7.6 Основные свойства и методы компонента Query1
- •7.7 Выполнение поиска по некоторому параметру
- •7.8 Использование языка запросов sql для поиска
- •7.9 Заполнение таблиц
- •7.10 Использование модуля данных
- •7.11 Создание отчетности
7.7 Выполнение поиска по некоторому параметру
Поиск можно реализовать с помощью компонентов TADOTable, TADOQuery.
Для поиска в компоненте TADOTable есть свойство Filter. В нем можно указывать условие, по которому будут отображаться данные.Чтобы фильтр заработал, нужно установить значения свойств TADOTable:
Свойство значение
Filtered true
Filter текст условия в виде Поле [оператор сравнения]’значение’
Например, если нужно отобразить все записи таблицы tovar, в которых название товара (поле title-tovar) равно значению «ватман», то нужно записать:
ADOTable1->Filter="title_tovar=’ватман’";
Для возможности изменения фильтра, можно использовать строку ввода TЕdit. Поместить на форму дополнительно компонент Tedit1, где вводятся названия товара, и кнопку - «Фильтрация по названию товара». В этом случае поиск задается программно и будет иметь вид:.
void __fastcall TForm2::Button1Click(TObject *Sender)
{
ADOTable1->Filtered=False;
ADOTable1->Filter="title_tovar='"+Edit1->Text+" '"; //фильтр
ADOTable1->Active=True; //активизируется таблица
ADOTable1->Filtered=True; //включается фильтр
}
Значение нужно указывать в одинарных кавычках (апострофы), а строк ввода заключается в кавычки, поэтому условие имеет вид '"+Edit1->Text+". Это конструкция будет использоваться и дальше.
7.8 Использование языка запросов sql для поиска
Если просто вписать запрос в свойство SQL компонента ADOQuery и его не изменять в течение всей программы, то такой запрос называется статическим. Но если в течение выполнения программы надо изменять текст запроса, то это динамический запрос.
Например, надо выбрать поля title_tovar, price_tovar (название товара и цена товара) из таблицы tovar, где поле title_tovar равно названию определенного товара. Если запрос задать на этапе проектирования, то свойство SQL компонента ADOQuery принимает следующее значение:
Свойство значение
SQL select * from tovar where title_tovar =”ватман”
для товара «ватман». При поиске записей приходится изменять запрос, потому что каждый раз используется разное значение параметра, которое необходимо найти. Сам запрос не меняется при этом.
В этом случае удобнее в запрос ввести переменную и изменть ее и запросы задавать на этапе программирования.
Поместить на форму компоненты, как показано на рисунке 3. Edit1 – для ввода названия товара, Label4 - для вывода количества товаров с указанным наименованием.
Код для поиска указанного товара имеет вид
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("select title_tovar, price_tovar from tovar where title_tovar='"+Edit1->Text+"'");
ADOQuery1->Open();
Label4->Caption=IntToStr(ADOQuery1->RecordCount);
}
Рисунок 3
Компоненты TADOTable и TADOQuery имеют свойство RecordCount – количество строк в таблице.
Усложним задачу: в компоненте Edit1 указывается название товара, по которому производится поиск, а в компоненте Edit2 – дата покупки.
На форму поместить компоненты, как показано на рисунке 4.
Необходимо вывести данные по указанному товару, проданному на указанную дату: название товара, цену товара, количество, указанное в счете, дату. При использовании языка запросов SQL код обработчика будет иметь следующий вид
void __fastcall TForm1::Button3Click(TObject *Sender)
{
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Text="Select tovar.title_tovar, tovar.price_tovar, orders.qty_order, orders.date_order from tovar,orders where tovar.title_tovar='"+Edit1->Text+"' and orders.date_order='"+Edit2->Text+"' and orders.id_tovar=tovar.id_tovar";
ADOQuery1->Open();
}
Если в запросе используется оператор select, то используется метод Open().
Если в запросе удаляются строки или изменяется структура столбца (в запросе есть такие операторы , как INSERT, UPDATE, DELETE или и CREATE TABLE), необходимо вызвать метод ExecSQL компонента ADOQuery. То есть, если запрос возвращает данные, то достаточно активировать компонент, а если изменяет, то запрос нужно выполнить с помощью ExecSQL, Open() не использовать.
Например, чтобы удалить строку в таблице, можно записать следующий код обработчика
{
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Text="Delete tovar where id_tovar='"+Edit1->Text+"'";
ADOQuery1->ExecSQL();
}
Рисунок 4
