我有一个名为 user 的表的.mdb数据库。 在此表中有一些记录,如
User00001
User00002
User00005
User99999
如何找到下一个空闲号码(User00003)?
我返回一组用户名。
我的意见是我可以使用类似的东西 首先使用右(5) 最大用户99999
删除用户但现在呢?
我可以使用:
Dim MyNumber as integer
Dim SQL as Collection
Dim iCtr as Integer
Set SQL = SqlQuery(„Select username from user“) **my queryfunction**
For myNumber = 00001 to 99999
For iCtr = 1 To SQL.count
If Right(SQL(iCtr),5) = MyNumber Then
MsgBox myData(iCtr)
Exit For
End If
Next
Next
这就是我的想象 问题是myNumber不能是5位数吧? 也许完全错了。
感谢您的帮助!
答案 0 :(得分:1)
尝试这个小的用户定义函数:
Public Function NextFree(rng As Range) As String
Dim arr
ReDim arr(1 To rng.Count)
i = 1
For Each r In rng
arr(i) = CLng(Mid(r.Value, 5))
i = i + 1
Next r
For i = 2 To UBound(arr)
If arr(i) <> arr(i - 1) + 1 Then
NextFree = "User" & Format(arr(i - 1) + 1, "00000")
Exit Function
End If
Next i
NextFree = "User" & Format(arr(UBound(arr)) + 1, "00000")
End Function
答案 1 :(得分:1)
您可以尝试在SQL中执行整个操作,使用[Username]+1
到[Username]
的反连接,并获取[Username]+1
未加入[Username]
的第一个值}:
Set SQL = SqlQuery("SELECT TOP 1 a.Username " & _
"FROM (Select 'User' + Right('00000'+Cast(1 + Cast(Right(Username,5) AS bigint) As nvarchar(50)),5) AS Username FROM user) AS a " & _
"LEFT OUTER JOIN user As b ON a.Username = b.Username " & _
"WHERE b.Username IS NULL ORDER BY a.Username ASC")
或者,只是SQL:
SELECT TOP 1 a.Username
FROM (Select 'User' + Right('00000'+Cast(1 + Cast(Right(Username,5) AS bigint) As nvarchar(50)),5) AS Username FROM user) AS a
LEFT OUTER JOIN user As b ON a.Username = b.Username
WHERE b.Username IS NULL ORDER BY a.Username ASC
答案 2 :(得分:0)
您可以添加新字段吗?如果是这样,您可以使用下面的第一个查询字符串创建一个新字段并将数据插入更新查询中。如果没有,您可以创建两个新查询。
在第一个查询中,使用以下方式获取用户ID:
UserNum: Right([user].[userID],5)
在第二个查询中,调用第一个查询(或者,如果您创建了一个字段,则调用用户表)并使用以下内容查找下一个数字:
NextID: (Max([myQuery].[UserNum])+1)
然后从VBA运行查询并将变量设置为值:
nextID = CurrentDb.Execute("secondQuery")