Возможно ли создать поддельное поле данных в наборе данных 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;