Реализация бизнес-правил в компонентах типа "набор данных"
Компоненты типа "набор данных" позволяют реализовывать бизнес-правила в следующих обработчиках событий:
OnNewRecord -
происходит при добавлении новой записи сразу после перехода НД в состояние dslnsert из состояния dsBrowse, но перед выдачей полей новой записи пользователю для ввода значений; используется для присваивания полям значений по умолчанию;BeforeOpen, BeforeClose, BeforeCancel, BeforeEdit, Beforelnsert -
происходят до выполнения соответствующего метода;After Post, AfterDelete, AfterOpen, AfterClose, AfterCancel, AfterEdit, Afterlnsert •
происходят после выполнения соответствующего метода; не возникают, если при выполнении соответствующего метода произошел сбой;OnCalcFields -
наступает при необходимости заполнения вычисляемых полей; применяется для задания алгоритмов расчета значений вычисляемых полей;OnDeleteError -
наступает при ошибке удаления записи;OnUpdateError -
происходит при ошибке редактирования записи;OnPostError -
происходит при возникновения ошибки в ходе выполнения метода Post.Определение алгоритма вычисления значений вычисляемых полей
Обработчик события OnCalcFields применяется для определения алгоритма расчета значения вычисляемых полей. Например,
procedure SomeTableCalcFields(DataSet: TDataSet);
begin
SomeTableVychPole.Value := SomeTablePolel.Value / SomeTablePolel.Value;
end;
Присваивание значений полей по умолчанию
В обработчике события OnNewRecord можно присвоить полям вновь добавляемой записи значения по умолчанию. Эти значения останутся актуальными, если пользователь перед добавлением записи не изменит их. Например,
procedure SomeTableNewRecord(DataSet: TDataSet);
begin
WITH Some do begin
FieldByName('polel').AsInteger := ...;
FieldByName('poleN').AsInteger := ...;
END;//with
end;
Автоматическое присваивание значения полям связи
При добавлении новой записи в дочерний НД может понадобиться присвоить соответствующие значения полям связи с родительской таблицей. В дальнейшем поля связи обычно не предоставляют пользователю для редактирования.
Например,
при добавлении новой записи в таблицу ChildTable устанавливается значение поля связи, равное значению поля 'cod_parent' текущей записи родительской таблицы ParentTable:procedure ChildTableNewRecord(DataSet: TDataSet);
begin
ChildTable.FieldByName('cod_parenf).AsInteger :=
ParentTable.FieldByName('cod_parenf).AsInteger;
end;
Назначение уникального значения столбцу таблицы
Если столбцу таблицы при добавлении новой записи должно присваиваться уникальное значение, можно выполнить отдельный запрос к той же таблице, получить максимальное значение уникального поля и увеличить его на 1.
Например,
при добавлении новой записи в RashodTable выполняется формируемый запрос (компонент WorkQuery, тип TQuery), возвращающий максимальное значение поля 'cod_unique'. Будучи увеличено на 1, оно присваивается полю 'cod_unique' вновь добавляемой записи:procedure RashodTableNewRecord(DataSet: TDataSet);
var Max_cod_unique : Integer;
begin
WITH WorkQuery do begin
SQL.Clear;
SQL.ADD('SELECT MAX(COD_UNIQUE)') ;
SQL.ADD('FROM RASHOD');
Open;
Max_cod_unique := WorkQuery.Fields[0].Aslnteger + 1;
Close;
END;//with
ChildTable.FieldByName('cod_unique').Aslnteger : =Max cod unique;
end;
Назначение полю уникального значения удобнее производить в хранимой процедуре при помощи генератора. Например, если в БД определен генератор
CREATE GENERATOR X;
SET GENERATOR X TO 1;
и определена процедура
CREATE PROCEDURE GET_UNIQUE_VALUE
RETURNS(UV INTEGER) AS
BEGIN
UV = GEN_ID(X,1) ;
END
то в приложении достаточно определить компонент TStoredProc и связать его с хранимой процедурой GET_UNIQUE_VALUE. Затем в приложении, например в обработчике события OnNewRecord, нужно произвести вызов процедуры и присвоить полю уникальное значение, возвращаемое в качестве выходного параметра процедуры:
procedure RashodTableNewRecord(DataSet: TDataSet);
begin
StoredProc1.ExecProc;
ChildTable.FieldByName('cod_unique').Aslnteger := StoredProc1.ParamByName('UV).Aslnteger;
end;
Внесение изменений в связанную таблицу БД
Обычно изменения в связанные таблицы вносятся в обработчиках событий AfterPost, AfterDelete.
Например,
уменьшить значение поля 'Kolvo' таблицы StatTable на значение поля 'Kolvo' из удаленной записи таблицы RashodTable:procedure RashodTableAfterDelete(DataSet: TDataSet);
begin
WITH StatTable do begin
Edit;
FieldByName('Kolvo').Value := FieldByName('Kolvo').Value - DeletedRashodValue;
Post;
END;//with
end;
Внесение признака изменения таблицы в глобальную переменную
Для того чтобы сигнализировать клиентскому приложению об изменении записи в какой-либо таблице, устанавливают в нужное значение какую-либо глобальную переменную приложения. Анализ этой глобальной переменной может впоследствии производиться приложением со значительными временными задержками. Например,
procedure TDM.SomeTableAfterDelete(DataSet: TDataSet);
begin
IzmSomeTable := True;
end;