Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DDD.doc
Скачиваний:
9
Добавлен:
14.11.2019
Размер:
25.86 Mб
Скачать

8. Работа с запросами sql

Компонент ТТаblе удобен при работе с локальными данными отдельных таблиц. Однако часто требуется получить информацию из нескольких таблиц или с сервера БД, просчитать среднее значение какого-либо поля и т.п. Для этих целей используется язык структурированных запросов (SQI.....).

Для работы с запросами на SQL используется компонент TQuery. Компонент TQuery несет ту же функциональную нагрузку, что и ТТаЫе. Он поддерживает все основные свойства и методы работы с таблицами.

Компонент TQuery имеет специальное свойство для хранения SQL-запроса -свойство SQL.

Прежде чем запустить запрос на выполнение, необходимо настроить TQuery на нужный псевдоним (свойство DatabaseName).

8.1. Основные команды SQL

Команда SELECT

Эта команда создает набор данных (НД) основанный на одной или нескольких исходных таблицах. Общий вид команды:

SELECT <список полей> FROM <список таблиц>

[WHERE <список условий> ]

[GROUP BY <список полей для группировки>]

[ORDER BY <список полей сортировки> [Desc]]

[HAVING <список условий на группировку>]

<список полей> - поля, которые будут доступны в НД;

<список таблиц> - таблицы которым принадлежат поля;

<список условий> - условия которым должен удовлетворять НД. Если используется несколько таблиц, то сюда вводят условия связи таблиц;

Group By - применяется совместно с функциями агрегирования (sum, Max, Min, Average, Count);

Order By - Сортирует данные в наборе данных

Having - используется совместно с Group By как дополнительное условие на результаты группировки

.

  • Пример. Простой SQL-запрос

1. Создайте новое приложение;

2. Поместите на форму компоненты TQuery, TDataSource, TDBGrid;

3. Настройте свойства Query!:

• DatabaseName - DBDEMOS

• SQL - Select * From animals

4. Измените свойство DataSet элемента DataSourcel на Queryl;

5. Свяжите DBGridi с элементом DataSourcel (свойство DataSource);

6. Установите свойство Active элемента Query1.

Visual query builder (vqb)

Visual Query Builder - это специальная среда создания SQL-запросов типа Select.

Для вызова VQB щелкните правой кнопкой мыши на компоненте TQuery. Из контекстного меню выберите команду Query Builder.

Появиться диалог со списком доступных таблиц (зависит от псевдонима). Необходимо выбрать нужные таблицы и нажать кнопку Add. После выбора всех таблиц закройте диалог.

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

Затем свяжите таблицы между собой (если их несколько) по полю связи. Для этого выберите нужное поле в одной таблице и 'перетащите' его па нужное поле в другой таблице. Между ними образуется линия - связь.

Рассмотрим строки нижней части VQB:

• Option - определяет способ обработки данного поля. Для просмотра вариантов щелкните на нем правой кнопкой мыши:

• Show - вывести поля в НД

• Average - среднее значение поля

• Maximum - максимальное значение поля

• Minimum - минимальное значение поля

• Sum - сумма значений поля

• Group - количество записей

• Sort - определяет способ сортировки

• Group Condition - условие группировки данных

• Criteria - общее условие на НД

  • Пример 1. Запрос с двумя таблицами.

Выведем информацию о заказах клиентов. Т.е. выведем:

название

Имя поля

таблица

Название фирмы

Company

Customer

Адрес фирмы

Addr1

Customer

Страна

Country

Customer

Номер заказа

OrderNo

Orders

Дата заказа

SaleDate

Orders

Сумма заказа

ItemsTotal

Orders

