获取连续子表单中当前记录的控制值

时间:2017-07-24 18:29:11

标签: vba ms-access

背景

  • 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,并且不会删除该记录。 / p>

1 个答案:

答案 0 :(得分:0)

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

  • 子窗体控件未正确引用
  • 当前记录总是“新”记录具有NULL

在逐步执行代码时,使用IDE中的立即面板检查了引用。 ?Me.Name为子表单提供了正确的子表单名称和其他控件(在连续记录详细控件之外),提供了准确的值。无论引用方式如何,?Me.Controls(strControl)都会继续生成NULL

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

考虑到目前的记录是什么,我想一想我想做什么。那是:

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

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

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

我永远无法获取要删除的记录的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

...代码正常运行并从temp&中删除永久表格。

经验教训

在对连续表单的代码操作(尤其是delete操作)进行故障排除时,请记住考虑您正在执行的步骤的顺序。使用删除功能,如果您的控件产生NULL,则您完全可以删除所需信息的记录。

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

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