Помощь в написании студенческих работ
Антистрессовый сервис

Работа с компонентом TQuery

РефератПомощь в написанииУзнать стоимостьмоей работы

Где — список, разделенный запятыми, в котором перечисляются поля, значения которых должны быть получены в результате выборки (вместо списка может указываться звездочка, что означает — все поля таблицы); — список, разделенный запятыми, в котором перечисляются таблицы, участвующие в выборке данных (таблицам могут назначаться псевдонимы); — то же значение, что и в предыдущих командах; — список… Читать ещё >

Работа с компонентом TQuery (реферат, курсовая, диплом, контрольная)

Общие сведения Компонент TQuery предназначен для:

работы с НД, источником данных для которого являются записи как одной, так и нескольких таблиц БД;

выполнения команд к БД, не возвращающих множества записей (вставка, удаление и изменение записей).

Основные отличия компонента TQuery, возвращающего множество записей, от компонента TTable:

НД, возвращаемый TQuery, может состоять из записей нескольких таблиц, объединенных запросом;

В общем случае НД, возвращаемый TQuery, даже если источником НД служит одна таблица БД, предполагает обращение к подмножеству записей и столбцов, в то время, как TTable, ориентирован на работу со всеми записями и полями и для того, чтобы работать с подмножеством необходимо предпринимать специальные меры.

В качестве команд формирования запросов для TQuery служат операторы языка SQL. Ниже мы обсудим основные его команды.

Соединение компонента TQuery с БД Для того, чтобы запросы TQuery корректно выполнялись, необходимо указать в некоторых его свойствах параметры соединения с целевой БД.

Свойство property DataBaseName: TFileName позволяет указать, с какой БД будет работать TQuery.

Как правило, в этом свойстве прописывается псевдоним целевой БД.

Как и компонент TTable, связь с визуальными компонентами осуществляется через отдельный компонент TDataSource.

Методы активизации TQuery.

Если TQuery возвращает множество записей, например при использовании оператора select языка SQL, то такой компонент активизируется установкой значения True в свойстве Active.

В случае использования операторов insert, update, delete и т. д. записи не возвращаются. Для таких случаев компонент TQuery активизируется вызовом метода procedure ExecSQL;.

Деактивизация компонента производится установкой значения False свойству Active.

Основы языка SQL.

Добавление записи. Для добавления записи в таблицу БД служит команда:

insert into () values ().

где — имя любой таблицы БД; - список полей таблицы, разделенный запятыми; - список значений для полей, перечисленных после имени таблицы, также разделенный запятыми.

Пример добавления записи в таблицу Clients:

insert into Clients (Name, Address) values ('ТОО IT Development', 'площадь Республики, 13, офис 517').

Значение для поля Id не назначается, т. к. это поле является автоинкрементным и СУБД Paradox автоматически присвоит значение данному полю.

Удаление записей. Для удаления записей из таблицы БД служит команда:

delete from where.

где — имя любой таблицы БД; - логические выражения, соединенные логическими операциями — and, or и not. Если условия удаления не заданы будут удалены все записи таблицы.

Пример удаления записей из таблицы Directions, у которых нулевая цена за минуту разговора:

delete from Directions where Price=0.

Это удаление выполнится только, если в таблице Traffic нет разговоров с удаляемыми кодами направлений. Иначе будет возбуждено исключение. Тогда, если все-таки необходимо удаление, сначала надо удалить соответствующие записи в Traffic. А потом удалять в Directions.

Изменение записей. Для изменения значений полей записей таблицы БД служит команда:

update set where.

где — имя любой таблицы БД; - логические выражения, соединенные логическими операциями — and, or и not. Если условия удаления не заданы будут изменены все записи таблицы; - список, разделенный запятыми, пар =.

Пример изменения записей таблицы Directions, поднимаем цены за междугородние переговоры на 20%:

update Directions set Price=Price*1.2 where Id like '810%'.

В данной команде условие означает, что измененными будут те записи, у которых код направления начинается с подстроки «810».

Выборка всех записей таблицы. Упорядочивание. В общем случае команда выборки данных выглядит следующим образом:

select from where.

group by order by.

где — список, разделенный запятыми, в котором перечисляются поля, значения которых должны быть получены в результате выборки (вместо списка может указываться звездочка, что означает — все поля таблицы); - список, разделенный запятыми, в котором перечисляются таблицы, участвующие в выборке данных (таблицам могут назначаться псевдонимы); - то же значение, что и в предыдущих командах; - список, разделенный запятыми, в котором перечисляются поля, участвующие в группировке значений (применяется при вычислении агрегированных данных); - список, разделенный запятыми, в котором перечисляются поля, участвующие в сортировке результирующего набора записей.

В качестве примера выберем все записи из таблицы Traffic, отсортированные по коду направления и дате звонка:

select * from Traffic order by DirectionId, CallDateTime.

Ограничение выборки. Для ограничения записей в выборки используется where — секция команды запроса.

В качестве примера выберем записи из таблицы Traffic, отсортированные по коду направления и дате звонка, у которых длительность междугороднего разговора больше минуты:

select * from Traffic where (DirectionId not like '810%') and (Duration>60).

order by DirectionId, CallDateTime.

Объединение таблиц. Очень часто требуется при запросе данных выбрать значения из, более чем одной, таблиц, связанных отношениями «один ко многим» или «один к одному». Для этого также используется where — секция команды запроса, в которой указываются условия связи таблиц.

В качестве примера выберем записи из таблицы Traffic, отсортированные по коду направления и дате звонка, у которых длительность междугороднего разговора больше минуты, с указанием наименования позвонившего клиента и наименования направления:

