Vba DMax数序列固定间隙
我有这个功能,它试图自动排序一个数字,从数字8000开始,数字种子回到8000每天。该功能还尝试确保没有间隙,因此,如果存在手动输入,且该数字产生间隙,则该字段将不会从手动输入开始排序。但我似乎无法让代码工作,因为它只是停留在与前一个条目相同的数字上,并且没有增加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
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…会导致编译错误。