Использование языка запросов SQL для поиска — КиберПедия 

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Использование языка запросов SQL для поиска

2020-04-01 87
Использование языка запросов SQL для поиска 0.00 из 5.00 0 оценок
Заказать работу

Использование фильтра имеет недостаток - медленная скорость обработки фильтров. Для работы фильтра программе нужно получить все данные, а потом уже на стороне клиента произвести проверку. Таким образом, по сети идет слишком большое количество данных, и на клиента получается лишняя нагрузка. С большими базами желательно использовать SQL-запросы.

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

Пусть необходимо по названию товара получить всю информацию о нем.

Откройте новую форму. Поместите на нее компоненты: Label1 - с текстом подписи, Edit1 - для ввода названия товара; Label2, Label3 - для вывода количества записей со следующими свойствами:

 

Компонент Свойство Значение
Label1 Caption Введите название товара
Label2 Caption Видов данного товара

 

Код для поиска указанного товара имеет вид:

 

void __fastcall TForm2::Button1Click(TObject *Sender)

{->SQL->Clear();->SQL->Add("select PROD_DECS, COST from PRODUCTS_TBL where PROD_DECS='"+Edit1->Text+"'");->Open();->Caption=IntToStr(ADOQuery1->RecordCount);

}


 

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

 

ADOQuery1->SQL->("select PROD_DECS, COST from PRODUCTS_TBL");->SQL->Add("where PROD_DECS='"+Edit1->Text+"'");

 

Компоненты TADOTable и TADOQuery имеют свойство RecordCount - количество строк в таблице

Усложним задачу поиска - необходимо вывести данные по указанному товару, проданному на указанную дату: название товара, цену товара, указанное в счете количество, дату.

Поместите на форму компоненты Edit1 - для ввода названия товара, по которому производится поиск, Edit2 - для ввода даты покупки. При использовании языка запросов SQL код обработчика будет иметь следующий вид:

 

void __fastcall TForm1::Button1Click(TObject *Sender)

{->SQL->Clear();->SQL->Add("Select PRODUCTS_TBL.PROD_DECS,");->SQL->("PRODUCTS_TBL.COST, ORDERS_TBL.QTY,");->SQL->Add("ORDERS_TBL.ORD_DATE,");->SQL->Add(" from PRODUCTS_TBL,ORDERS_TBL");->SQL->Add("where PRODUCTS_TBL.PROD_DECS=");->SQL->Add("'"+Edit1->Text+"' and");->SQL->


 

Add("ORDERS_TBL.ORD_DATE='"+Edit2->Text+"' and");->SQL->("ORDERS_TBL.PROD_ID=PRODUCTS_TBL.PROD_ID");

ADOQuery1->Open();

}

 

Если в запросе используется оператор select, то используется метод Open().

Если в запросе удаляются строки или изменяется структура столбца (в запросе есть такие операторы, как INSERT, UPDATE, DELETE или/и CREATE TABLE), необходимо вызвать метод ExecSQL компонента ADOQuery. То есть, если запрос возвращает данные, то достаточно активировать компонент - Open(), а если изменяет, то запрос нужно выполнить с помощью ExecSQL. Например, чтобы заменить данные, удалить строку в таблице, вставить новую запись, можно записать следующие коды обработчика:

 

void __fastcall TForm1::Button1Click(TObject *Sender)

{->SQL->Clear();->SQL->Add("Update PRODUCTS_TBL set PROD_DECS='ручка1' where PROD_DECS='ручка'");->ExecSQL();

}

//---------------------------------------------------------------------------__fastcall TForm1::Button2Click(TObject *Sender)

{->SQL->Clear();


 

ADOQuery1->SQL->Text="Delete PRODUCTS_TBL where PROD_ID='"+Edit1->Text+"'";->ExecSQL();

}

//---------------------------------------------------------------------------__fastcall TForm1::Button3Click(TObject *Sender)

