手动保存绑定表(VBA)

问题描述 投票:0回答:2

我有一个绑定到表格的表单,但是当我保存时(我有一个按钮),我需要进行一些手动标志设置。保存有效,但我注意到因为它是绑定的,所以无论如何它都会保存。尽管有限制,但如何防止自动保存?有没有办法中断 before_update() 或者其他什么?

我看到了这个链接:我可以添加 UI 操作确认吗?

所以我尝试设置 form_beforedate() 如下所示:

Private Sub Form_BeforeUpdate(Cancel As Integer)

Dim mIsUserUpdate As Boolean 'Flag
If Not mIsUserUpdate Then Cancel = True
End Sub

在我的模块中,我在顶部添加了:

Private mIsUserUpdate As Boolean

在我的保存按钮中我有这个功能:

Private Sub cmdSave_Click()
Dim strName As String

strName = Me.Name
SaveTabs Forms(strName)

End Sub

保存选项卡在模块中的位置如下所示:

Function SaveTabs(frm As Form) As Integer

Set dbs = CurrentDb()

tbl = "SELECT " &.......
Set tdf = dbs.OpenRecordset(tbl)

ArrKnownFields = Getknownfields(tdf)

'Folgend, der Update-Befehl..
For Each ctrl In frm
    If IsInArray(ctrl.Name, ArrKnownFields) Then
        If Not IsNull(ctrl.Value) Then
            strSQL = strSQL & "[" & ctrl.Name & "] = '" & ctrl.Value & "',"
        Else
            strSQL = strSQL & "[" & ctrl.Name & "] = ' ',"
        End If
    End If
Next ctrl

If Forms!frmMainMenu.cboDatachoice.ListIndex = 0 Then
    strSQL = strSQL & "1_Val= '" & gUser & "'" 
    If Len(strSQL) > 0 Then
        strSQL = "UPDATE END_CFR_" & strName & " SET " & strSQL & " WHERE "
        
        If strName = "Col" Then
            strSQL = strSQL & "R_IDCC ='" & frm.txtID.Value & "'"
        ElseIf strName = "Fac" Then
            strSQL = strSQL & "R_IDFF ='" & frm.txtID.Value & "'"
        ElseIf strName = "Deb" Then
            strSQL = strSQL & "R_IDFD ='" & frm.txtID.Value & "'"
        End If
    End If

    **mIsUserUpdate = True**  'flag ON

    frm.Dirty = False
    CurrentDb.Execute strSQL, dbFailOnError

因此,因为我使用 gUser 设置“1_Val”,所以我必须手动执行此操作。

不幸的是,frm.Dirty = False,强制激活form_beforeUpdate,但由于某种原因,mIsUserUpdate 突然再次变为 false,尽管我像上面一样将其设置为 true..

那么我做错了什么?因为我仍然收到错误 2101,因为 frm.dirty= false 不起作用。

在你问之前,我已经绑定了它,以便我可以看到数据集的数量并使用箭头滚动数据集,而且绑定时可以更轻松地填充各种文本字段和组合框。

顺便说一句,我正在使用 access 2021。

提前致谢

vba ms-access save
2个回答
0
投票

您可以使用 Form.Undo 方法撤消表单中的更改。

Private Sub Form_BeforeUpdate(Cancel As Integer)
    If Me.Dirty Then
        If MsgBox("Save the changes?", vbYesNo + vbQuestion, "Save Changes") = vbNo Then
            Me.Undo
        End If
    End If
End Sub

0
投票

删除 local 变量,因为它隐藏了模块变量:

Private Sub Form_BeforeUpdate(Cancel As Integer)

    If Not mIsUserUpdate Then Cancel = True

End Sub
© www.soinside.com 2019 - 2024. All rights reserved.