Возможно ли создать поддельное поле данных в наборе данных delphi?
Я хочу создать поле "поддельные" в DataSet (не ClientDataSet):
- поле не должно храниться в db
- это не вычисленное поле (пользователю разрешено вводить входные данные)
- поле имеет смысл бизнес-логики, поэтому после того, как пользователь обновит его значение, он должен обновить другие поля (с событием OnFieldChange).
Я знаю, что у меня может быть простой элемент управления no-dbaware, захватить его событие OnChange и выполнить там вычисления (или вызвать функцию DataModule, где находится DataSet), но я думаю, что это более чистое, если я могу повторно использовать автоматическую привязку набора данных с элементами управления db-ware и событиями набора данных.
Также таким образом уникальное соединение между формой (презентацией) и DataModule (Model) - это DataSet (меньше связи).
PD: Я использую fibplus, и я думаю, что решение (если оно есть) будет на уровне VCL..
Спасибо!
Ответы
Ответ 1
Вы пытались использовать поле InternalCalc? Элементы управления данными позволяют редактировать значение поля InternalCalc, а значение хранится в наборе данных.
Если во время разработки вы создаете поле InternalCalc в наборе данных (TClientDataSet, TQuery и т.д.), это почти то, о чем вы просите.
Ответ 2
Вы можете создать обновляемое представление (перед триггерами insert/update/delete) в базе данных Interbase/Firebird. Это будет выглядеть как "виртуальная таблица" для клиента (оператор выбора объявления вида также может содержать "виртуальные поля" ), и это полностью зависит от того, как вы реализуете триггеры.
Ответ 3
Вы можете сделать запись в Calcfield:
type
TCalcStringField = class(TWideStringField)
function GetCanModify: Boolean; override;
end;
function TCalcStringField.GetCanModify: Boolean;
begin
// Makes Calcfield editable
//if FieldNo > 0 then
if DataSet.State <> dsSetKey then
Result := not ReadOnly and DataSet.CanModify
else
Result := IsIndexField
//else
// Result := False;
end;
Установить Calculated to true, а в OnSetText этого поля вы можете записать текст в любое другое место
procedure TformXX.XXOnSetText(Sender: TField; const Text: string);
begin
...
end;