Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OAP_Vopros_8_Rabota_s_komponentom_TQuery.doc
Скачиваний:
6
Добавлен:
30.04.2015
Размер:
175.62 Кб
Скачать

Использование tQuery для получения агрегированных значений

Часто нужно подсчитать некоторые агрегированные значения данных (минимум, максимум, среднее, счетчик повторений). В дальнейшем полученные значения могут входить в какие-либо условные операторы или операторы выбора приложения.

I; Пусть, например, необходимо помещать уникальное значение в поле \, N^RASH (номер записи расхода со склада) в габлицу'КАЗ-НОрт SQL-;; операторы INSERT, UPDATE не работают с автоинкрементными полями

(локальные СУБД). Поэтому при занесении новой записи в таблицу RASHOD ,;.' нужно определить уникальное значение поля JSL.RASH, для чего можно сделать

запрос к таблице RASHOD: .

WITH WorkQuery do begin .-1 .- "•' " '", ;, = ^_ r..s_

Close; ,'..' -. •'; "- — -*"•". . * - „,. .••'„". ; Clear; " " '; - SQL. Add ( % SELECT COUNT (*>, MAX fN__RASH} й-S MM; .' - SQL.Add!"FROM RASHOD'>; Open; '

E>^;//wi-h ••

Пусть добавление новой записи реализуется в компоненте InsertQuery следующим динамическим оператором: -::

'^-UES [:N__PASK, iDAT^RASH, : KOLVC, : TOVAR, :?OKUP)

Тогда к параметр :N__RASH слезет поместить значение поля М набора , ^акмых компоиеша WorkQuery:

"^•**|1ы*; ———.. —,..„.—————-""•"•"• " ' * '^--^_"™Щ

^V -^J~- 1 П 3 £з I." cOl> ё =Г V cio O^G'1 П J4

• : PararnByName { 'N_RASH' ; -Aslntsger := .. ,X.V'

WorkQuery. FieldByNa-ne ( \M' ) ,йз;пг_ддег t- i; ;. :|

£xecSQL; "':H:,-.;.'t.

ПОЯСНЕНИЕ. После выполнения запроса а компоненте WorkQuerv '"• ' -выдается резуль'илруюший ИД. содержащий одну строку. Указатель ' ^ тех'ушей записи во вновь открытом НД всегда устанавливается на':"'-¥ первую запись. Псотому. даже с&ш таблица RASHOD пуста, в поле М '"'^ будет значение NULL, преобразуемое затем свойством Asfniegcr в 0. 'f Набор данных в компоненте Work Query мог бы не содержать ни одно$Г-

• строки (если в ТБД RASHOD не было ни одной строки) тогда и только тогдаf'.', если бы подсчет максимума производился оператором f

S3LFCT MAX(N_RASH) AS M " ' -' j|

FROM RASHOD • " _ /jf-

Однако, применяя вместо эгого оператор ' . . . !=.,

..; ." SELECT COUNT(*>, MAX(N__RASH) AS К '- . , . ,,м!|!|

-.. ' FROM RASHOD ' , ,;Uf|

мы всегда получаем хотя бы одну запись в результирующем НД; поскольку;!;.; COUNT{*j всегда возвратит значение, отличное от NULL. - ф.:

9.11. Использование компонента TQuery для Ц локальных и удаленных БД • ' '^

Использование компонента TQuery происходит аналогично для случая |=;{ выполнения запросов к таблицам локальных СУБД (Paradox, dBase и т.д.) и ЛЛ* |я| случая выполнений запросов к удаленным СУБД f InterBase, Oracle, Informix", j[ j Sybase, MS SQL Server). Имеются, правда, ограничения для случая запросов X д;^ таблицам локальных СУБД. Эти ограничения состоят в усеченных возможностях ^ использования синтаксиса SQL-операторов. .^ k

Характеристики работы компонента TQuer> для случая локальных й;^! удаленных СУБД позволяют рекомендовать: ^|| не использовать компонент TQuery для выполнения простых запросов >:^| к локальным таблицам там. гле вполне можно обойтись компонентом ^.„^ ТТаЫе. поскольк} TQuery работает медленнее - он всегда создав- д1: ; промежуточную" таблицу -ля формирования возврашаемого набора i;,^ ланны.х: Vl-;

• стараться как можно чапге использовать ко\шонгнт TQuery лля доступа .^-^ к удаленным таблицам. ,-й|Явная предпочтит-ельност!, использования комионеш a TQuery при доступе к

..--генным 1 абли цам определяется способом занесения записей в результирующий

uV Компонент ТТаЬЗе при своем открытии считывает асе -записи из удаленной

fVinui-i- если на 'записи в ТТаЫе наложена филыраиия (например, методом

"^„'кап^е}, она выполняется уже в клиен гском приложении, что уже не оптимально.

Применяемый Д1я ашиюгичных целей компонент TQuery считывает нужное число

УписеН (например, достаточное количество -записей для визуализации в

Ш0[(ентс TDBGrid), а оставшиеся записи считывает по необходимости.

Временные задержки при этом особенно актуальны для таблиц, состоящих so

Йсльикм о числа записей.

" Одиночные изменения в удаленной таблице, вносимые из ТТаЫе при помощи методов Ром, Delete, если они совершаются в рамках отдельной транзакции, также способны существенно заменить работу с БД. Компоненты TQuery; посылающие серверу БД запросы на удаление, добавление, корректировку записей, как правил'о. действуют над группами записей в рамках одной траизакпии. Кроме того, даже по своей идеологии компоненты TQuery много больше соответствуют архитектуре ''клиент-сервер" иг идеологии серверных БД, поскольку одним из основных положений при работе с дзешыми в SQL, является оперирование множествами записей. TTabic рассчитан на работу с одиночными записями и по своей сущности больше отвечает идеологии локальных (настольных, персональных) СУБД, исповедующих навигационный подход.

ЗАМЕЧАНИЕ. В примерах, приводимых к излагаемому материалу, в частности, по созданию приложений а архитектуре "клиент-сервер", встречается доступ к удаленным таблицам при помощи компонента ТТаЫе. но в основном из-за того, что реально "удаленная" БД работает пол управлением локальной версии SQL-сервера Borland InterBase, поставляемого вместе с Delphi Client/Server Suite, а также из-за того, что объем данных в учебных таблицах не превышает 10 записей.

Исследовать процесс соединения с сервером и реальные процессы доступа к БД, которые порождают те или иные SQL-операторы, можно, запустив приложение на выполнение под средой Delphi и вызвав SQL Moni)or (пункт главного меню Database \ SOL .Monitor или запустив его как отдельное приложение). В качестве примера приведем окно SOL Monitor, показывающее (рис. 9,11 и 9.12) операции над БД из приложения ятя выполнения оператора SELECT, реализующего внутреннее соединение таблиц RASHOD (8 записей) HTOVARY(3 записи):

-^L»'JT R. DAT RA3Hr R, TCVAP, 3 .KGLVO, T. ZFJMA " -

pOM ?,ASHOC R, TCVARY Т

AbER:; R.TCVAR - T.TQVAR •;-,:/ -

Дпэ некоторого убыстрения доступа к НД, который должен просматриваться °слеловгпельно только в направлении от начала до конш. можно установить в воистзо l-'niDirecuonai компснеша TQuery значение False:

property LniDirectional: Boolean;

BDr?T° nojBO;iHT отключить для НД механизм двунаправленных курсоров в Ь. ч1! о лля больших объемов записей способно привести к экономии времени ^Pecvpcoii.