{->SQL->Clear();->SQL->Text="Insert into PRODUCTS_TBL (24,'коврик для мыши',3000)";->ExecSQL();

}

 

Заполнение таблиц

 

Рассмотрим задачу создания формы для ввода и редактирования записей таблицы. Вначале рассмотрим заполнение таблицы PRODUCTS_TBL. Откройте новую форму, поместите на нее компонент доступа к данным - TDBEdit1, TDBEdit2, TDBEdit, ADO Table1, DataSource1, DBNavigator1. Свойства компонентов приведены ниже в таблице 7.1.

 

Таблица 7.1 - Свойства компонентов

Компонент Свойство Значение
TDBEdit DataSource DataSource1
TDBEdit DataField Выбор соответствующего поля
DataSource DataSet ADO Table1
ADO Table1 Connection ADO Connection1
ADO Table1 TableName Выбор из списка
ADO Table1 Active True
DBNavigator1 DataSource DataSource1

 

Эти компоненты автоматически редактируют указанные поля в базе данных.

Запустите приложение. На навигаторе щелкните на кнопке Insert record. Введите данные в DBEdit, щелкните на кнопке Post edit. Данные будут введены в таблицу PRODUCTS_TBL.

Рассмотрим более сложную задачу - ввод данных в таблицу ORDERS_TBL.

Создадим новую форму для заполнения полей: ORD_NUM, CUST_ID, PROD_ID, ORD_DATE, QTY (соответственно номер счета, код клиента, код товара, дата счета и количество товара) и вычисляемого поля TOTAL_COST. Для заполнения используются компоненты DBEdit (вкладка DataControl).

При работе с формой при нажатии на кнопках (которые будут размещены на форме) «Описание товара», «Цена товара», «Стоимость товара» на форме появляются значения соответствующих полей на компоненте DBText. Эти значения определяются в зависимости от введенного кода товара в таблицу ORDERS_TBL. В связи с этим необходимо формировать запрос (по введенному коду товара) для определения цены и описания товара.

Итак, поместим на форму необходимые компоненты, список которых с их свойствами приведен ниже в таблице 7.2.

 

Таблица 7.2 - Свойства компонентов

Компонент Свойство Значение
TDBEdit DataSource DataSource1
TDBEdit DataField Выбор соответствующего поля
DataSource1 DataSet ADO Table1
DataSource2 DataSet ADO Query1
DataSource3 DataSet ADO Query2
ADO Table1 Connection ADO Connection1
ADO Table1 TableName Выбор из списка
ADO Table1 Active True
DBNavigator1 DataSource DataSource1
ADO Query1 Connection ADO Connection1
ADO Query2 Connection ADO Connection1
DBText1 DataSource DataSource2
DBText2 DataSource DataSource3

 

Компоненты DBText1, DBText2 связываются с полем PROD_DECS и COST программно, например: DBText1->DataField="PROD_DECS";.

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

- определение названия товара

 

void __fastcall TForm1::Button1Click(TObject *Sender)

{t;->SQL->Clear();=DBEdit3->Text;->SQL->Add("select PROD_DECS from PRODUCTS_TBL where _ID='"+t+"'");->DataField="PROD_DECS";

ADOQuery1->Open();

}

 

определение цены товара

 

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{AnsiString t; ->SQL->Clear();=DBEdit3->Text;->SQL->


 

Add("select COST from PRODUCTS_TBL where PROD_ID='"+t+"'");->DataField="COST";->Open();

}

 

вычисление стоимости товара и заполнение поля TOTAL_COST

 

//---------------------------------------------------------------------------__fastcall TForm1::Button3Click(TObject *Sender)

{->Caption=(StrToInt(DBText2->Caption)*StrToInt(DBEdit5->Text));->Text= DBText3->Caption;

//DBEdit6->Text= (StrToInt(DBText2->Caption)*StrToInt(DBEdit5->Text));

}

 

