在前面有字母的列中查找下一个数字
Finding next number in column preceded by a letter
我已经为某些人创建了一个表单,用于 add/modify 访问 table 中的记录。我需要做的是编写一个函数,在用户添加新记录时自动从列中查找下一个可用数字。
我遇到的问题是我需要递增的列中的数字前面有一个 R 或一个 W,所以我不能只使用 DMax 函数。我正在写一个输入框来询问第一个字符,然后我需要它来搜索最大的数字并为他们提供下一个可用的数字。
例如列有:
R1000
R1001
W1000
R1002
W1001
W1002
R1003
当用户指定 "R" 我需要它 return “1004” 作为下一个可用的。
编辑:因此,由于我有一个有效的代码,因此可能需要将其移至其他类别。我只是不知道这是否是最有效的:
Dim MaxValue As Integer
Dim db As dao.Database
Dim rs As dao.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT GlobalAcct FROM TestTable")
rs.MoveLast
rs.MoveFirst
MaxValue = 0
Do While Not rs.EOF
If MaxValue = 0 Or CInt(Right(rs!GlobalAcct, 4)) > MaxValue Then
MaxValue = CInt(Right(rs!GlobalAcct, 4))
End If
rs.MoveNext
Loop
MaxValue = MaxValue + 1
Debug.Print MaxValue
这是一个函数,它将 return 代表以您传入的任何字母开头的最大帐户的 long。
Public Function GetLastAccount(ByVal sPrefix As String) As Long
Dim rs As ADODB.Recordset
Dim aSql(1 To 4) As String
aSql(1) = "SELECT TOP 1 Val(Right(GlobalAcct,Len(GlobalAcct)-1)) As NumAct"
aSql(2) = "FROM TestTable"
aSql(3) = "WHERE Left(GlobalAcct,1)='" & sPrefix & "'"
aSql(4) = "ORDER BY GlobalAcct DESC"
Set rs = New ADODB.Recordset
rs.Open Join(aSql, Space(1)), Application.CurrentProject.Connection
GetLastAccount = rs.Fields("NumAct").Value
End Function
正在使用:
?getlastaccount("R")
1003
?getlastaccount("w")
1002
然后你可以加1或任何你想做的。
SQL 语句是 SELECT TOP 1
和 ORDER BY DESC
- 这就是您获得最大值的方式,您不必 return 或浏览巨大的记录集。
Val
和Right
函数用于隔离账户的数字部分。有很多假设,包括帐户以您想要忽略的单个字符开头,其余字符是数字,并且您永远不会传入至少一条记录为 returned 的字符。但是你可以算出这些细节。
我已经为某些人创建了一个表单,用于 add/modify 访问 table 中的记录。我需要做的是编写一个函数,在用户添加新记录时自动从列中查找下一个可用数字。
我遇到的问题是我需要递增的列中的数字前面有一个 R 或一个 W,所以我不能只使用 DMax 函数。我正在写一个输入框来询问第一个字符,然后我需要它来搜索最大的数字并为他们提供下一个可用的数字。
例如列有:
R1000
R1001
W1000
R1002
W1001
W1002
R1003
当用户指定 "R" 我需要它 return “1004” 作为下一个可用的。
编辑:因此,由于我有一个有效的代码,因此可能需要将其移至其他类别。我只是不知道这是否是最有效的:
Dim MaxValue As Integer
Dim db As dao.Database
Dim rs As dao.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT GlobalAcct FROM TestTable")
rs.MoveLast
rs.MoveFirst
MaxValue = 0
Do While Not rs.EOF
If MaxValue = 0 Or CInt(Right(rs!GlobalAcct, 4)) > MaxValue Then
MaxValue = CInt(Right(rs!GlobalAcct, 4))
End If
rs.MoveNext
Loop
MaxValue = MaxValue + 1
Debug.Print MaxValue
这是一个函数,它将 return 代表以您传入的任何字母开头的最大帐户的 long。
Public Function GetLastAccount(ByVal sPrefix As String) As Long
Dim rs As ADODB.Recordset
Dim aSql(1 To 4) As String
aSql(1) = "SELECT TOP 1 Val(Right(GlobalAcct,Len(GlobalAcct)-1)) As NumAct"
aSql(2) = "FROM TestTable"
aSql(3) = "WHERE Left(GlobalAcct,1)='" & sPrefix & "'"
aSql(4) = "ORDER BY GlobalAcct DESC"
Set rs = New ADODB.Recordset
rs.Open Join(aSql, Space(1)), Application.CurrentProject.Connection
GetLastAccount = rs.Fields("NumAct").Value
End Function
正在使用:
?getlastaccount("R")
1003
?getlastaccount("w")
1002
然后你可以加1或任何你想做的。
SQL 语句是 SELECT TOP 1
和 ORDER BY DESC
- 这就是您获得最大值的方式,您不必 return 或浏览巨大的记录集。
Val
和Right
函数用于隔离账户的数字部分。有很多假设,包括帐户以您想要忽略的单个字符开头,其余字符是数字,并且您永远不会传入至少一条记录为 returned 的字符。但是你可以算出这些细节。