MS ACCESS VBA:Me.Dirty = False OnTimer事件恢复编辑的文本框数据

时间:2014-02-28 21:47:47

标签: vba ms-access ms-access-2010

所有

第一次在这里问一个问题。已经发现Stack Overflow对我的MS VBA和MS ACCESS问题非常有帮助。但是找不到任何有相同问题的人。这个问题是解决另一个问题的一部分,因此我将描述两个人是否都很好奇。

我有一个表单,多个用户(拆分数据库)用来填写请求表单。此表单包含许多字段和两个子表单,因此有时可能需要一段时间才能填写用户。

我在Form_BeforeInsert事件中为表单分配了一个新的请求编号,它运行良好。它会在第二个人开始输入数据时将数字添加到表单中。

第一个问题是,在填写申请表的同时,人们遇到了奇怪的冲突。数据将从一个用户的输入转置并出现在另一个用户的输入上。我没有亲眼看过这个问题,只得到了二手账。

我的猜测是两个用户同时填写了新请求,并且在填写之前都没有保存表单(因此在添加记录和保存之间有很长的延迟)。我的解决方案是每隔约5秒强制保存一次,通过Form_OnTimer事件完成。这是我的参考代码:

Private Sub Form_BeforeInsert(intCancel As Integer)
    Dim lngNewSampleNum As Long
    lngNewSampleNum = DMax("SAMPLE", "tbl_Table1") + 1

    'Assign default values
    SAMPLE = lngNewSampleNum
    DATE_INIT = Date$
End Sub

Private Sub Form_Load()
    'Set timer on 5 sec interval
    Me.TimerInterval = 5000&
End Sub

Private Sub Form_Timer()
    'Save record (every 5 secs)
    If Me.Dirty Then
        Me.Dirty = False
    End If
End Sub

我遇到的Me.Dirty = False事件的问题是它会“忘记”当前的文本框数据。要触发,我要做的是编辑表单上的字段,使其变脏。然后,虽然表单仍然是脏的(记录指示器是铅笔),我在不同的字段中键入几个字符。不要移动光标,将其保留在字段中。等待表单自动保存(记录指示符更改为箭头)。输入内容,您之前写的内容将被删除。

因此,这让我怀疑Me.Dirty = false事件未保存当前字段更改,实际上,如果您再次开始编辑字段,则会将这些更改还原为空白。这导致用户开始打字,然后开始他们写的东西消失。

有没有人有任何建议可以尝试?我发现的唯一一件事就是在Allen Browne的网站上:http://allenbrowne.com/bug-01.html

我在R& D工作时无法发布数据库,它包含敏感信息。使用MS Access 2010(版本:14.0.7113.5005 32位),用户正在运行MS Access Runtime 2010。

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为你的问题在于你得到你的密钥 - 没有什么可以阻止两个用户获得相同的密钥,因为此时你没有更新记录集。我建议你使用能抓住的代码。确认您有密钥(即您可以将您的工作站名称或用户名插入密钥表吗?)

答案 1 :(得分:0)

希望你在这里找到满意的答案!我没有在评论中发布我的回复,因为它不适合,但希望这提供了一些有用的信息。

当我创建一个用于数据输入的表单时,我通常会将它从表中完全分离 - 它避免了并发问题,我不必处理Access接口的一些奇怪的怪癖,我可以确定一切都是以我想要的方式完成。因此,纯粹通过VBA实现这一目标会破坏使用Access的许多目的并且不受欢迎,但对我而言则更容易。

所以说,如果你上传了一个表,你可以只使用内置的DAO记录集实用程序(如果你已经熟悉它们,请随意跳过它。)所以在从一个表中删除表单之后记录源,你可以---

dim db as database
set db = currentdatabase

dim rst as recordset
set rst = db.openrecordset("myuploadtable")

dim frm as form
set frm = forms("mydatainputform")

with rst
   .addnew
   .fields("customername") = frm.txtCustomerName 'My textbox names
   .fields("purchaseamount") = frm.txtPurchaseAmount
   .update
end with

因此,如果要上传到多个表,并且需要将ID用作另一个表中的外键,则可以通过 - (这将直接在上面的代码下工作)进行检索

rst.close
set rst = db.openrecordset("Select @@Identity")

dim myForeignKey as integer
myForeignKey = rst.fields(0)
rst.close

获取外键的另一种方法可能是选择该表中的MAX外键(几乎保证获得正确的想法),如果你刚刚上传的字段确定了提交它的用户,那就更好了,选择MAX id,其中theuser ='Jim'

我的理解是应该避免这种类型的事情,并且应该尽可能使用标准访问接口,我可以想到为什么会出现这种情况的一些原因(这是一个统一的标准,所有访问开发人员都能理解你的代码所在如果写得不好可能会让他们感到困惑)但我不认为从您的记录源中分离您的表格有任何严重的问题。我很想听到其他人的意见,但

祝你好运!