Delphi 3 и создание приложений баз данных

       

Установка значений параметров динамического запроса во время выполнения


Самым распространенным способом указания текущих значений параметров является их ввод пользователем в поля ввода (компоненты 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 := ...



Содержание раздела