Параметрические запросы и свойство DataSource компонента TQuery

Для передачи параметров может служить свойство DataSource компонента TQuery. Фактически свойство DataSource указывает, где автоматически следует искать конкретные значения для параметров запроса.

Для того чтобы задать источник данных для параметров запроса раскройте список его свойства DataSource и выберите требуемый источник данных. В рассматриваемом примере для иллюстрации такого выбора можно задать DataSource1 (рисунок 4.12), так как он связан с набором tbNakls.

Рисунок 4.12 – Окно инспектора объектов для запроса quNakls

Если это свойство определено, явные присваивания значений параметрам не производятся, то есть не используются операторы присваивания типа

quNakls.Params[0].AsDate := '02.03.2000';

quNakls.ParamByName('DATE').Value := '02.03.2000';

В этом случае в НД tbNakls, связанном со свойством DataSource1, отыскиваются поля, имена которых совпадают с именами параметров запроса. Если такие поля есть, их текущие значения берутся в качестве значений параметров запроса, в противном случае возбуждается исключительная ситуация.

На практике это выглядит следующим образом. Пусть с источником данных DataSource1 связана таблица TTable или компонент TQuery, которые содержат поля (поле), имена которых совпадают с именами параметров запроса. Тогда в качестве значения параметра (параметров) запроса будут выбраны значения соответствующих полей выделенной строки DataSource1.

Если теперь компонент DBGrid1 связан с источником данных DataSource1, то в качестве выделенной строки DataSource1 будет выступать выделенная строка DBGrid1.

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

4.3.6 Связь главный-детальный с компонентом TQuery в качестве детального набора данных

В предыдущем подразделе показано как с помощью компонента TDataSource1 и связанного с ним компонента TDBGrid1 можно реализовать связь главный-детальный, если детальный НД создан с помощью компонента TQuery.

Рассмотрим следующий пример, взятый из реальной системы. Пусть имеет место форма, отражающая связь главный-детальный между двумя запросами TQuery - quNagrPrepGlb и quNagrPrepDtl.

а)

б)

в)

Рисунок 4.13 – Форма, отражающая связь главный-детальный между запросами quNagrPrepGlb и quNagrPrepDtl

Источник данных DataSource1 связан с, формируемым запросом quNagrPrepGlb и содержащим, в частности, поле FIO (рисунок 4.13, а).

Запрос quNagrPrepDtl связан с источником данных DataSource1, который содержит, в частности поле FIO (рисунок 4.13, б).

Текст запроса quNagrPrepGlb, формирующий НД связанный с источником данных DataSource1, достаточно громоздок, но нас интересует в нем поле FIO.

SELECT FIO и т.д.

FROM KAFEDRA, NAGRPR

WHERE KAFEDRA.CodPrep = NAGRPR.NPCodPrep

Текст запроса quNagrPrepDtl также достаточно громоздок, но нас интересует в нем параметр :FIO, который совпадает с именем поля FIO в НД, связанном с DataSource1.

SELECT DIS.DIS, FAK.FAK и т.д.

FROM NAGRPR, KAFEDRA

WHERE NAGRPR.NPCODPREP = KAFEDRA.CODPREP AND

KAFEDRA.FIO = :FIO

В качестве значения параметра запроса :FIO будут выбраны значения соответствующего поля FIO выделенной строки DataSource1. Компонент DBGrid1 связан с источником данных DataSource1, поэтому в качестве выделенной строки DataSource1 выступает выделенная строка DBGrid1 (рисунок 4.13, в).