Access 2010实现随机返回行并锁定/标记避免重复调用求助
解决Access 2010中避免重复获取查询结果的问题
嘿,我来帮你搞定这个重复拿数据的麻烦!你的现有查询已经能随机选出2条未处理的记录,但核心问题是得在获取记录后立刻给它们做标记,不然下次查询还是可能选中同样的行。Access的临时记录锁定在会话结束后会自动释放,所以用字段标记的方式才是最靠谱的,给你两个可行方案:
方案一:复用现有Checked_By字段标记(推荐)
这个方案直接用你已经有的Checked_By字段,在获取记录的同时更新它,确保后续查询不会再选中这些行。你需要写一段VBA代码来完成“查询+标记”的联动操作(单纯的SELECT查询做不到修改记录):
- 按
Alt + F11打开Access的VBA编辑器,在对应模块里添加这段代码:
Sub AssignTwoReferrals() Dim db As DAO.Database Dim rs As DAO.Recordset Dim strSQL As String Dim currentUser As String ' 获取当前要标记的用户(可以从表单文本框取,或者用系统用户名) currentUser = Forms!Referrals_Checked!txtCurrentUser ' 假设你有个存当前用户的文本框 ' 要是没有表单控件,也可以用系统用户名:currentUser = Environ("USERNAME") ' 先查询出要选中的2条记录的ID(和你的原查询逻辑一致,只取ID方便后续更新) strSQL = "SELECT TOP 2 ID FROM Referrals_Checked " & _ "WHERE Checked_By Is Null AND TEAM_Code = " & Forms!Referrals_Checked!Combo49 & _ " ORDER BY Rnd(-Timer() * ID)" ' 加Timer让随机更靠谱,避免重复 Set db = CurrentDb() Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) ' 循环给选中的记录打标记 Do While Not rs.EOF rs.Edit rs!Checked_By = currentUser rs.Update rs.MoveNext Loop ' 清理对象 rs.Close Set rs = Nothing Set db = Nothing MsgBox "成功分配2条记录!" End Sub
在你的表单上加个按钮,把按钮的点击事件绑定到这个
AssignTwoReferrals过程就行——用户一点击,就自动完成“选记录+标记”的操作。之后你原来的查询就能正常用了,因为被标记的记录
Checked_By不再是Null,会自动被排除在外。
方案二:新增专属标记字段实现“锁定”
要是不想改动Checked_By字段,也可以给表加个专门的标记字段:
打开
Referrals_Checked的表设计,新增一个字段:- 字段名:
Is_Assigned - 数据类型:是/否(默认值设为
No)
- 字段名:
修改VBA代码里的查询和更新逻辑:
Sub AssignTwoReferrals() Dim db As DAO.Database Dim rs As DAO.Recordset Dim strSQL As String strSQL = "SELECT TOP 2 ID FROM Referrals_Checked " & _ "WHERE Checked_By Is Null AND TEAM_Code = " & Forms!Referrals_Checked!Combo49 & _ " AND Is_Assigned = False ORDER BY Rnd(-Timer() * ID)" Set db = CurrentDb() Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) Do While Not rs.EOF rs.Edit rs!Is_Assigned = True ' 还可以顺便记录分配时间:rs!Assigned_Date = Now() rs.Update rs.MoveNext Loop rs.Close Set rs = Nothing Set db = Nothing MsgBox "成功分配2条记录!" End Sub
- 记得把你原来的查询条件加上
AND Is_Assigned = False,确保只选没被标记的记录。
为啥单纯的SELECT查询搞不定?
Access的SELECT查询只是读取数据,不会修改记录状态,而且临时锁定的记录在关闭查询或者退出会话后就会解锁,根本没法持久化“不让重复选”的需求。所以必须结合更新操作,给选中的记录打上“已分配”的标记,这样后续查询才会自动跳过它们。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