Эта информация находится в таблицах таблицами осуществляется через поле CustNo.

  1. Щелкните правой кнопкой на компоненте Query1 и выберите команду Query Builder.

  2. Выберите таблицы Customer и Orders. И закройте диалог Add Table.

  3. Перетащите поле CustNo из Customer на поле CustNo из Orders.

  4. Перетащите в таблицу запроса (нижняя часть VQB) следующие поля: Company, Addri, Country, OrderNo, SaleDate, ItemsTotal (Рис. 8.1.).

  5. Нажмите кнопку Run для просмотра результата.

  6. Сохраните запрос в элементе Query1. Т.е. Щелкните на кнопке с галочкой.

  • Пример 2. Запрос с двумя таблицами и условием.

Выведем клиентов живущих в Америке. Т.е. Country= 'US'

1. В таблице запроса найдите поле Country.

2. В строку Criteria поля Country введите в кавычках 'US'

3 . Запустите запрос (Рис. 8.2).

  • Пример 3. Запрос с двумя таблицами и сортировкой.

Отсортируем результат предыдущего примера по названиям фирм

1. В столбце Company в строке Sort установите Ascending (Рис. 8.3).

  • Пример 4. Запрос с двумя таблицами, сортировкой и группировкой.

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

Для этого мы должны использовать функцию агрегирования SUM по полю itemsTotal, а остальные поля должны быть сгруппированы.

1. Перейдите в столбец Company и в строке Options установите Group

2. То же самое проделайте со столбцами Addr1 и Country

3. Для столбца ItemsTotal установите Options в SUM

4. Удалите столбцы OrderNo и SaleDate. Для этого выделите столбец и

н ажмите клавише delete. (Рис. 8.4.)

  • Пример 5. Запрос с двумя таблицами, сортировкой, группировкой и условием на группу.

Выведем общую сумму заказов за период с 1.01.88 по 31.05.88.

  1. Добавьте столбец SaleDate

  2. Для этого столбца в строке Options отключите настройку Show. Для этого щелкните правой кнопкой мыши и выберите пункт Show.

  3. В строке Criteria введите between '1.01.88' and '31.05.88'

  4. Запустите запрос (Рис. 8.5).

  • Пример. Создание псевдонима.

Создадим псевдоним Kurs

  1. Запустите программу BDE Administrator

  2. Появится форма, состоящая из двух частей: слева - список псевдонимов, справа - их содержание

  3. В левой части формы щелкните правой кнопкой мыши и выберите команду New. Появится окно с типами псевдонимов.

  4. Выберите пункт Standart

  5. В появившейся строке введите kurs

  6. В правой части окна в строке Path нажмите кнопку и укажите нужный каталог C:\Delphi3\Kurs

  7. Закройте программу и на вопрос ответьте Yes.

  • Пример. Создание таблицы.

Создадим таблицу Customer и Orders в области действия нового псевдонима.

  1. В меню Delphi откройте Tools -> Database DeskTop

  2. File -» New -> Table

  3. В списке выберите Paradox 7

  4. В окне редактора кода введите поля (см. Рис. 8.6). Для выбора типа поля в колонке Туре нажмите клавишу <пробел>

  5. После ввода всех полей в списке Table Properties (в правом верхнем углу) выберите Table Language.

  6. Нажмите кнопку Modify и в списке выберите 'Paradox Cyrr 866'

  7. Нажмите кнопку Save as для сохранения новой таблицы.

  8. В диалоге выберите в списке Alias псевдоним Kurs и сохраните под именем Customer

  9. То же самое проделайте с таблицей Orders (Рис. 8.7)

  10. З акройте DBD.

Команда Insert

Добавляет запись в НД.

INSERT INTO <имя таблицы> [(<список полей таблицы>)]

VALUES (<список значений>)

Команда Delete

DELETE FROM <имя таблицы> WHERE <условия>

Команда Update

UPDATE <имя таблицы> SET <выражение> WHERE <условие>

<выражение> это <имя поля>=<новое значение>

Например. Изменилось название страны Country с 'US' на 'USA':

Update Customer SET Country = 'USA' WHERE Country='US'

