【问题标题】:Get Control Value for Current Record in Continuous Subform获取连续子窗体中当前记录的控制值
【发布时间】:2017-07-24 18:29:10
【问题描述】:

背景

  • Microsoft Access 2010 数据库。
  • 子表单控件是一个连续的表单控件。
  • 连续表单中的每条记录都有多个控件(组合框、文本框)和一个删除按钮。
  • 子表单的基础数据源是一个临时表。

期望的行为

当为子表单上的记录单击删除按钮时,该记录应从显示、临时表和另一个永久表中删除。

注意

临时表是通过使用多个永久表进行查询创建的。通常结构会有所不同,但是这种特殊的解决方案需要规范化和重新创建一个新的宽临时表(类似于 SQL 视图)以处理以一种形式处理所有数据(包含子表单)。

问题

每当单击删除按钮时,子例程的代码都无法正确填充子表单中当前记录的任何控件。

代码

Private Sub btnDelete_Click()
On Error GoTo Err_Handler

  Dim Reply As Integer
  Reply = MsgBox("Are you sure you want to delete this record?", vbYesNo, "Species Delete")  

  'do the deletion for temp & underlying tables
  If Reply = 6 Then

    'delete the record in temp_table
    DoCmd.SetWarnings False
    DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
    DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70
    DoCmd.SetWarnings True

    'do for @ Quadrat that has a SpeciesCover record
    Dim i As Integer
    Dim strControl As String

    For i = 1 To QUADRATS_PER_TRANSECT

        strControl = "tbxCoverID_Q" & i

        'only delete existing records (these should have a Cover ID value)
        If Me.Controls(strControl) > 0 Then

            Dim sp As New CoverSpecies

            With sp
                .CoverID = Me.Controls(strControl)

                .DeleteCoverRecord

            End With

        End If

        Next

  End If

Exit_Handler:
    Exit Sub
Err_Handler:
    Select Case Err.Number
      Case Else
        MsgBox "Error #" & Err.Number & ": " & Err.Description, vbCritical, _
            "Error encountered (#" & Err.Number & " - btnDelete_Click[Cover form])"
    End Select
    Resume Exit_Handler
End Sub

症状

代码运行正常,除了子表单当前记录中的控件始终为NULL,因此永远不会识别需要从基础表(不是临时表)中删除的记录的 ID,并且不会删除该记录。

【问题讨论】:

    标签: vba ms-access


    【解决方案1】:

    最初我考虑了以下可能的问题:

    • 未正确引用子表单控件
    • 当前记录始终是“新”记录,具有NULL

    在单步执行代码时,使用 IDE 中的即时面板检查了引用。 ?Me.Name 提供了正确的子表单名称,并且该子表单的其他控件(连续记录详细信息控件之外)提供了准确的值。 ?Me.Controls(strControl) 继续产生NULL,不管它是如何被引用的。

    考虑过以连续形式识别当前记录,但每次在 Google 上搜索相关信息都表明我应该能够直接引用子表单控件,因为这样做总是会给我当前记录的控件。

    考虑到当前的记录让我想到了我想做的事情。那是:

    • 从显示中删除记录
    • 从临时表中删除记录
    • 从永久表中删除记录

    前两个没有问题。显示器立即从显示器和临时表中删除了该记录,因为控件已绑定到该记录。完成后,我需要删除记录的 ID...

    “啊哈”时刻伴随着最后的考虑。

    我永远无法获得要删除的记录的 ID,因为...它已经被删除了!

    只要将以下代码移到末尾 - 就在最后一个 End If 语句之前...

    'delete the record in temp_table
    DoCmd.SetWarnings False
    DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
    DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70
    DoCmd.SetWarnings True
    

    ...代码运行正常并从临时表和永久表中删除。

    经验教训

    在对连续表单的代码操作(尤其是 delete 操作)进行故障排除时,请记住考虑您正在执行的步骤的顺序。通过删除,如果您的控件产生 NULL,那么您完全有可能已经删除了您想要从中获取信息的记录。

    使用连续表单时,当您引用控件(例如Me.tbxMyControl)时,您收到的值来自当前记录。您无需执行任何其他操作即可检索它。

    当解决方案只是考虑您的流程顺序时,希望这可以帮助其他人避免旋转。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      • 2019-10-19
      • 2018-04-03
      • 1970-01-01
      相关资源
      最近更新 更多