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

Реализация бизнес-правил в компонентах типа "набор данных"


Компоненты типа "набор данных" позволяют реализовывать бизнес-правила в следующих обработчиках событий:

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;



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