8.2. Программный ввод и выполнение запросов SQL

Изменение запроса в программе

Текст запроса хранится в свойстве SQL. Он представляет собой объект класса TString. Точно такой же, как и свойство Lines в ТМето. Поэтому, для этого свойства применимы те же методы что и для Lines.

Для добавления нового запроса применяется метод свойства SQL ADD:

Query1.SQL.Add('Select * from Customer');

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

Query1. SQL.CIear;

Выполнение запроса

Запрос на SELECT выполняется с помощью метода Open. Т.к. он возвращает набор данных:

Query1Open

Если вы меняете текст запроса, то необходимо закрыть старый набор данных:

Query1Close;

Для остальных команд SQL (Insert, Delete, Update) используется метод ExecSQL. Т.к. они не возвращают набор данных:

Query. ExecSQ;

  • Пример. Применение динамического создания и выполнения запроса

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

1. Создайте новое приложение;

2. Разместите на форме элементы в соответствии с рис. 8.8.

3. Переименуйте элементы:

• Button1 - btnSelect

• Button2 - btnInsert

• Button3 - btnUpdate

• Button4 - btnDelete

• RadioGroup1 - rgpAlias

• DBGrid - grdResult

4. Измените подписи элементов в соответствии с рис. 8.9.

5. Установите свойство Itemlndex элемента rgpAlias в 0;

6. Установите свойство DataSet элемента DataSourcel в Query1;

7. Свойство DataSource элемента grdResult в DataSourcel;

8. Введите следующий код в обработчик события OnClick элемента btnSelect:

with Queryl do

begin

Close;

DatabaseName:=rgpAlias.Items[rgpAlias.ItemIndex];

SQL.CIear;

if (Sender as TButton).Name='btnSelect' then

begin

SQL. Add(Memol.Text);

Open;

End

else

begin

SQL.Add(Memo2.Text);

ExecSQL;

end;

end;

С помощью оператора with мы упростили написание кода для доступа к свойствам элемента Queryl.

Мы можем работать с таблицами двух псевдонимов: DBDEMOS и Kurs. Чтобы правильно настроить свойство DatabaseName элемента Query1, мы использовали текущее значение (Itemlndex) свойства Items элемента rgpAlias.

Для получения результатов выполнения команды Select необходимо использовать метод Query1 Open. Для остальных команд Query1.ExecSQL.

Данная процедура обработки общая для всех кнопок. Поэтому мы должны определить, какая именно кнопка возбудила данное событие. Для этого мы преобразуем параметр к объекту класса TButton и анализируем свойство Name.

  1. Выделите кнопки Button2, Button3, Button4 и установите для них в качестве обработчика события OnClick процедуру btnSelectClick.

  2. Откомпилируйте и запустите приложение.

8.3. Динамический запрос

Динамическим (параметрическим) называется запрос, в SQL-операторе которого в процессе выполнения приложения могут изменяться отдельные его составляющие. В этом случае изменяемая часть оператора оформляется как параметр.

Например, Пусть в процессе выполнения может быть выдан запрос «Выдать все сведения о клиентах из таблицы Customer, проживающих в Америке (US)».

Select * from Customer where Country='US'

и запрос «Выдать сведения о клиентах из таблицы Customer, проживающих на Багамах (Bahamas)»

Select * from Customer Country='Bahamas'

а также аналогичный запрос по клиентам из других стран. Конечно, можно программно заменять запрос. Но гораздо разумнее применить SQL-запрос, в котором изменяющиеся части заменены параметрами:

Select * from Customer Country= :Country

Под параметром понимается имя, предваряемое двоеточием ':'. Имена параметров произвольны и могут не совпадать со значениями полей таблицы, которым они обычно ставятся в соответствие.

После создания текста запроса Delphi изменяет свойство Params компонента TQuery. Это свойство содержит массив объектов TParam. Именно через эти объекты вы настраиваете запрос в процессе выполнения приложения.

