背景
所需行为
当单击删除按钮以获取子窗体上的记录时,应从显示,临时表和另一个永久表中删除该记录。
注意
临时表是使用多个永久表通过查询创建的。通常结构会有所不同,但是这个特殊的解决方案需要规范化并重新创建一个新的宽临时表(类似于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>
答案 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
)时,您收到的值来自当前记录。您无需执行任何其他操作即可检索它。
希望这可以帮助其他人在解决方案只是考虑您的流程顺序时避免旋转轮。