MS Access 使用 VBA 锁定链接表
MS Access Lock Linked Tables with VBA
我对数据库设计比较陌生,但我有 4-6 年的编程经验(Java 大部分)。我能够设计一个已经运行良好的数据库,即使在网络上也是如此。它分为后端和前端,每个用户都有一份 FE。我使用 DMax 来设置订阅者的 ID,因为每个订阅者都需要一个唯一的、连续的 ID。
我唯一的问题是,当用户同时添加订阅者时,它只会保存最后一次添加。有没有办法在一个用户添加信息时锁定链接 table(使用 VBA)?
如果可以的话,其他用户能否验证table是否被锁定?
谢谢!
编辑:
这是生成号码的代码。它还会检查连续中是否有空格(例如,如果有 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 个指令。
你没有解释 where/how 你正在使用极其低效和浪费的代码或关于你的表单的许多其他内容,所以我将不得不使用我的 crystal 球并提供一个可行的解决方案.使用记录锁设置为 none 的绑定表单,在 before_update 事件中添加以下内容:
If Me.NewRecord Then
numero = nz(dmax("[Numero]", "Inscripciones"), 0) + 1
End If
在编号中出现空白的唯一方法是删除记录。如果这是一个问题,您应该使用计数 table.
这并没有直接回答您的问题。但是在循环中找到第一个缺失的数字是非常低效的,尤其是在已经存在许多连续数字的情况下。
例如如果 table 有数字 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
(改编自)
这将 运行 非常快。在保存记录之前把这个弄好,碰撞的机会就会很小。如果由于重复数字而发生错误,请捕获错误并重新运行查询。
请注意,此查询不会找到缺失的数字 1。如果这是一个相关案例,请单独检查。
我对数据库设计比较陌生,但我有 4-6 年的编程经验(Java 大部分)。我能够设计一个已经运行良好的数据库,即使在网络上也是如此。它分为后端和前端,每个用户都有一份 FE。我使用 DMax 来设置订阅者的 ID,因为每个订阅者都需要一个唯一的、连续的 ID。
我唯一的问题是,当用户同时添加订阅者时,它只会保存最后一次添加。有没有办法在一个用户添加信息时锁定链接 table(使用 VBA)?
如果可以的话,其他用户能否验证table是否被锁定?
谢谢!
编辑:
这是生成号码的代码。它还会检查连续中是否有空格(例如,如果有 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 个指令。
你没有解释 where/how 你正在使用极其低效和浪费的代码或关于你的表单的许多其他内容,所以我将不得不使用我的 crystal 球并提供一个可行的解决方案.使用记录锁设置为 none 的绑定表单,在 before_update 事件中添加以下内容:
If Me.NewRecord Then
numero = nz(dmax("[Numero]", "Inscripciones"), 0) + 1
End If
在编号中出现空白的唯一方法是删除记录。如果这是一个问题,您应该使用计数 table.
这并没有直接回答您的问题。但是在循环中找到第一个缺失的数字是非常低效的,尤其是在已经存在许多连续数字的情况下。
例如如果 table 有数字 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
(改编自
这将 运行 非常快。在保存记录之前把这个弄好,碰撞的机会就会很小。如果由于重复数字而发生错误,请捕获错误并重新运行查询。
请注意,此查询不会找到缺失的数字 1。如果这是一个相关案例,请单独检查。