Установка значений параметров динамического запроса во время выполнения
Самым распространенным способом указания текущих значений параметров является их ввод пользователем в поля ввода (компоненты TEdit и другие) и последующее программное назначение параметров.
Параметры компонента TQuery доступны через его свойство property Params[Index: Word]:TParams;
Это свойство является набором параметров, где каждый параметр определяется индексом в диапазоне (0...ParamCount-l, где ParamCount есть число параметров, которое можно получить с помощью свойства ParamCount компонента TQuery: property ParamCount: Word;
Обратиться к конкретному параметру можно:
1) указав индекс параметра в свойстве Params компонента TQuery, например, Params[0]. Порядок следования параметров аналогичен показываемому в окне редактора параметров (активизирующегося после нажатия кнопки в строке свойства Params инспектора объектов);
2) через метод компонента Tquery function ParamByName(const Value: string): TParam;
где Value определяет имя параметра.
Для установки значения конкретного параметра используется одно из свойств компонента TParam A \NNN (AsString, Aslnteger и т.д.) или более общее свойство property Value: Variant;
Например,
RashodQuery.Params[0].AsDate := StrToDate(Edit1.Text) ;
RashodQuery.ParamByName('DAT_RASH').Value := TmpDat_Rash;
Пример.
Для динамического запроса "выдать записи по расходу товара, определяемого параметром :TOVAR, за дату, определяемую параметром :DAT RASH":SELECT *
FROM RASHOD
WHERE (TOVAR = :TOVAR) AND
(DAT_RASH = :DAT_RASH)
будем вводить текущие значения параметров в компоненты типа TEdit с именами Dat_Rash_Edit и Tovar_Edit. Открытие НД (компонент TQuery с именем RashodQuery) будем производить после нажатия кнопки GoButton (рис. 9.6).
Обработчик события OnClick кнопки GoButton:
procedure TForm1.GoButtonClick(Sender: TObject);
var TmpDat_Rash : TDateTime;
begin
TRY
TmpDat_Rash := StrToDate(Dat_Rash_Edit.Text);
EXCEPT
ShowMessage('Неверная дата');
Dat_Rash_Edit.SetFocus ;
Exit;
END;//try
WITH RashodQuery do begin
Close;
ParamByName('DAT_RASH').Value := TmpDat_Rash;
ParamByName('TOVAR').Value := Tovar_Edit.Text; Open;
END;//with
end;
Вначале производится проверка введенного пользователем значения даты на соответствие формату даты, а затем присвоение значений параметрам и открытие НД.
ЗАМЕЧАНИЕ 1.
По разным причинам попытка открыть НД может быть неуспешной. Поэтому рекомендуется помещать программный код, реализующий открытие НД, внутрь оператора TRY, например:TRY
RashodQuery.Open;
EXCEPT
END;//try
ЗАМЕЧАНИЕ 2.
Параметры более чувствительны к значениям даты и времени, чем поля (компонент TField). Известно, что переменные типа TDateTime хранят дату и время, и, если при преобразовании AsDateTime время или дата отсутствуют, они устанавливаются в значении поля, равными нулю:SomeField.AsDateTime := StrToDate(Edit1.Text);
Подобное преобразование для параметра может стать источником ошибки на этапе выполнения. Поэтому для отдельных значений даты параметрам в инспекторе объектов может быть поставлен в соответствие тип Date или Time, а не только тип DateTime. В первом случае преобразовывать дату следует, используя свойство компонента TParam AsDate, а во втором - используя свойство AsTime компонента TParam:
SomeQuery.ParamByName('DateParam').AsDate := ...
SomeQuery.ParamByName('TimeParam').AsTime := ...