Откройте это свойство. В списке Parameter Name перечислены все параметры в алфавитном порядке. Для каждого параметра необходимо определить тип данных Data Type и если нужно, стартовое значение в поле Value. Переключатель Null Value позволяет указать в качестве стартового значения NULL.

Компонент TQuery можно сделать активным (установить свойство Active в true) на стадии разработки приложения только в том случае, если каждому из параметров присвоено стартовое значение.

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

Обратиться к конкретному параметру можно:

  1. указав индекс параметра в свойстве Params компонента TQuery, например, ParamsfO]. Порядок следования параметров аналогичен показываемому в окне редактора параметров.

  2. через метод компонента TQuery

ParamByName(Volume: string): TParam;

где Value определяет имя параметра.

Для установки значения конкретного параметра используется одно из свойств компонента TParam AsNNN, где NNN тип данных параметра (AsString, Aslnleger, AsBoolean) или более общее свойство Value: Variant.

Например

Query1.Params[Q].AsDate := StrToDate(Editi.Text);

….

Query1.ParamByName('SaleDate').Value := Edit1.Text;

Значение NULL показывает отсутствие текущего значения в поле или присутствие неопределенного значения. Чтобы указать значение NULL для какого-либо параметра следует выполнить метод Clear компонента TParam

Query1.Params[0].Clear;

  • Пример. Создание динамического запроса.

Из таблицы Customer отберем следующую информацию: Компания (Company), страна (Country), Адрес (Addri). На форме мы размещаем закладки (TabControl). Каждая закладка соответствует букве латинского алфавита. При выборе какой-либо закладки выводится информация о фирмах, названия которых начинаться на данную букву (например на 'А').

Текст запроса выглядит следующим образом:

SELECT Company, Country, Addri FROM Customer

WHERE Company LIKE 'A%'

Специальная команда LIKE применяется для сравнения значений полей с шаблоном. Также как и при поиске файла, для задания шаблона используются два символа:

% - любые символы любое количество (аналог '*' при поиске файла)

_ - любой один символ (аналог '?' ).

1. Создайте новый проект.

2. Поместите на форму элементы в соответствии с рис.8.10 в следующем порядке: TQuery, TDataSource, TTabControl, TDBGrid.

3. Для элемента Queryl измените следующие свойства:

• DatabaseName - DBDemos;

• SQL - SELECT Company, Customer, Addr1

FROM Customer

WHERE Company LIKE :Name

4. В свойстве Params элемента Query1 установите:

• Data type (тип данных параметра) - string

• Value (значение по умолчанию) - А%

5. Установите свойство Active элемента Queryl в True.

6. Свяжите элемент DataSourcel с Query1:

DataSourcelDataSet = Queryl

7. Установите свойство DataSource элемента DBGridi в DataSource1.

8. Для элемента TabControl1 в свойстве Tabs введите в каждой строке по прописной букве латинского алфавита от А до Z (Рис. 8.11).

9. Установите свойство TabWidth равным 40, а свойство MultiLine в True.

10. Для события OnChange элемента TabControl1 введите код:

query1.Сlose;

queryl.Params[0].Value:=TabControll .Tabs[TabControll .TabTndex]+'%';

queryl .Open;

Для определения нужного символа мы обратились к массиву заголовков страниц (свойство Tabs) и выбрали текущую страницу (свойство Tablndex)

11. Откомпилируйте и запустите программу.

8.4. Использование контейнера Data Module

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

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

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

Компонент типа TDataModule представляет собой контейнер, в который помещаются компоненты TTable, TQuery, TDataSource и т.д. (страница «Data Access»). Создать экземпляр TDataModule можно, выбрав в среде Delphi пункт меню File -> New Data Module.

