gpt4 book ai didi

delphi - FireDac FDQuery 在浏览结果时提交更改的数据字段

转载 作者:行者123 更新时间:2023-12-01 22:19:59 27 4
gpt4 key购买 nike

我有一个 FDQuery 绑定(bind)到 FDConnection。

我使用 DB Data-Aware 组件在表单上显示数据。

每当我使用 FPQuery.Next、.Prior...时,它都会在结果之间浏览。

一切正常。

除非我更改一个值(例如 John -> Jane),然后使用 FPQuery.Next 获取它保存的下一个结果,即使我没有 FDQuery1.CommitUpdates,也会将更改后的值提交到数据库。

有没有办法只在用户按下 nbPost-Button 或使用 FDQuery1.CommitUpdates 时保存更改的数据字段,而不是在结果之间浏览时保存?

enter image description here

谢谢!

最佳答案

就像我在评论中所说,标准的 TDataset 行为是在导航到另一行之前调用其 .Post 方法来保存对当前行的更改。这发生在 Data.DB.Pas 的例程 TDataSet.CheckBrowseMode 中,该例程在任何导航操作之前调用。如果不派生自定义 TDataset 后代,则无法更改此设置。

(来自 Data.DB.Pas)

procedure TDataSet.CheckBrowseMode;
begin
CheckActive;
DataEvent(deCheckBrowseMode, 0);
case State of
dsEdit, dsInsert:
begin
UpdateRecord;
if Modified then Post else Cancel;
end;
dsSetKey:
Post;
end;
end;

当然,TDataSet 有一个 BeforePost 事件,因此尝试使用它来取消更改可能很诱人;然而,BeforePost 的问题是如何确定它被调用的上下文,以便能够判断它是否是从 CheckBrowseMode 调用的,而不是作为用户单击“保存”按钮的结果。

解决这个问题的简单方法是捕获 DBNavigatorBeforeAction 事件,然后再调用数据集上的导航操作,从而触发 .Post :

procedure TForm1.DBNavigator1BeforeAction(Sender: TObject; Button:
TNavigateBtn);
var
Res : Integer;
DataSet : TDataSet;
begin
DataSet := DBNavigator1.DataSource.DataSet;
case Button of
nbFirst,
nbPrior,
nbNext,
nbLast: begin
if DataSet.State in [dsEdit, dsInsert] then begin
Res := MessageDlg('The current row has unsaved changes. Abandon them?', mtWarning, [mbYes, mbNo], 0);
if Res = mrYes then
DataSet.Cancel
else
DataSet.Post;
end;
end;
end;
end;

关于delphi - FireDac FDQuery 在浏览结果时提交更改的数据字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33318372/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com