Запрос в C++ Builder - это объект, представляющий собой набор данных. Обычно для создания запроса используется компонент TQuery - потомок абстрактного класса TDataSet.
Как и в случае с компонентом TTable, компонент TDataSource управляет взаимодействием между компонентами Data Controls и компонентом TQuery. Обычно приложение имеет один компонент DataSource для каждого компонента TQuery.
Наиболее часто используются следующие свойства компонента TQuery:
Компонент TQuery позволяет использовать операторы SQL для того, чтобы определять или создавать наборы данных, которые можно отобразить на экране, вставлять, удалять и редактировать строки.
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("Delete emp where empno=1010");
Query1->ExecSQL();
Query1->Open();
Query1->Close();
Компоненты TQuery обладают большим разнообразием методов, унаследованных от TDataSet. Наиболее часто используются следующие методы:Query1->Close();
Query1->SQL->Add("Delete emp where empno=:empno");
Query1->Prepare();
Метод Post подтвержает операции Insert, Update или Delete, совершая реальное физическое изменение в базе данных. Метод Cancel отменяет незавершенные операции Insert, Delete, Edit или Append.Query2->Insert();
Query2->Fields[0]->AsInteger = 100;
Query2->Fields[1]->AsString =Edit1->Text;
Query2->Post();
Visual Query Builder можно вызвать, выбирая компонент TQuery и нажимая правую кнопку мыши, после чего появляется контекстное меню, из которого следует выбрать опцию Query Builder.
Примечание. Visual Query Builder входит в комплект поставки не всех версий Borland C++ Builder либо может быть не установлен. В этом случае в контекстном меню может не быть соответствующей опции.
После выбора Query Builder на экране появится диалоговая панель Databases, позволяющая выбрать БД и осуществить соединение с ней (рис. 1).
После соединения с базой данных на экран выводится окно Visual Query Builder и диалоговая панель для выбора таблиц, используемых в запросе (рис. 2).
Панель инструментов Visual Query Builder позволяет выбирать операции, которые можно выполнить при создании, тестировании и просмотре текста запроса. Таблица 8.1 описывает назначения кнопок на панели инструментов Visual Query Builder:
Кнопка | Назначение |
|
Создает новый запрос. |
|
Открывает файл запроса. |
|
Сохраняет запрос в файле. |
|
Помещает на экране диалоговую панель Options, позволяющую установить различные опции запроса. |
|
Помещает на экран диалоговую панель Add Table, позволяющую вносить таблицы в оператор SQL. |
|
Помещает на экран диалоговую панель Expression, позволяющую создавать вычисляемые поля, допустимые с точки зрения языка SQL. |
|
Выводит окно с текстом сгенерированного SQL-запроса. |
|
Выполняет сгенерированный запрос и выводит на экран результаты. |
|
Устанавливает свойство SQL компонента TQuery равным сгенерированному запросу и закрывает Visual Query Builder. |
|
Отменяет присвоение свойства SQL компонента TQuery и закрывает Visual Query Builder. |
|
Выводит на экран оперативную помощь для Visual Query Builder. |
Для внесения одной или более таблиц в запрос следует выполнить следующее:
1.Если диалоговая панель Add Table не присутствует на экране, щелкнуть кнопкой Table на панели инструментов, чтобы вывести ее на экран.
2. Выбрать имя таблицы из списка таблиц в диалоговой панели и щелкнуть на кнопке Add. Описание структуры выбранной таблицы появится в верхней части окна окна Visual Query Builder.
3. Повторить п.2, пока все требуемые таблицы не будут внесены в запрос, и затем нажать кнопку Close.
Чтобы внести колонку одной из таблиц в запрос, нужно выбрать имя колонки и затем перетащить эту колонку и поместить ее на таблицу в нижней части окна, либо дважды щелкнуть на имени колонки. Для выбора всех полей таблицы следует перетащить в нижнюю часть окна значок * , находящийся над списком полей таблицы.
Чтобы скомбинировать информацию из нескольких таблиц, нужно определить, как будут соединяться разные таблицы. С помощью Visual Query Builder можно определить колонки, имена которых служат для связи таблиц. С этой целью нужно выбрать имя колонки, по которой осуществляется межтабличная связь, в одной из связываемых таблиц, нажать левую клавишу мыши и переместить курсор (он изменит форму) на имя соответствующей колонки другой таблицы. В результате в рабочем пространстве запроса образуется линия, связывающая колонки этих двух таблиц (рис. 8.7).
Можно просмотреть или отредактировать критерий соединения таблиц, два раза щелкнув на линии, показывающей это соединение в верхней части окна Visual Query Builder. При этом появляется диалоговый блок Join (рис.5):
Чтобы определить критерий отбора для запроса, нужно использовать строку Criteria таблицы в нижней части окна Visual Query Builder.
Строка Criteria допускает любые выражения запроса, являющиеся допустимыми с точки зрения предложения WHERE оператора SQL (табл. 2).
Выражение | Описание |
= | Равно |
> | Больше, чем |
< | Меньше, чем |
!= | Не равно |
like | Строка символов в сравнении с образцом. |
Between | Не меньше, чем начальное значение и не больше, чем конечное. |
In | Содержится в списке |
Условия OR вводятся как выражения в строку OR (ниже строки Criteria).
Можно отсортировать результаты в восходящем (ascending) или нисходящем (descending) порядке для выбранной колонки. Чтобы определить порядок сортировки для колонки, следует поместить указатель мыши на колонке около строки Sort , щелкнуть правой кнопкой мыши и выбрать Ascending или Descending из контекстного меню.
Можно сгруппировать результаты запроса, используя строку Option.
Если для какой-либо колонки нужно определить опции представления данных в запросе, следует поместить курсор на колонке около строки Option, щелкнуть правой кнопкой мыши, чтобы вывести на экран контекстное меню Option и выбрать нужную опцию.
Можно определить условия для результатов группировки, используя строку Group Condition, что эквивалентно внесению выражения с предложением HAVING в SQL-операторе SELECT, использующем предложение GROUP BY.
Visual Query Builder позволяет определить выражения как часть запроса. Выражения представляют собой операции вычислений на основе числовых значений, строковые операции и т.д.
Чтобы создать вычисляемое поле, следует щелкнуть кнопкой Expression на панели инструментов. Появится диалоговая панель Expression ( см. рис. 7).
Диалоговая панель Expression позволяет использовать в запросах арифметические операции умножения, деления, сложения, вычитания, имена колонок и составные выражения, такие как avg, count, min, max и sum. Можно редактировать вручную или строить выражения, используя блок редактора Expression.
Диалоговая панель Options (рис. 8) используется для того, чтобы определить опции для оператора SQL. Можно, например, удалить повторяющиеся записи (Remove Duplicate Records), использовав предложение DISTINCT оператора SQL. Чтобы вызвать диалоговую панель Options, нужно щелкнуть кнопкой Options на панели инструментов.
Можно выполнить запрос, сгенерированный Visual Query Builder. Результаты запроса отобразятся на экране в диалоговой панели Result Window (окно результатов). Это окно позволяет убедиться, что колонки запроса, критерий выбора, критерии группировки и сортировки были определены корректно. Чтобы выполнить запрос, нужно щелкнуть кнопкой Run на панели инструментов. Появится окно Result Window, подобное представленному на рис. 8.
Можно проверить текст запроса, просматривая окно SQL Statement, для чего следует щелкнуть на кнопке SQL на панели инструментов. Это окно показывает сгенерированный оператор SQL. При добавлении или изменении колонок запроса, критерия отбора, критерия группировки или сортировки содержимое окна SQL Statement редактируется автоматически (рис. 10).
Для завершения работы Visual Query Builder следует нажать кнопку с зеленой галочкой на инструментальной панели. После этого свойству SQL компонента TQuery, для которого был активизирован Visual Query Builder, будет присвоен сгенерированный текст SQL-запроса.
Создадим новый проект и сохраним его главную форму как CUST1.CPP, а проект как CUST.MAK.
Изменим заголовок заголовок формы на "Контроль заказов". Разместим на форме компонент TDBGrid, два компонента TGroupBox, один компонент TTable, два компонента TQuery, три компонента TDataSource. На компонент GroupBox1 поместим три компонента TRadioButton и два компонента TButton. На компонент GroupBox2 поместим два компонента TEdit, два компонента TEdit и один компонент TButton.
Установим следующие свойства для этих компонентов:
Имя компонента | Свойство | Значение |
Table1 | DatabaseName | BCDEMOS |
TableName | CUSTOMER.DB | |
Active | false | |
DataSource1 | DataSet | Table1 |
DBGrid1 | DataSource | DataSource1 |
Query1 | Database Name | BCDEMOS |
SQL | select * from orders | |
Active | false | |
DataSource2 | DataSet | Query1 |
Query2 | DatabaseName | BCDEMOS |
DataSource3 | DataSet | Query2 |
Button1 | Caption | Открыть список &клиентов |
Button2 | Caption | Открыть список &заказов |
RadioButton1 | Caption | Клиенты |
Checked | true | |
RadioButton2 | Caption | Заказы |
GroupBox1 | Caption | |
GroupBox2 | Caption | |
Button3 | Caption | Установить &диапазон |
Edit1 | Text | |
Edit2 | Text | |
Label1 | Caption | Начало: |
Label2 | Caption | Конец: |
RadioButton3 | Caption | Заказы клиентов |
void __fastcall TForm1::Button1Click(TObject *Sender)Теперь при нажатии на эту кнопку таблица Customer будет то открываться, то закрываться, при этом будет изменяться и надпись на кнопке.
{
if (Table1->Active)
{
Table1->Close();
Button1->Caption = "Ioe?uou nienie &eeeaioia";
}
else
{
Table1->Open();
Button1->Caption= "Cae?uou nienie &eeeaioia";
}
}
Создадим обработчик события OnClick для кнопки Button2:
void __fastcall TForm1::Button2Click(TObject *Sender)При нажатии на кнопку Button2 будет то открываться, то закрываться запрос Query1, содержащий список заказов:
{
if (Query1->Active)
{
Query1->Active = false;
Button2->Caption = "Ioe?uou список &caeacia";
}
else
{
Query1->Active = true;
Button2->Caption = "Заe?uou список &caeacia";
}
}
Создадим обработчики событий OnClick для радиокнопок RadioButton1 и RadioButton2:
void __fastcall TForm1::RadioButton1Click(TObject *Sender)Теперь с помощью этих радиокнопок можно переключаться между списком клиентов и списком заказов.
{
DBGrid1->DataSource = DataSource1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton2Click(TObject *Sender)
{
DBGrid1->DataSource =DataSource2;
}
Создадим обработчик события OnClick для кнопки Button3:
void __fastcall TForm1::Button3Click(TObject *Sender)Теперь с помощью полей редактирования Edit1 и Edit2 и кнопки Button3 можно выбрать диапазон номеров клиентов для отображения сведений о них в DBGrid1.
{
if (Table1->Active)
{
Table1->SetRangeStart();
Table1->Fields[0]->AsString = Edit1->Text;
Table1->SetRangeEnd();
Table1->Fields[0]->AsString = Edit2->Text;
Table1->ApplyRange();
}
}
Затем с помощью Visual Query Builder установим свойство SQL компонента Query2. Выберем в качестве имени базы данных BCDEMOS и внесем в запрос таблицы CUSTOMER и ORDERS. Затем установим связь между таблицами, проведя линию от поля CustNo в таблице CUSTOMER к полю CustNo в таблице ORDERS.
Внесем в запрос следующие поля:
Теперь отсортируем результаты запроса по номеру покупателя и выйдем из Visual Query Builder.
Используя инспектор объектов, выберем компонент Query2 и установим его свойство Active равным true.
Создадим обработчик события OnClick для RadioButton3:.
void __fastcall TForm1::RadioButton3Click(TObject *Sender)Скомпилируем приложение. Щелкнем кнопками и "Открыть список заказов", чтобы открыть оба набора данных. Попробуем, используя радиокнопки, переключаться между ними.
{
DBGrid1->DataSource= DataSource3;
}
Нажмем кнопку "Открыть список клиентов". Введем значения полей "Начало" и "Конец" (например, 1200 и 1700 соответственно) и затем нажмем кнопку "Установить диапазон". Убедимся, что значения номеров заказов действительно находятся в пределах этого диапазона.
Щелкнем на радиокнопке "Заказы клиентов" и убедимся, что результирующий набор данных действительно содержит сведения из обеих таблиц.
Создадим другую версию рассмотренного выше примера с использованием модуля данных. В этом случае компоненты Data Access помещаются в модуль данных, а ссылка на соответствующий h-файл помещается в модуль, связанный с главной формой приложения.
Приведем исходный текст модуля, связанного с главной формой новой версии приложения:
//----------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop#include "cust1.h"
#include "custdm1.h" // Ссылка на модуль данных
//-----------------------------------------------------
#pragma link "Grids"
#pragma resource "*.dfm"
TForm1 *Form1;
//-----------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
}
//-----------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (DataModule1->Table1->Active)
{
DataModule1->Table1->Close();
Button1->Caption = "Открыть таблицу &клиентов";
}
else
{
DataModule1->Table1->Open();
Button1->Caption= "Закрыть таблицу &клиентов";
};
}
//-----------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (DataModule1->Query1->Active)
{
DataModule1->Query1->Active = false;
Button2->Caption = "Открыть таблицу &заказов";}
else{
DataModule1->Query1->Active = true;
Button2->Caption = "Закрыть таблицу &заказов";
}
}
//-----------------------------------------------------
void __fastcall TForm1::RadioButton1Click(TObject *Sender)
{
DBGrid1->DataSource = DataModule1->DataSource1;
}
//-----------------------------------------------------
void __fastcall TForm1::RadioButton2Click(TObject *Sender)
{
DBGrid1->DataSource = DataModule1->DataSource2;
}
//-----------------------------------------------------
void __fastcall TForm1::RadioButton3Click(TObject *Sender)
{
DBGrid1->DataSource = DataModule1->DataSource3;
}
//----------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if (DataModule1->Table1->Active)
{
DataModule1->Table1->SetRangeStart();
DataModule1->Table1->Fields[0]->AsString = Edit1->Text;
DataModule1->Table1->SetRangeEnd();
DataModule1->Table1->Fields[0]->AsString = Edit2->Text;
DataModule1->Table1->ApplyRange();
}
}
//----------------------------------------------------
Сам словарь данных доступен для просмотра на странице Dictionary. В нем в виде раскрывающегося списка содержатся сведения о базах данных и расширенных атрибутах полей таблиц (раздел Attribute Sets), в число которых входят, например, максимальное и минимальное значение для данного поля, значение по умолчанию, тип и класс контрольного элемента, метка при отображении на форме, маска редактирования и другие атрибуты, не содержащиеся непосредственно в таблицах, но характеризующие модель данных.
Отметим, что пользователь может создавать свои словари данных (пункт меню Dictionary/New). По умолчанию словари данных создаются в виде таблиц формата Paradox, но не возбраняется хранить их в других форматах или на серверах баз данных (это имеет смысл при работе над крупными проектами).
Координаты автора: Учебный центр Interface Ltd., тел. (095)135-55-00, 135-25-19,
e-mail: mail@interface.ru