我对数据库设计比较陌生,但我有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条指令。
发布于 2017-04-24 22:48:23
这不能直接回答你的问题。但是,在循环中查找第一个丢失的数字是非常低效率的,特别是如果已经存在多个连续的数字。
例如,如果表的编号为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。如果这是相关的情况,请单独检查。
发布于 2017-04-24 22:44:42
您并没有解释在哪里/如何使用非常低效和浪费的代码,也没有解释关于表单的许多其他内容,所以我必须使用我的水晶球,并提供一个可行的解决方案。在before_update事件中,使用记录锁设置为none的绑定窗体,添加以下内容:
If Me.NewRecord Then
numero = nz(dmax("[Numero]", "Inscripciones"), 0) + 1
End If只有当你删除记录时,你才会在编号中有空白。如果这将是一个问题,你应该使用一个理货表。
https://stackoverflow.com/questions/43574641
复制相似问题