В некоторых случаях приложению требуется получить список имен полей таблицы, связанной с ADOQuery. Это может быть сделано методом GetFieldNames, который загружает список имен полей в любую переменную типа TStrings, передаваемую в него в качестве аргумента. Например, оператор ADOQuery1->GetFieldNames(ComboBox1l->Items);

загружает в выпадающий список ComboBox1 имена полей таблицы, связанной с ADOQuery1.

 

Использование модуля данных

 

При разработке приложений с большим количеством таблиц или использующих большое количество запросов, интерфейс форм может быть переполнен невизуальными компонентами, соответствующими наборам и источникам данных. Borland С++ Builder (а также и Delphi) позволяют создать специальное окно Data Module (модуль данных), которое удобно для хранения компонентов доступа к базам данных.

Модуль данных - это специальный тип формы, который во время выполнения программы остается невидимым. Модуль данных позволяет централизованно управлять моделью взаимодействия компонентов, ориентированных на работу с базами данных.

Чтобы добавить модуль данных в проект, следует выполнить следующие команды: File| New| Data Module. Далее на форме расположить невизуальные компоненты, для работы с базой данных: ADOConnection, DataSource, ADOTable, ADOQuery.

Для того чтобы форма имела связь с модулем данных, необходимо в соответствующий заголовочный файл формы включить директиву #include “Unit.h”.

Обратиться к объекту, расположенному в модуле данных, можно только по составному имени <название модуля данных>-><название объекта>. Например, следующим образом:

 

DataModule1->ADOTable1->Open();->ADOQuery->SQL-> Text="Delete tovar PROD_ID='"+Edit1->Text+"'";

DataModule1->ADOQuery1->ExecSQL();

 

Создание отчетности

 

При работе с базами данных всегда возникает потребность в формировании на их основе документов с целью последующей печати. В лабораторной работе рассматривается генератор отчетов Quick Reports, который входит в поставку Borland Builder C++.

В Borland Builder C++ отчеты QuickReport не устанавливаются, но это можно сделать самостоятельно. Для этого надо выбрать меню Project | Options и на вкладке Packages нажать кнопку Add. Найти файл dcltqr60. bpl, который должен находиться в папке Bin, где установлен Builder, и открыть его.

Все компоненты Quick Reports находятся на вкладке QReport палитры компонентов. Головной компонент TQuickRep. Этот компонент - основа любого отчета. Он представляет собой холст листа будущего отчета. Свойство Bands этого компонента (полосы) содержит несколько пунктов. В этих пунктах можно указать, что должен иметь будущий документ:

HasTitle - в этом разделе задается заголовок отчета;

HasColumnHeader - заголовки колонок. Если отчет содержит таблицу, то шапка, где будут определены названия колонок, создают в этой части документа. Если нужна будет таблица, то этому свойству присваивается значение true;

- HasDetail - если в отчете есть таблицы, то вид строк формируется в этом разделе.

HasPageFooter - в этом разделе создается нижний колонтитул;

DataSet - здесь указывается таблица, из которой отчет будет брать данные.

На вкладке QReport палитры компонентов доступен ряд компонентов, которые можно располагать в этих разделах: QRLabel - надпись (этот компонент просто отражает нужные данные); QRDBText - данные (предназначен только для отображения значения какого-либо поля из базы данных; QRSysData - системная информация (аналогичен TLabel, только отображает системную информацию: дату, время, номер страницы и т.д.); QRMemo - набор строк (аналогичен TMemo, отображает Memo-данные из базы данных).

Для предварительного просмотра созданного отчета используется метод QuickRep1->Preview().

Рассмотрим формирование отчетов:

а) выведем на печать список товаров. В отчете должны быть дата, время печати, название документа - «Список товаров».

Поместим на форму компоненты DataSource1, ADOTable1, QuickRep1. Настроим компоненты DataSource, ADOTable.

