【问题标题】:Preventing Accidental Data Overwrite in Access 2007防止 Access 2007 中的意外数据覆盖
【发布时间】:2011-12-15 00:55:43
【问题描述】:

我有一个简单的 Access 2007 数据库,我在表单中添加了一个按钮,用于切换编辑当前显示记录的功能。

默认情况下,我将 AllowEdits、AllowAdditions 和 AllowDeletions 设置为 false。单击“编辑模式”按钮会改变这一点。

我还添加了几个表单事件,当显示的记录发生变化时,编辑模式被取消。

我现在发现我无法创建新记录,因为当我单击 BtnNew(附加的标准添加新记录宏)时,我收到错误“您无法转到指定的记录”。

我在数据库中的VB代码如下,任何人都可以看到我做错了什么,或者从哪里开始寻找? (我的 VB/Access 知识欠缺,但我理解这些概念,因为我是 C# 开发人员)。

Private Sub BtnEdit_Click()
    If lblEditMode.Caption = "Edit Mode" Then
        Disable
    Else
       Enable
    End If
End Sub

Private Sub Form_AfterDelConfirm(Status As Integer)
    Disable
End Sub

Private Sub Form_Current()
    Disable
End Sub

Private Sub Disable()
    AllowEdits = False
    AllowAdditions = False
    AllowDeletions = False
    BtnNew.Enabled = False
    BtnDelete.Enabled = False
    lblEditMode.Caption = ""
End Sub

Private Sub Enable()
    AllowEdits = True
    AllowAdditions = True
    AllowDeletions = True
    BtnNew.Enabled = True
    BtnDelete.Enabled = True
    lblEditMode.Caption = "Edit Mode"
End Sub

令我震惊的是,我没有将 AllowAdditions 设置为 True,但我的标签清楚地正确显示了“编辑模式”。

【问题讨论】:

  • 用户是否必须在点击 btnNew 之前点击编辑模式?我可能会在 btnNew 中编写自己的代码(而不是宏或向导代码),这样您就可以测试当用户单击 btnNew 时 AllowEditions 属性是否为真。

标签: ms-access vba ms-access-2007


【解决方案1】:

您的问题是,当您转到新记录时,Access 通过 Form_Current 将 AllowAdditions 设置为 false,这使得留在新记录上无效(基本上)。我不确定这是最好的解决方案,但我会设置一个作为表单级别的状态变量,然后选择新按钮时,将该变量设置并设置form_current以跳过禁用函数。

Enum ValidStates
    Locked = 0
    Edit = 1
    NewRecord = 2
End Enum

Dim formState As ValidStates

然后对于 btnNew,使用 [Event Procedure]

Private Sub btnNew_Click()
    On Error GoTo Err_btnNew_Click

    formState = NewRecord
    DoCmd.GotoRecord , , acNewRec

    Exit Sub

Err_btnNew_Click:
    MsgBox Err.Description
End Sub

并在 Form_Current 事件中添加:

Private Sub Form_Current()
    If formState <> NewRecord Then Disable
    formState = Edit
End Sub

这将允许您编辑新记录。您的 Enable 和 Disable 函数还会分别添加一行来设置正确的表单状态:

formState = Locked ' for Disable
formState = Edit ' for Enable

【讨论】:

  • 非常感谢,在阅读了您的回复后,我已将代码修改如下:Private Sub Form_Current() If RecordStatusEnum.dbRecordNew = False Then Disable End If End Sub 已基本解决了问题(但并不完美)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 2016-11-23
  • 2023-03-30
  • 2014-03-05
相关资源
最近更新 更多