【发布时间】:2018-02-11 20:19:32
【问题描述】:
我有一个 Microsoft Access 表单,它绑定到具有计算列的链接 SQL Server 表。我有一个绑定到计算列的控件。
我已经意识到在保存记录之前无法刷新计算域。除此之外,在保存后刷新绑定到计算列的文本框的最佳方法是什么。
我不希望执行 me.requery(重新查询整个记录集)。
有没有办法只刷新一个字段?
【问题讨论】:
标签: sql-server ms-access data-binding
我有一个 Microsoft Access 表单,它绑定到具有计算列的链接 SQL Server 表。我有一个绑定到计算列的控件。
我已经意识到在保存记录之前无法刷新计算域。除此之外,在保存后刷新绑定到计算列的文本框的最佳方法是什么。
我不希望执行 me.requery(重新查询整个记录集)。
有没有办法只刷新一个字段?
【问题讨论】:
标签: sql-server ms-access data-binding
为清晰而编辑:实际上有一些策略需要考虑。
Form.Refresh() 将刷新表单的记录源,捕获对现有记录的修改和删除,并将保持定位在当前记录上。但是,您不会看到自打开表单以来添加的任何新记录。
Form.Requery() 将重新运行 Form 的记录源查询。您将看到所有 Form.Refresh() 更改,它会显示任何新记录。在 UI 上,Form.Requery() 重新定位到第一条记录。
Form.Control.Requery() 与 Form.Refresh() 类似,您不会更改记录位置或查看新记录。假设控件基于查询/表,它将更新您的控件。
您需要确保触发事件涉及数据库更新。在某些情况下,控件的 AfterUpdate() 在数据库 I/O 之前,这对您没有帮助。
【讨论】:
谢谢各位。在这里它起作用了。
在 Form AfterUpdate 事件中,我执行了 Me.ControlName.Requery。这是完美的,因为它没有进行完整的表单刷新或重新查询。
我只是尝试了不同的事件/方法组合,直到获得最佳结果。
感谢您的意见。
赛斯
【讨论】:
2016(相关)答案:在 Access 2016 中,我有一个控件,它是基于 4 个其他绑定文本框中的值的计算字段。我将计算字段的控制源设置为=gsngCalculatePaymentAmount([txtInterestRate],[txtLengthOfLoanInYears],[txtSalePrice],[txtMoneyDown])。
但是,只要这 4 个文本框中的任何一个的值发生更改,我都需要刷新该值。难以使计算值刷新。解决方案:在其值用于计算字段的 4 个文本框中的每个文本框中的 AfterUpdate 事件中,我只是执行了以下操作:
Dim v1 As Variant
v1 = Me.txtMyCalculatedTextbox
只需引用计算字段的值即可解决! 雷克斯
【讨论】:
您是否为基础记录集或绑定控件尝试过 .Refresh?我希望它适用于 Jet/ACE 后端,但与不同数据库服务器后端的交互将是不可预测的。
可能还会与您进行 ODBC 刷新间隔交互,但我希望手动刷新代码来解决这个问题。
在哪里调用它是另一个问题——我认为适当的位置是在控件的 AfterUpdate 事件中,该控件绑定到计算所基于的字段。但是您可能必须保存记录以进行服务器端计算——单独刷新可能会也可能不会成功。我知道 Jet/ACE 数据源的 Refresh 会保存记录,但我不确定它是否与 ODBC 数据源的行为方式相同。
【讨论】:
我是这样做的(txtTextBox的控制源是一个SQL Server字段,其值是计算出来的):
On Error Goto ErrorHandler
'After saving data when I wanted to see the updated value of computed field
txtTextBox = txtTextBox & ""
ErrorHandler: If err.Number = -2147352567 Then 'The data has been changed.
Resume Next
else
msgbox err.description
end if
【讨论】: