vba - 处理子表单上留空的已编辑字段
问题描述
当用户决定在第一次更新期间“清除/删除”表单上输入的行时,我遇到了问题。
我有一个带有子表单的表单,可以为用户提供多个条目的可能性,但是,在用户首先编辑子表单上的任何字段后,相应的记录会变脏并被记录,所以如果用户决定不再使用该记录和删除该行的所有信息,该行现在全是空白的仍在记录中,这给了我数据中的空白行(TransactionID 和 ID 未在表单上显示给用户,我添加它是为了这篇文章的)。
如果在不脏的“新”行上,用户误按任何键,甚至直接删除它,记录就会永久变脏,因此它会以完全空白的方式结束,这也可能会意外发生。
我找不到避免记录这些空白行的方法。
我想知道是否可以有按钮来“添加新行”和“删除一行”,就像在最后一行它会有一个“+”来添加新行(所以“新的不是脏”行不会自动出现),并且在前面的行上会有一个“-”来删除该特定记录(这只是一个想法,它可以是任何一种方式)。
这是可以实现的吗?如果不是,有没有办法简单地避免空白行被保存?就像在循环中一样,保存跳过那些空白行?
为了更好地解释,添加了更多信息。
我之前没有包含代码,因为这后面没有代码,这只是访问自然记录集。我没有使用 DAO 记录集或 SQL 来“保存”记录(只是在丢弃事件中从表中删除),我使用的是普通的有界控件。
我所做的修改是在父表单上始终保持在当前记录(循环)和加载事件上,它总是进入新记录。因此,保存和取消按钮用于确认或放弃在父表单上创建的新记录,因为正如我之前所说,子表单用于在父表的同一记录下输入多个记录,在其他单词,一对多关系,因此“关闭”按钮包含一个简单的代码,用于删除父表上的最后一个条目(因为它仍然在当前记录上)并且表具有“删除级联关系”所有信息进入子表单/子表会被自动删除,所以我只需要处理插入父表的数据,而保存按钮用于获得用户的保存确认,
这几乎就是此表单上的代码,如下所示。
但是在代码之前,我想强调一下,我已经使用了“BeforeUpdate”事件,它工作得很好,它使用户在子表单上打开新记录之前添加所有字段,但是让我们假设用户在子表单上输入 10 条记录,然后用户决定“删除”其中一条记录(在这种情况下不是最后一条,所以他不能只按“ESC”,我不能只运行“Me.Undo”) ,所以如果用户清除字段(就像我提供的图像一样,因为我不知道如何在这种情况下删除记录),更新前事件被触发并且不允许用户做他/她填写空白字段时的任何内容,甚至没有单击“取消”。因此,在我的“保存”
一开始我以为那些“空白行”不会经常发生,我不得不偶尔清理它们,但令人难以置信的是,用户创建的空白行数量。我几乎每周都要清理它们。
我真的想要一种创建“+ 添加行”和“-删除行”按钮的方法,因为如果用户想要删除一行,他只需单击“-”按钮,添加新行也是如此。
再次感谢您的帮助。我真的在这方面苦苦挣扎。谢谢大家。
Private Sub btnSave_Click()
If IsNull(Me.TransactionDate) _
And IsNull(Me.SupplierPayee) _
And IsNull(Me.TotalReceipt) Then
MsgBox "Form in blank!", vbInformation + vbOKOnly, "Saving..."
Exit Sub
End If
If IsNull(Me.TransactionDate) _
Or IsNull(Me.SupplierPayee) _
Or IsNull(Me.TotalReceipt) Then
MsgBox "Please fill in all the fields", vbCritical + vbOKOnly, "Transaction not Saved"
Exit Sub
End If
Me![subfrmPCHeaderDetail].SetFocus
DoCmd.GoToRecord , , acFirst
If IsNull(Me.TransactionDate) _
Or IsNull(Me.SupplierPayee) _
Or IsNull(Me.TotalReceipt) _
Or IsNull(Form_frmPCHeaderDetail.Item) _
Or IsNull(Form_frmPCHeaderDetail.ItemAmount) _
Or IsNull(Form_frmPCHeaderDetail.VATRate) _
Or IsNull(Form_frmPCHeaderDetail.DescriptionPurpose) Then
MsgBox "Please fill in all the fields", vbCritical + vbOKOnly, "Transaction not Saved"
Exit Sub
ElseIf Form_frmPCHeaderDetail.ItemAmount = "0" Then
MsgBox "Amount cannot be €0.00", vbCritical + vbOKOnly, "Transaction not Saved"
Form_frmPCHeaderDetail.ItemAmount.SetFocus
Exit Sub
End If
If Not Me.TotalReceipt.Value = Form_frmPCHeaderDetail.GrossTotal _
Or IsNull(Me.TotalReceipt) Then
MsgBox "Please check the Receipt Amount Details as ""Gross Total"" and ""Receipt Total"" are not matching"
Exit Sub
End If
If Me.ReceiptScanned.AttachmentCount = 0 Then
MsgBox "Please scan the receipt and add it to this transaction", vbInformation + vbOKOnly, "Add the Receipt"
Me.AddReceiptScanned.SetFocus
Exit Sub
End If
If Me.TransactionDate > Date Then
MsgBox "Future Transaction Date not allowed", vbCritical + vbOKOnly, "Transaction not Saved"
Me.TransactionDate.SetFocus
Exit Sub
Else
Dim Result As Long
Result = MsgBox("Saving Transaction!" & vbNewLine & vbNewLine & _
"Attention!" & vbNewLine & vbNewLine & _
"You will not be able to delete nor modify any detail of this transaction!" & vbNewLine & vbNewLine & _
"Are you sure you would like to save this transaction?" & vbNewLine & vbNewLine & _
"Click ""YES"" to save, or click ""NO"" to return.", vbExclamation + vbYesNo, "Save Transaction?")
If Result = 6 Then
DoCmd.Save
DoCmd.Requery
Form_frmPCHeader.TransactionDate.SetFocus
DoCmd.GoToRecord , , acNewRec
MsgBox "Transaction added successfully to the Petty Cash Register", _
vbInformation + vbOKOnly, "Petty Cash transaction added"
End If
End If
End Sub
Private Sub btnClose_Click()
Dim LastID As Long
Dim Result As Long
If IsNull(TransactionID) Then
DoCmd.Close
Exit Sub
End If
LastID = TransactionID
MsgBox("Closing without saving!" & vbNewLine & vbNewLine & _
"If you want to discard the entries, click ""YES"", or click ""NO"" to return.", vbCritical + vbYesNo, "Discard Entries?")
If Result = 6 Then
Application.Echo False
Me.Painting = False
DoCmd.SetWarnings False
Me.TransactionDate = "31/12/2099"
Me.SupplierPayee = "Discarded"
Me.TotalReceipt = 0
DoCmd.Save
DoCmd.Requery
DoCmd.RunSQL "DELETE * FROM tblPCHeader WHERE TransactionID = " & LastID & ""
DoCmd.Close
Application.Echo True
DoCmd.SetWarnings True
End If
End Sub
Private Sub Form_Load()
DoCmd.GoToRecord , , acNewRec
End Sub
解决方案
对于删除 (-) 按钮,请考虑以下代码:
DoCmd.SetWarnings False
DoCmd.RunCommand acCmdDeleteRecord
DoCmd.SetWarnings True
对于添加 (+) 按钮,只需使用您已经知道的代码移动到新记录行。
Docmd.GoToRecord , , acNewRec
推荐阅读
- expect - 在 linux expect 命令中跳过迭代
- sql - 如何使用名称中带有点的大量数据库?
- swift - SwiftUI: ViewModel string to binding child view data
- javascript - 未捕获的类型错误:无法读取 mapbox 的未定义属性(读取“坐标”)
- jquery - htmlspecialchars() 期望参数 1 是字符串,使用 laravel 给出的数组
- docker - 使用 Docker Swarm 作为反向代理,使用覆盖网络路由网格
- flutter - 我们如何为颤振做 `openCart` 设置?
- python - 围绕一个轴的多直方图un python
- javascript - 如果选中复选框,则添加 URL
- python - 我的 pymongo 测试代码出现错误