【问题标题】:Main form record validation when moving focus to subform in MS Access将焦点移动到 MS Access 中的子表单时的主表单记录验证
【发布时间】:2019-12-31 21:37:42
【问题描述】:

使用 Access 2016,我有一个主表单 frmInvoice,它有一个子表单 frmInvoiceDetail。我的主表单绑定到一个带有必填字段PaymentMethod 的表。但是,在发票上的项目输入连续子表单之前,通常不会填充该字段。我希望在用户离开该发票记录或关闭表单时启动必填字段验证,而不是在主表单和子表单之间切换焦点时。

我已尝试删除字段上的“必需”状态并运行 VBA 代码以检查当用户关闭表单或使用表单控件移至另一张发票时填充该字段,但似乎无法运行此当用户使用导航按钮移动到另一个发票记录时的代码。

有什么想法吗?感谢阅读...

【问题讨论】:

  • 您是指内部导航栏按钮吗?我通常禁用它并构建自己的导航按钮和代码。
  • 我使用一个记录集(过滤到一个发票-nr),所以主窗体不能移动。

标签: vba ms-access subform required-field


【解决方案1】:

使用ADODB.Recordset as Form.RecordsetADODB.Recordsets WillMove event 跟踪记录集移动的示例代码。

由于某种原因(我是 ADODB-Forms 的新手),rstrecordset 和表单记录集在WillMoveevent 中不同步。您必须使用rstrecordset 检查值。表单控件将显示您要移动到的记录的值。然后您必须将表单记录集设置回 rst,否则表单将移动。

在表单中使用此代码:

Option Explicit
Private WithEvents rst As ADODB.Recordset

Private Sub Form_Close()
Set rst = Nothing
End Sub

Private Sub Form_Open()
Dim con As ADODB.Connection
Set con = New ADODB.Connection
con = CurrentProject.Connection
con.CursorLocation = adUseClient
con.Open

Set rst = New ADODB.Recordset
With rst
    .ActiveConnection = con 
    .LockType = adLockBatchOptimistic
    .CursorType = adOpenDynamic
    .Open "Select * from Table"
End With
Set Me.Recordset = rst
End Sub

Private Sub rst_WillMove(ByVal adReason As ADODB.EventReasonEnum, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
If Len(rst.Fields("PaymentMethod") & vbNullString) = 0 Then
    adStatus = adStatusCancel
    Set Me.Recordset = rst
End If

【讨论】:

    【解决方案2】:

    Access 中的表单和对象具有操作顺序。 Order of Events MS Article

    不幸的是,您似乎需要调用 RecordExit 事件,但它不可用。更多细节在这里:RecordExit Didn't make the cut

    【讨论】:

    • ADODB-Recordsets 在此处提供WillMove and MoveComplete events.Example。添加链接以回答投票。
    • @ComputerVersteher:我希望看到您在 Access VBA 中建议的工作版本。我花了半天的时间试图用你引用的资源找到一些东西,但没有成功。
    猜你喜欢
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多