access自动编号怎么解除_access 排序后怎么重新自动编号

展开全部

'============================================================================================================================

'-函数名称: AutoNum

'-功能636f707962616964757a686964616f31333337393031描述: 具有断号重续功能的自动编号函数,支持文本型和长整型数值的自动编号

'-输入参数: 参数1:TableName 必需的,表名

' 参数2:FieldName 必需的,自动编号字段名

' 参数3:Prefixal 可选的,编号前缀,编号字段数据类型为文本时才起作用

' 参数4:Digit 可选的(文本型编号时为必需),文本型编号位数(不包含前缀的)

' 参数5:SerialNumber 可选的,设为true时使用断号重续,设为false时不理会断号,只在已有最大编号上加1

'-其它说明: 使用文本型自动编号时,如果记录数目可能会比较大时,建议使用含有日期的前缀或将编号位数设大一些,否则如果达到编号

' 上限将不能添加记录

'

'-使用注意: 调用的自动编号字段必须设置唯一索引,并且不能允许为空,最好是作为主键使用

'-返回参数: 正常情况下返回从1开始的最小断号,如无断号返回最大号加1;出错时返回Null

'-兼 容 性: 字段的数据类型必须为文本型或者长整型数值,如设成其它均会只返回Null

'-使用示例: Me.OrderID.DefaultValue="""" & AutoNum("Orders","OrderID","OD" & Format(Date(),"yyyymm"),5) & """"

' 返回值:OD19910100001,OD19910100002,OD19910400001,……

'-相关调用:

'-作 者: 红尘如烟

'-创建日期: 20010-4-25

'=============================================================================================================================

Function AutoNum(TableName As String, FieldName As String, _

Optional Prefixal As String, Optional Digit As Integer, _

Optional SerialNumber As Boolean = False) As Variant

On Error GoTo Err_AutoNum

Dim strSQL As String

Dim intDataType As Integer

Dim rst As DAO.Recordset

Dim strErrMsg As String

Dim intI As Integer

Dim strExpr As String

If TableName = "" Or FieldName = "" Then Err.Raise 3265

If TableName Like "[[]*]" Then TableName = Mid$(TableName, 2, Len(TableName) - 2)

If FieldName Like "[[]*]" Then FieldName = Mid$(FieldName, 2, Len(FieldName) - 2)

strExpr = Prefixal

strExpr = Replace(strExpr, "'", "''")

intDataType = CurrentDb.TableDefs(TableName).Fields(FieldName).Type

If intDataType = 10 Then

If Digit < 1 Then Err.Raise 1, , "文本型自动编号的编号位数不能小于1位。"

If SerialNumber Then

strSQL = "SELECT (Right([" & FieldName & "]," & Digit & ")+0) AS Expr1000 FROM [" & TableName & "] " & _

"WHERE Left([" & FieldName & "]," & Len(Prefixal) & ")= '" & strExpr & "' " & _

"ORDER BY (Right([" & FieldName & "]," & Digit & ")+0);"

Else

strSQL = "SELECT Max(Right([" & FieldName & "]," & Digit & ")+0) AS Expr1000 FROM [" & TableName & "] " & _

"WHERE Left([" & FieldName & "]," & Len(Prefixal) & ")= '" & strExpr & "';"

End If

ElseIf intDataType = 4 Then

If SerialNumber Then

strSQL = " SELECT [" & FieldName & "] AS Expr1000 FROM [" & TableName & "] ORDER BY [" & FieldName & "];"

Else

strSQL = " SELECT Max([" & FieldName & "]) AS Expr1000 FROM [" & TableName & "];"

End If

Else

Err.Raise 2, , "不支持此数据类型的自动编号。"

End If

' Debug.Print strSQL

Set rst = CurrentDb.OpenRecordset(strSQL)

If rst.RecordCount = 0 Then

AutoNum = 1

Else

If SerialNumber Then

rst.MoveLast

If rst!Expr1000 = rst.RecordCount Then

AutoNum = rst.RecordCount + 1

Else

rst.MoveFirst

For intI = 1 To rst.RecordCount

If rst!Expr1000 <> intI Then

AutoNum = intI

Exit For

Else

rst.MoveNext

End If

Next

End If

Else

AutoNum = Nz(rst!Expr1000, 0) + 1

End If

End If

If intDataType = 10 Then

If Len(AutoNum) > Digit Then

Err.Raise 3, , "自动编号已达最大上限,不能再添加记录。"

Else

AutoNum = Prefixal & Format$(AutoNum, String$(Digit, "0"))

End If

End If

Exit_AutoNum:

Set rst = Nothing

Exit Function

Err_AutoNum:

AutoNum = Null

Select Case Err

Case 3265

strErrMsg = "指定的表名或字段名不存在。"

Case Else

strErrMsg = Err.Description

End Select

MsgBox "#" & Err & vbCrLf & strErrMsg, vbCritical, "自动编号函数出错"

Resume Exit_AutoNum

End Function

转至《Office中国论坛》

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值