Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Проектирование БД в Delphi ВТиП.doc
Скачиваний:
53
Добавлен:
17.03.2016
Размер:
3.62 Mб
Скачать
      1. Параметрические запросы

Запросы, которые рассматривались до сих пор, относятся к статическим запросам, т.е. запросам, ограничения в которых заданы явно – в виде соответствующих констант. Пусть, например, нужно создать запрос, который возвращает НД со списком партнеров, поставивших книги 02.03.2000. Такой запрос является статическим.

Рисунок 4.48 – Текст статического запроса в окне редактора кода

Возможным решением по созданию динамического вопроса ывляется использование возможности по склеиванию строк. Действительно запрос является строкой. Поэтому его можно разбить на части и затем склеивать эти части перед отправкой запроса на выполнение. При этом некоторые части перед склеиванием могут быть специально подготовлены быть изменены.

Ниже приводится соответствующий фрагмент текста программы. При этом компонент quNakls расположен на главной форме.

var SQLTxt: string;

TmpTxt: string;

begin

quNakls.Close; // Закрытие запроса

quNakls.SQL.Clear; // Очистка запроса

// Формирование нового текста запроса

TmpTxt := '02.03.2000';

SQLTxt := 'SELECT NaklID, NDate, FName, TName, NSum, NFirm, ' +

'NPayedSum, NRetSum, NCoeff, NretDate ' +

'FROM Nakls, Firms, TypeNakl ' +

'WHERE FirmID = NFirm AND TypeID = NType AND ' +

'NSum > 10000 AND NType IN (0, 6) AND ' +

'NDate = ' + TmpTxt;

//'NDate = ' + Edit1.txt;

quNakls.SQL.Add(SQLTxt); //Занесение нового текста запроса в свойство SQL

quNakls.Open; // Открытие запроса

quNakls.First; //Переход к первой записи результата запроса

end;

Однако такое решение не всегда удобно. Поэтому в современных языках программирования в SQL-запросах применена техника подобная процедурам с параметрами, когда SQL-запрос уточняется с помощью набора параметров.

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

В тексте параметрического запроса компонента TQuery имени параметра предшествует двоеточие ":". Количество параметров не ограничено.

Пусть, например, нужно создать запрос, который во время выполнения программы возвращает НД со списком партнеров, поставивших книги в определенный день, который указывается в параметре DATA. В этом случае вместо статического запроса, показанного выше, следует использовать параметрический запрос. В тексте параметрического запроса имени параметра DATE предшествует двоеточие ":".

Рисунок 4.49 – Текст параметрического запроса в окне редактора кода

Начальное значение параметра DATE может быть задано на этапе разработки программы и изменено в процессе ее выполнения.

Для установки начального значения параметра DATE необходимо вызвать редактор свойства Params запроса (рисунок 4.9)

Рисунок 4.50 – Вызов редактора свойства Params

В результате появится окно редактора, содержащее заготовку для создаваемого параметра DATE. Первый по счету параметр имеет индекс 0.

Рисунок 4.51 – Содержимое редактора свойства Params

Теперь необходимо выполнить редактирование параметра DATE с помощью инспетора объектов дя этого параметра. Для этого необходимо щелкнуть мышью на DATE после чего появятся свойства параметра (рисунок 7.11)

Рисунок 4.52 – Определение начального значения параметраDATE

Имена параметров могут быть произвольными идентификаторами Delphi. Регистр букв в них не имеет значения. Для задания начального значения параметра обычно достаточно в окне инспектора объектов определить его свойство Value, тогда Delphi автоматически укажет его тип данных в свойстве DataType. Если тип указан неверно (например, вместо integer среда Delphi выбрала SmallInt), следует раскрыть список этого свойства и выбрать тип данных явно. Не следует менять имя параметра в свойстве Name на другое, так как в этом случае Delphi не корректирует текст запроса и в нем будет фигурировать прежнее имя.

Для программного задания значения параметра (см. ниже) используется свойство компонента TQuery:

property Params[Index: word]: TParams;

Можно также использовать следующий метод компонента TQuery:

function ParamByName(const Value: string): TParam;

В первом случае конкретный параметр задается индексом Index, причем первый по тексту запроса параметр имеет индекс 0, второй - 1 и т. д. Во втором случае параметр определяется своим именем в тексте запроса (но не именем в свойстве Name инспектора объектов!). В любом случае при обращении к параметру его значение нужно явно приводить к типу данных параметра свойством AsXXXX:

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

quNakls.ParamByName('Date').AsDate := '02.03.2000';

Если к моменту программного изменения параметра запрос был открыт, его нужно закрыть, установить параметр(ы) и открыть вновь. Например:

quNakls.Close; // Закрытие запроса

quNakls.SQL.Clear; // Очистка запроса

// Формирование нового текста запроса

SQLTxt := 'SELECT NaklID, NDate, FName, TName, NSum, NFirm, ' +

'NPayedSum, NRetSum, NCoeff, NretDate ' +

'FROM Nakls, Firms, TypeNakl ' +

'WHERE FirmID = NFirm AND TypeID = NType AND ' +

'NSum > 10000 AND NType IN (0, 6) AND ' +

'NDate = :Date' ;

quNakls.SQL.Add(SQLTxt); //Занесение нового текста запроса в свойство SQL

//Параметры запроса записываются после занесения нового

//запроса

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

//quNakls.ParamByName('Date').AsDate := '02.03.2000';

quNakls.Open; // Открытие запроса

quNakls.First; //Переход к первой записи результата запроса

Примечание. Параметры запроса записываются после занесения нового запроса.

Значение NULLсвидетельствует о том, что полю не присвоено никакого значения ("пустое" поле). Значение0для числовых полей или пустая строка для текстовых полей - это вполне определенные,отличные от NULLзначения. Чтобы присвоить параметру значениеNULLпри прогоне программы, следует выполнить его методClear(на этапе разработки нужно очистить свойствоValueпараметра в окне инспектора объектов). Например:

quNakls.Params[0].Clear;