можно создать поддельное поле данных в наборе данных Delphi? - PullRequest
11 голосов
/ 03 ноября 2011

Я хочу создать «поддельное» поле данных в наборе данных (не ClientDataSet):

  • поле не должно храниться в БД
  • это не вычисляемое поле (пользователь должен иметь возможность вводить входные данные)
  • поле имеет значение бизнес-логики, поэтому после того, как пользователь обновит свое значение, ему следует обновить другие поля (с событием OnFieldChange)

Я знаю, что могу иметь простой элемент управления no-dbaware, перехватить его событие OnChange и выполнить там вычисления (или вызвать функцию DataModule, где находится DataSet), но я думаю, что будет более чисто, если я смогу повторно использовать автоматическую привязку набора данных с элементами управления базой данных и событиями набора данных ..

Кроме того, уникальная связь между формой (презентация) и модулем данных (модель) - это набор данных (без связи).

PD: я использую fibplus, и я думаю, что решение (если оно есть) будет на уровне VCL ..

спасибо!

Ответы [ 3 ]

10 голосов
/ 03 ноября 2011

Вы пытались использовать поле InternalCalc?Ваши средства управления данными позволят вам редактировать значение поля InternalCalc, и оно будет сохранено в наборе данных.

Если вы создаете поле InternalCalc в наборе данных (TClientDataSet, TQuery и т. Д.) Во время разработки, этопочти то, что вы просите.

3 голосов
/ 03 ноября 2011

Вы можете создать обновляемое представление (с триггерами перед вставкой / обновлением / удалением) в вашей базе данных Interbase / Firebird. Это будет выглядеть как «виртуальная таблица» для клиента (оператор выбора объявления представления также может содержать «виртуальные поля»), и вам решать, как реализовать триггеры.

2 голосов
/ 03 ноября 2011

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

Установите для параметра Рассчитано значение true, и в OnSetText этого поля вы можете записать текст в любое другое место

procedure TformXX.XXOnSetText(Sender: TField; const Text: string);
begin
   ...
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...