MS Access使用VBA锁定链接表

时间:2017-04-23 18:02:55

标签: vba ms-access linked-tables record-locking

我对数据库设计比较陌生,但我有4-6年的编程经验(主要是Java)。我能够设计一个已经运行良好的数据库,即使在网络上也是如此。它在后端和前端分开,每个用户都有FE的副本。我使用DMax来设置订阅者ID,因为每个订阅者都需要一个唯一的连续ID。

我唯一的问题是,当用户同时添加订阅者时,它只会保存最后一次添加。当一个用户添加信息(使用VBA)时,有没有办法锁定链接表?

如果可能,其他用户可以验证表是否已被锁定?

谢谢!

编辑:

这是生成号码的代码。它还会检查连续中是否有空格(例如,如果有5,6,8则会使它成为7)。

            Dim counter As Integer
            counter = 1
            Dim validation As Boolean
            validation = False
            max = Nz(DMax("Numero", "Inscripciones"), 0) + 1
            While validation = False
                If Not IsNull(DLookup("[Numero]", "Inscripciones", "[Numero] = " & Nz([counter], 0))) Then
                    If (counter <= max - 1) Then
                        counter = counter + 1
                    Else
                        validation = True
                    End If
                Else
                    validation = True
                End If
            Wend

在按下按钮之前,记录不会以任何方式保存。在保存记录之前,这个数字生成发生了5条指令。

2 个答案:

答案 0 :(得分:1)

这并不能直接回答您的问题。但是在循环中找到第一个缺失的数字是非常低效的,特别是如果已经存在许多连续数字的话。

E.g。如果表格的数字为1..200,则您的代码将调用DLookup 200次。使两个实例更有可能同时运行此循环,并得出相同的结果。

相反,使用这样的SQL查询来查找第一个缺失的数字:

SELECT MIN(i1.Numero + 1) AS Missing
FROM Inscripciones i1
  LEFT JOIN Inscripciones i2
    ON i2.Numero = i1.Numero+1
WHERE i2.Numero IS NULL

(改编自here

这将运行得非常快。在保存记录之前把它放好,碰撞的可能性非常小。如果由于数字重复而发生错误,请捕获错误并重新运行查询。

请注意,此查询无法找到丢失的数字1.如果是相关案例,请单独检查。

答案 1 :(得分:0)

你没有解释你在哪里/如何使用那些极其低效和浪费的代码或其他关于你的表格,所以我必须使用我的水晶球,只是提供一个可行的解决方案。使用记录锁定设置为none的绑定表单,在before_update事件中添加以下内容:

If Me.NewRecord Then
numero = nz(dmax("[Numero]", "Inscripciones"), 0) + 1
End If

编号中唯一的方法是删除记录。如果这是一个问题,您应该使用计数表。