【问题标题】:it's possible to create a fake data field in a delphi dataset?可以在 delphi 数据集中创建假数据字段吗?
【发布时间】:2011-12-21 07:51:01
【问题描述】:

我想在 DataSet(不是 ClientDataSet)中创建一个“假”数据字段:

  • 该字段不应存储在数据库中
  • 它不是一个计算字段(应该允许用户输入输入数据)
  • 该字段具有业务逻辑意义,因此用户更新其值后应更新其他字段(使用 OnFieldChange 事件)

我知道我可以有一个简单的无 dbaware 控件,捕获它的 OnChange 事件并在那里执行计算(或调用 DataModule 函数,DataSet 所在的位置)但我认为如果我可以重新利用数据集自动绑定它会更干净带有 db-ware 控件和数据集事件..

同样,Form(Presentation)和 DataModule(Model)之间的独特连接是 DataSet(耦合较少)..

PD:我正在使用 fibplus,我认为解决方案(如果有的话)将在 VCL 级别..

谢谢!

【问题讨论】:

  • 对非数据库内容使用数据库感知控件确实不是最佳选择。还有其他方法可以避免连接您不想连接的东西。
  • 这是数据库数据,只是它没有存储在这个特定的表中。我也知道绑定,但我使用的是 D2010,我没有时间开始使用自定义库.. (stackoverflow.com/questions/7882599/…)

标签: delphi dataset


【解决方案1】:

您是否尝试过使用 InternalCalc 字段?您的数据感知控件将允许您编辑 InternalCalc 字段的值,并且该值存储在数据集中。

如果您在设计时在数据集(TClientDataSet、TQuery 等)中创建一个 InternalCalc 字段,它几乎就是您所要求的。

【讨论】:

  • 我只是想写同样的答案。
  • 这看起来像是原生的 vcl 方式。我对其进行了测试,并且在设计时工作得很好。不幸的是,我在运行时创建了所有数据集,但没有定义 fielddef 。(基本上我设置了 SelectSQL。文本,然后调用 Open,以便从 SQL 字段列表中创建字段)。我试图在 DataSet 的 AfterOpen 事件中添加该字段,但它引发了一个异常“无法在打开的数据集上执行此操作”.. 任何解决方法来解决这个问题?谢谢
  • 这不适用于自动创建字段选项。这与普通的计算字段相同。在打开数据集之前,您必须使用静态字段或在运行时创建所有字段。可以打开数据集,保存字段定义,关闭它,创建字段和计算字段,然后再次打开它。不过,这将需要一些棘手的实现。
【解决方案2】:

您可以在您的 Interbase/Firebird 数据库中创建一个可更新的视图(使用之前的插入/更新/删除触发器)。这对客户端来说就像一个“虚拟表”(视图声明的 select 语句也可以包含“虚拟字段”),完全取决于您如何实现触发器。

【讨论】:

  • 我相信其他场合的一个不错的技巧.. 在这种情况下 1)逻辑进入触发器 2)我必须发布到虚拟表(可更新视图)以执行触发器并获取其他字段已更新(最后一件事在我的情况下不可行).. 我是对的?
  • 是的,客户端必须发布到视图并重新加载视图以获取更新的值。
【解决方案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 设置为 true,然后在该 Field 的 OnSetText 中,您可以将 Text 写入任何其他位置

procedure TformXX.XXOnSetText(Sender: TField; const Text: string);
begin
   ...
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-08
    • 2014-06-01
    • 2019-05-13
    • 2019-12-26
    • 2019-03-23
    • 2021-01-09
    • 2012-04-22
    • 1970-01-01
    相关资源
    最近更新 更多