首页 > 解决方案 > 处理子表单上留空的已编辑字段

问题描述

当用户决定在第一次更新期间“清除/删除”表单上输入的行时,我遇到了问题。

我有一个带有子表单的表单,可以为用户提供多个条目的可能性,但是,在用户首先编辑子表单上的任何字段后,相应的记录会变脏并被记录,所以如果用户决定不再使用该记录和删除该行的所有信息,该行现在全是空白的仍在记录中,这给了我数据中的空白行(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

在用户删除所有字段内容之前

用户删除所有字段内容后

标签: vbams-access

解决方案


对于删除 (-) 按钮,请考虑以下代码:

DoCmd.SetWarnings False
DoCmd.RunCommand acCmdDeleteRecord
DoCmd.SetWarnings True

对于添加 (+) 按钮,只需使用您已经知道的代码移动到新记录行。
Docmd.GoToRecord , , acNewRec


推荐阅读