Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...
Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...
Топ:
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов...
Оценка эффективности инструментов коммуникационной политики: Внешние коммуникации - обмен информацией между организацией и её внешней средой...
Генеалогическое древо Султанов Османской империи: Османские правители, вначале, будучи еще бейлербеями Анатолии, женились на дочерях византийских императоров...
Интересное:
Национальное богатство страны и его составляющие: для оценки элементов национального богатства используются...
Инженерная защита территорий, зданий и сооружений от опасных геологических процессов: Изучение оползневых явлений, оценка устойчивости склонов и проектирование противооползневых сооружений — актуальнейшие задачи, стоящие перед отечественными...
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Дисциплины:
2020-04-01 | 87 |
5.00
из
|
Заказать работу |
|
|
Использование фильтра имеет недостаток - медленная скорость обработки фильтров. Для работы фильтра программе нужно получить все данные, а потом уже на стороне клиента произвести проверку. Таким образом, по сети идет слишком большое количество данных, и на клиента получается лишняя нагрузка. С большими базами желательно использовать 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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!