select A. PhoneNum, A. ClientId, B.Name, A. CallDateTime, A. DirectionId, C.Name,.

A.Duration.

from Traffic A, Clients B, Directions C.

where A. ClientId=B.Id and A. DirectionId=C.Id and (A.DirectionId not like '810%') and.

(A.Duration>60).

order by A. DirectionId, A.CallDateTime.

Агрегирование полей. Иногда требуются не детальные данные таблиц, а агрегированные. Например, сумму значений поля всех записей или минимальное/максимальное значение поля. Для таких целей используются, так называемые, групповые функции: Sum, Min, Max, Count и т. д. В качестве аргумента для них указывается имя поля.

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

select DirectionId, Sum (Duration) from Traffic.

group by DirectionId order by 1 desc.

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

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

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

select Count (Duration) from Traffic where DirectionId=:cDirectionId.

где :cDirectionId — параметр, которому можно присваивать любые значения кодов направлений. При это запрос будет выполнять выборку именно по нужному колу направления.

Для присваивания необходимого значения параметру используется метод ParamByName компонента TQuery, который работает подобно методу FieldByName. Для добавления текста запроса в TQuery используется метод Add. Приведем пример. Пусть у нас в приложении определен экземпляр компонента TQuery — qrMain, расположенный в модуле данных dmMain, а код направл…

Код обработчиков событий данной формы подобен коду других дочерних форм и приводиться здесь не будет.

Приведем только код процедуры TrafficRep, в которой выдается на экран диалоговая форма запроса параметров отчета, и выполняется SQL — запрос для выборки данных отчета:

procedure TrafficRep;

begin.

fmTrafficQuery:=TfmTrafficQuery.Create (fmMain, 3);

with dmMain. qrTrafficRep do begin.

//—-запрашиваем параметры отчета.

if fmTrafficQuery. ShowModal=mrCancel then Exit;

//—-выполнение запроса.

SQL.Clear;

if fmTrafficQuery.ckPhones.Checked then begin //—-учет телефонов.

SQL.Add ('select A. PhoneNum Телефон, A. DirectionId Код, B.Name Направление, ');

SQL.Add ('Sum (A.Duration) Длительность, Sum (A.Duration/60.0) Минуты, ');

SQL.Add ('Sum (A.Duration*B.Price/60) Стоимость ');

end.

else begin.

SQL.Add ('select A. DirectionId Код, B.Name Направление, ');

SQL.Add ('Sum (A.Duration) Длительность, Sum (A.Duration/60.0) Минуты, ');

SQL.Add ('Sum (A.Duration*B.Price/60) Стоимость ');

end;

SQL.Add ('from Traffic A, Directions B ');

SQL.Add ('where A. DirectionId=B.Id ');

if fmTrafficQuery.edPhoneNum.Text'' then begin.

SQL.Add ('and A. PhoneNum like: cPhoneMask ');

ParamByName ('cPhoneMask').AsString:=fmTrafficQuery.edPhoneNum.Text;

end;

if fmTrafficQuery.cbDirections.Items.Strings [fmTrafficQuery. CbDirections. ItemIndex]''.

then begin.

SQL.Add ('and B. Id=:cDirectionId ');

ParamByName ('cDirectionId').AsString:=.

Copy (fmTrafficQuery.cbDirections.Items.Strings [fmTrafficQuery.cbDirections. ItemIndex], 1,.

Pos (' - ',.

fmTrafficQuery.cbDirections.Items.Strings [fmTrafficQuery.cbDirections.ItemIndex])-1);

end;

if fmTrafficQuery.edMinDuration.Text'0' then begin.

SQL.Add ('and A. Duration>=:iDurMin ');

ParamByName ('iDurMin').AsInteger:=StrToInt (fmTrafficQuery.edMinDuration.Text);

end;

if fmTrafficQuery.edMaxDuration.Text'0' then begin.

SQL.Add ('and A. Duration<:iDurMax ');

ParamByName ('iDurMax').AsInteger:=StrToInt (fmTrafficQuery.edMaxDuration.Text);

end;

if fmTrafficQuery.ckPhones.Checked then.

SQL.Add ('group by A. PhoneNum, A. DirectionId, B.Name ').

else SQL. Add ('group by A. DirectionId, B.Name ');

SQL.Add ('order by A. DirectionId');

Active:=True;

fmTrafficQuery.Free;

end;

if not Assigned (fmTrafficRep) then fmTrafficRep:=TfmTrafficRep.Create (fmMain);

fmTrafficRep.Show;

end;

В обработчике события OnCreate мы настраиваем внешний вид компонента gdTrafficRep:

procedure TfmTrafficRep. FormCreate (Sender: TObject);

var I: Integer;

begin.

with dmMain. qrTrafficRep do.

//—-конфигурируем столбцы компонента gdTrafficRep.

for I:=0 to FieldCount-1 do begin.

gdTrafficRep.Columns.Add;

gdTrafficRep.Columns.Items [I]. Title. Caption:=Fields.Fields [I]. FieldName;

gdTrafficRep.Columns.Items [I]. Title. Alignment:=taCenter;

gdTrafficRep.Columns.Items [I]. Field:=Fields.Fields [I];

if Fields. Fields [I]. DataType=ftFloat then.

(Fields.Fields [I] as TFloatField).DisplayFormat:='######0.00';

end;

Лабораторная работа Реализовать получение отчета при выборе соответствующего пункта меню с использование параметрического запроса. Отчет отобразить в дочерней MDI — форме.

Показать весь текст
Заполнить форму текущей работой