Компонент TDataModule похож на форму (TForm) в том отношении, что он служит контейнером дня иных компонентов. Однако в отличие от TForm, в TDataModule можно помещать только невизуальные компоненты для работы с базами данных. Связь компонентов TDataSource, TTable и TQuery, расположенных в TDataModule, производится так же, как если бы они были расположены в одной форме.

TDataModule нужно сохранить под каким-либо именем и добавить имя модуля Unit в, в котором описан TDataModule, в текст модулей Unit всех иных форм приложения в раздел uses, которые будут использовать НД и TDataSource, расположенные в этом TDataModule. Это производится в главном меню среды Delphi, в элементе меню File -» Use Unit. .

В дальнейшем визуальные компоненты, работающие с данными НД, должны в своем свойстве DataSource содержать имя соответствующего компонента TDataSource из TDataModule. При этом имя является составным: сначала идет имя компонента TDataModule и затем через точку - имя компонента TDataSource, например, DataModule1 .DataSource1.

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

Создадим форму просмотра таблицы Customer с использованием модуля данных.

1. Создайте новый проект и разместите на форме компонент TDBGrid.

2. Создайте новый модуль данных: File -> New Data Module.

3. Переименуйте (Name) DataModulei в DM.

4. Разместите в модуле данных компоненты ТТаblе и TDataSource.

5. Настройте свойства TTableТ.

• DatabaseName - DBDemos

• TableName - Customer

• Active - True

6. Настройте свойства DataSourcel:

DataSet -Tablet

7. Перейдите в основную форму и обеспечьте доступ к элементам модуля данных из формы. Для этого добавьте имя модуля в список Uses основной формы (File -> Use Unit и в списке выберите имя DM).

8. Настройте свойство DataSource элемента DBGrid1 в DM.DataSource1.

8.5. Связь TQuery с другим набором данных (НД)

Значение параметров динамического запроса можно получать напрямую из другого набора данных. Для этого используется свойство DataSource указывающее на этот набор данных.

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

Пример-упражнение. Связь динамического запроса с другим набором данных.

  1. Создайте новое приложение (рис. 8.12).

  2. Переименуйте элементы формы:

  • Query1 - qvrCustomer

  • DataSource 1 - srcCustomer

  • DBGrid1 - GridCustomer

  • Query2 - qvrOrders

  • DataSource2 - srcOrders

  • DBGrid2 - GridOrders

  • Query3 - qvrltems

  • DataSource3 - srcltems

  • DBGrid3 - Gridltems

  1. Выделите все три элемента TQuery и установите свойство DatabaseName в DBDernos.

  2. Самостоятельно введите SQL-запрос для qvrCustomer на выборку данных из полей CustNo, Company, Addri и Country таблицы Customer.

  3. Свяжите с ним элемент srcCustomer и GridCustomer.

  4. Активизируйте запрос qvrCustomer.

  5. Самостоятельно введите динамический запрос для элемента qvrOrders, который выводит следующие данные для конкретного клиента под HowerjoM CustNo, т.е. имя параметра CustNo:

Наименование

поле

таблица

Код заказа

OrderNo

Orders

Дата заказа

SaleDate

Orders

Общая сумма

ItemsTotal

Orders

Для параметра CustNo установите тип Integer.

  1. Установите связь srcOrders и GridOrders с qvrOrders.

  2. Установите свойство DataSource элемента qvrOrders в srcCustomer.

  3. Активизируйте запрос srcOrders.

  4. Введите динамический запрос для qvrltems, который отбирают данные для конкретной накладной под номером OrderNo:

Наименование

поле

таблица

Имя товара

Description

Parts

Количество

Qty

Items

Цена

Cost

Parts

Сумма

(Qty*Cost)

Для параметра OrderNo установите тип Integer.

  1. Установите свойство DataSource элемента qvrltems в srcOrders.

  2. Свяжите srcltems и Gridltems с qvrltems.

  3. Активизируйте qvrltems.

  4. Откомпилируйте и запустите приложение.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]