Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 在前面有字母的列中查找下一个数字_Ms Access_Vba - Fatal编程技术网

Ms access 在前面有字母的列中查找下一个数字

Ms access 在前面有字母的列中查找下一个数字,ms-access,vba,Ms Access,Vba,我已经为一些人创建了一个表单来添加/修改access表中的记录。我需要做的是编写一个函数,当用户添加新记录时,自动从列中查找下一个可用数字 我遇到的问题是,我需要递增的列中的数字前面有R或W,所以我不能只使用DMax函数。我写了一个输入框,要求输入第一个字符,然后我需要它来搜索最大的数字,并给他们下一个可用的 例如,该列具有: R1000 R1001 W1000 R1002 W1001 W1002 R1003 当用户指定“R”时,我需要它返回“1004”作为下一个可用值 编辑:所以,这可能需要

我已经为一些人创建了一个表单来添加/修改access表中的记录。我需要做的是编写一个函数,当用户添加新记录时,自动从列中查找下一个可用数字

我遇到的问题是,我需要递增的列中的数字前面有R或W,所以我不能只使用DMax函数。我写了一个输入框,要求输入第一个字符,然后我需要它来搜索最大的数字,并给他们下一个可用的

例如,该列具有:

R1000
R1001
W1000
R1002
W1001
W1002
R1003
当用户指定“R”时,我需要它返回“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

这里有一个函数,它将返回一个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语句是一个
selecttop1
,具有
orderbydesc
——这就是获得最大值的方式,您不必返回或浏览庞大的记录集


Val
Right
功能用于隔离帐户的数字部分。有很多假设,包括帐户以您希望忽略的单个字符开头,其余字符是数字,并且您永远不会传入至少返回一条记录的字符。但是您可以计算出这些细节。

这里有一个函数,它将返回一个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语句是一个
selecttop1
,具有
orderbydesc
——这就是获得最大值的方式,您不必返回或浏览庞大的记录集


Val
Right
功能用于隔离帐户的数字部分。有很多假设,包括帐户以您希望忽略的单个字符开头,其余字符是数字,并且您永远不会传入至少返回一条记录的字符。但是您可以计算出这些细节。

这里有一个函数,它将返回一个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语句是一个
selecttop1
,具有
orderbydesc
——这就是获得最大值的方式,您不必返回或浏览庞大的记录集


Val
Right
功能用于隔离帐户的数字部分。有很多假设,包括帐户以您希望忽略的单个字符开头,其余字符是数字,并且您永远不会传入至少返回一条记录的字符。但是您可以计算出这些细节。

这里有一个函数,它将返回一个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语句是一个
selecttop1
,具有
orderbydesc
——这就是获得最大值的方式,您不必返回或浏览庞大的记录集


Val
Right
功能用于隔离帐户的数字部分。有很多假设,包括帐户以您希望忽略的单个字符开头,其余字符是数字,并且您永远不会传入至少返回一条记录的字符。但是你可以计算出这些细节。

我唯一的想法是根据第一个字符循环每个项目,将右(值,4)存储在变量中,检查它是否大于下一行,如果不大于-pass,如果是这样的话-更新变量并对每一行执行该操作,但它似乎非常冗余。更好的设计和更简单的过程是使用两个单独的字段,而不是单个字段。一个用于存储文本部分,另一个用于存储数字。然后,只要在需要下一个数字时使用dmax即可。在应用程序中需要显示整个值的任何地方,都可以简单地将两个字段连接起来。将事物连接在一起总是比解析它们更简单。我唯一的想法是根据第一个字符循环每个项目,将右(值,4)存储在一个变量中,检查它是否大于下一行,如果不大于-pass,如果是这样的话-更新变量并对每一行执行该操作,但它似乎非常冗余。更好的设计和更简单的过程是使用两个单独的字段,而不是单个字段。一个用于存储文本部分,另一个用于存储数字。然后,只要在需要下一个数字时使用dmax即可。在应用程序中需要显示整个值的任何地方,都可以简单地将两个字段连接起来。将事物连接在一起总是比解析它们更简单。我唯一的想法是根据第一个字符循环每个项目,将右(值,4)存储在一个变量中,检查它是否大于下一行,如果不大于-pass,如果是这样的话-更新变量并对每一行执行该操作,但它似乎非常冗余。更好的设计和更简单的过程是使用两个单独的字段,而不是单个字段。一个用于存储文本部分,另一个用于存储数字。然后,只要在需要下一个数字时使用dmax即可。在应用程序中需要显示整个值的任何地方,都可以简单地将两个字段连接起来。将事物连接在一起总是比解析它们简单。我唯一的想法是