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

发布网友

我来回答

3个回答

热心网友

需要用sql语句来处理。

比如原表数据如下:

现在要按出生日期从早到晚排列,并给出序号:

sql语句如下:

select t.* from
(select t1.*,(select count(*)+1 from 表2 as t2 where t2.出生日期<t1.出生日期) as 序号 from 表2 as t1) as t
order by 序号;

结果

热心网友

先新增一个编号字段, 用vba打开记录集, 按事件排序, 做循环, 对编号字段赋值, 然后在表设计里把这个字段改成自动编号字段

热心网友

'============================================================================================================================
'-函数名称: AutoNum
'-功能描述: 具有断号重续功能的自动编号函数,支持文本型和长整型数值的自动编号
'-输入参数: 参数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中国论坛》

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com