我想在DataSet(而不是ClientDataSet)中创建一个'假'数据字段:
- 该字段不应存储在db中
- 它不是计算字段(应允许用户输入输入数据)
- 该字段具有业务逻辑含义,因此在用户更新其值后,它应更新其他字段(使用OnFieldChange事件)
我知道我可以有一个简单的无dbaware控件,捕获它的OnChange事件并在那里执行计算(或调用DataSet所在的DataModule函数)但我认为如果我可以重新利用数据集自动绑定db-更干净ware控件和数据集事件..
这样,Form(Presentation)和DataModule(Model)之间的唯一连接就是DataSet(更少的耦合)。
PD:我正在使用fibplus,我认为解决方案(如果有的话)将处于VCL级别。
谢谢!
您是否尝试过使用InternalCalc字段?您的数据感知控件将允许您编辑InternalCalc字段的值,并将值存储在数据集中。
如果您在设计时在数据集(TClientDataSet,TQuery等)中创建InternalCalc字段,那么它几乎就是您所要求的。
您可以在Interbase / Firebird数据库中创建可更新视图(在插入/更新/删除触发器之前)。这看起来像是客户端的“虚拟表”(视图声明的select语句也可以包含“虚拟字段”),完全取决于您如何实现触发器。
您可以将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设置为true,然后在此Field的OnSetText中,您可以将Text写入任何其他位置
procedure TformXX.XXOnSetText(Sender: TField; const Text: string);
begin
...
end;