Vba DMax数序列固定间隙

Vba DMax数序列固定间隙,vba,ms-access,Vba,Ms Access,我有这个功能,它试图自动排序一个数字,从数字8000开始,数字种子回到8000每天。该功能还尝试确保没有间隙,因此,如果存在手动输入,且该数字产生间隙,则该字段将不会从手动输入开始排序。但我似乎无法让代码工作,因为它只是停留在与前一个条目相同的数字上,并且没有增加 Public Function fRetNextInSequence() As Long Dim MyDB As DAO.Database Dim rst As DAO.Recordset Dim rstClone As DAO

我有这个功能,它试图自动排序一个数字,从数字8000开始,数字种子回到8000每天。该功能还尝试确保没有间隙,因此,如果存在手动输入,且该数字产生间隙,则该字段将不会从手动输入开始排序。但我似乎无法让代码工作,因为它只是停留在与前一个条目相同的数字上,并且没有增加

Public Function fRetNextInSequence() As Long
 Dim MyDB As DAO.Database
 Dim rst As DAO.Recordset
 Dim rstClone As DAO.Recordset

 'If there are no Records in tblData, then have the Function return 8000
 If DCount("strSerialNumber", "tblOrderData", "dtmDateOrdered=#" & Date & "#") = 0 Then
   fRetNextInSequence = 8000
     Exit Function
End If

 Set MyDB = CurrentDb
 Set rst = MyDB.OpenRecordset("tblOrderData", dbOpenSnapshot)
 Set rstClone = rst.Clone

 rst.MoveLast        'Move to Last Record [MyNum]
 With rstClone       'Move to Next-to-Last Record [MyNum]
   .MoveLast
   .Move -1          'Clone now at Next-to-Last Record [MyNum]
 End With

 With rst
   Do While Not rstClone.BOF
     If Abs(![strSerialNumber] - rstClone![strSerialNumber]) > 1 Then
       fRetNextInSequence = (rstClone![strSerialNumber] + 1)       'Found the Gap!
         Exit Function
     End If
       .MovePrevious             'Move in sync, 1 Record apart
       rstClone.MovePrevious
   Loop
 End With

 rst.MoveLast

 fRetNextInSequence = (rst![strSerialNumber] + 1)       'No Gap found, return next number in sequence!

 rstClone.Close
 rst.Close
 Set rstClone = Nothing
 Set rst = Nothing
 End Function       

    If SOS = "ES-S" Then
        SerialNbrValue = fRetNextInSequence
        'SerialNbrValue = Val(Nz(DMax("strSerialNumber", "tblOrderData", "dtmDateOrdered=#" & Date & "#"), 7999)) + 1
    Else
        SerialNbrValue = ""
    End If

从循环中退出函数将绕过这些行以关闭和清除记录集对象。这并不是问题的根源,但如果不是每次打开记录集时都使用它们,为什么还要使用它们呢

当我从VBA即时窗口调用函数时,以下修改的过程为我返回了适当的序列:

Public Function fRetNextInSequence() As Long
Dim MyDB As DAO.Database
Dim rst As DAO.Recordset
Dim rstClone As DAO.Recordset

If Nz(DMin("strSerialNumber", "tblOrderData", "dtmDateOrdered=Date()"), 0) <> 8000 Then
    'If there are no Records or the gap is 8000 for current date, Function returns 8000
    fRetNextInSequence = 8000
Else
    Set MyDB = CurrentDb
    Set rst = MyDB.OpenRecordset("SELECT strSerialNumber FROM tblOrderData WHERE dtmDateOrdered=Date() ORDER BY strSerialNumber", dbOpenSnapshot)
    Set rstClone = rst.Clone

    rst.MoveLast        'Move to Last Record [MyNum]
    With rstClone       'Move to Next-to-Last Record [MyNum]
      .MoveLast
      .Move -1          'Clone now at Next-to-Last Record [MyNum]
    End With

    With rst
    Do While Not rstClone.BOF
        If Abs(![strSerialNumber] - rstClone![strSerialNumber]) > 1 Then
            'Found the Gap!
            fRetNextInSequence = (rstClone![strSerialNumber] + 1)
            Exit Do
        End If
        .MovePrevious             'Move in sync, 1 Record apart
        rstClone.MovePrevious
    Loop
    End With

    If fRetNextInSequence = 0 Then
        'No Gap found, return next number in sequence!
        rst.MoveLast
        fRetNextInSequence = (rst![strSerialNumber] + 1)       
    End If
    rstClone.Close
    rst.Close
    Set rstClone = Nothing
    Set rst = Nothing
End If
End Function
公共函数fRetNextInSequence()的长度
Dim MyDB作为DAO.Database
将rst设置为DAO.Recordset
将rstClone设置为DAO.Recordset
如果Nz(DMin(“strSerialNumber”、“tblOrderData”、“dtmDateOrdered=Date()”)为0)8000,则
'如果没有记录或当前日期的间隔为8000,则函数返回8000
fRetNextInSequence=8000
其他的
设置MyDB=CurrentDb
Set rst=MyDB.OpenRecordset(“从tblOrderData中选择strSerialNumber,其中dtmDateOrdered=Date(),按strSerialNumber排序”,dbOpenSnapshot)
设置rstClone=rst.Clone
rst.MoveLast'移动到最后一条记录[MyNum]
使用rstClone'移动到上一条记录的下一条记录[MyNum]
.最后一个
.Move-1'现在克隆到下一个最后一个记录[MyNum]
以
用rst
不使用rstClone.BOF时执行此操作
如果Abs(![strSerialNumber]-rstClone![strSerialNumber])>1,则
“找到了缺口!
fRetNextInSequence=(rstClone![strSerialNumber]+1)
退出Do
如果结束
.MovePrevious“同步移动,间隔1条记录
rstClone.MovePrevious
环
以
如果fRetNextInSequence=0,则
'未找到间隙,按顺序返回下一个数字!
rst.MoveLast
fRetNextInSequence=(rst![strSerialNumber]+1)
如果结束
rstClone,关闭
rst.关闭
设置rstClone=Nothing
设置rst=无
如果结束
端函数

为什么在过程之外显示代码?如果SOS…会导致编译错误。