У компонента QuickRep1 для свойства DataSet установим значение ADOTable1. Откроем пункты свойства Bands. В свойстве HasTitle установить значение true. В появившуюся строку поместить компонент QRLabel со страницы QReport и в свойстве Caption ввести «Список товаров», также поместить компонент QRSysData1 для отображения текущей даты и времени. В свойстве HasColumnHeader установить значение true. Это означает, что в отчете будут отображаться названия полей таблицы. Вставить в появившуюся строку для полей три компонента QRLabel. В заголовках написать: Код товара, Описание товара, Цена товара.

В свойстве HasDetail установить значение true. Вставить в появившуюся строку три компонента QRDBText со следующими свойствами:

 

Компонент Свойство Значение
QRDBText DataSet ADOTable1
QRDBText DataField указать соответствующие поля
QRSysData1 Data qrsDateTime

 

Поместить на форму кнопку. При щелчке на этой кнопке должно открыться окно предварительного просмотра. Все настройки проводятся в инспекторе объектов. Следующий обработчик события выводит список товаров из таблицы PRODUCTS_TBL:

 

/---------------------------------------------------------------------------__fastcall TForm1::Button1Click(TObject *Sender)

{


 

QuickRep1->Preview();

}

 

б) создадим отчет по запросу, рассмотренному ранее: вывести данные по указанному названию товара, проданного на указанную дату. В отчете должны быть выведены следующие данные: название товара, цена товара, количество товара, стоимость товара, дата счета. Заголовок отчета имеет следующий текст:

данные по наименованию [название товара], купленному [дата счета].

Используем форму по поиску товара, купленного на определенную дату. Поместим компонент QuickRep, со значением ADOQuery1 свойства DateSet. Настроить пункты свойства Bands:

поместите компоненты QRLabel в строку заголовка отчета; учесть, что название товара и дата - изменяемые параметры, которые определяются в Edit1 и Edit2;

в строке HasColumnHeader отобразите названия полей;

в строке HasDetail поместите компоненты QRDBText; свойство DateSet имеет значение ADOQuery1..

В этом случае значение свойства DataField определяется программно:->DataField="+имя поля+";

Обработчик события для создания отчета для указанного запроса имеет вид:

 

void __fastcall TForm1::Button1Click(TObject *Sender)

{->Caption=Edit1->Text;->Caption=Edit2->Text;->SQL->Clear();->SQL->Text="Select PRODUCTS_TBL.PROD_DECS,


 

PRODUCTS_TBL.COST, ORDERS_TBL.QTY, _TBL.ORD_DATE, ORDERS_TBL.TOTAL_COST PRODUCTS_TBL,ORDERS_TBL where _TBL.PROD_DECS='"+Edit1->Text+"' and _TBL.ORD_DATE='"+Edit2->Text+"' and _TBL.PROD_ID=PRODUCTS_TBL.PROD_ID";->Open();->DataField="COST";->DataField="QTY";->DataField="TOTAL_COST";

QuickRep1->Preview();

}

 

Задание на лабораторную работу

 

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

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

 

Требования к отчету

 

Отчет по работе должен содержать:

разработанное приложение:

листинги модулей с комментариями.

Выполнить демонстрацию работы разработанного приложения.


 

7.10 Контрольные вопросы

 

На что ориентирована технология ADO?

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

Назвать компоненты для отображения данных.

Объяснить предназначение свойства и методы компонентов Datasource, ADOTable, ADOQuery.

Указать свойства компонента ADOTable, которые используются при фильтрации данных.

На что указывает свойство RecordCount и свойством каких компонентов оно может быть?

В каких случаях используются методы ExecSQL(), Open()?

Указать, с помощью какого метода можно получить список имен полей таблицы, связанной с ADOQuery.

Объяснить использование модуля данных.

Как обратиться к объекту, расположенному в модуле данных?

Перечислить основные пункты и объяснить назначение компонента Bands.

На что указывает компонент QRSysData?

Указать метод, используемый для предварительного просмотра созданного отчета.


 


Поделиться с друзьями:

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.057 с.