Office中国论坛/Access中国论坛

标题: [求助]关于自动编号的问题 [打印本页]

作者: mayans    时间: 2006-5-5 22:30
标题: [求助]关于自动编号的问题
又要问自动编号的问题了,这个问题我翻了很久的资料一点线索都没有

我们在使用数据库过程中不可避免的会删除一些记录,所以已经删除的记录的编号会空出来

怎么样把这些空出来的编号在自动编号的也自动添加进去


作者: andymark    时间: 2006-5-6 06:48
关于这个方面,论坛有很多。若实现你的功能

建议数据类型不要用自动编号,编号采用合成就很容易实现了






作者: mayans    时间: 2006-5-7 17:42
不好意思,可能是我说的不够明白,关于自动编号添加断号是有很多例子的

我的编号是用来给我的DVD影片编号的格式如:BBVDS-D5-0001-2P/LCH

代表的含义分别是  库名称-碟片类型-连续编号-碟片数量/提供者 如过这部影片只有一张碟就省略-2P这段

所以我的编号最终会产生象下面这些编号

BBVDS-D5-0001-2P/LCH

BBVDS-D5-0002/ABC

BBVDS-D9-0001/LCH

BBVDS-D9-0002-3P/XYZ

BBVDS-D9-0003-2P/LCH

BBVDS-D9-0004/LCH

象这样的情况如果BBVDS-D9-0003这个编号没有了,怎么在自动生成编号的时候把他加进去


作者: 情比金坚    时间: 2006-5-7 18:03
自编一个小函数就可以搞掂,你发个小实例上来,帮你做
作者: tz-chf    时间: 2006-5-7 18:12
那就不要用自动编号,最好分成几个字段,显示时连起来。

关于0001、0002,建议建一张表

文本   是/否

0001    true

0002    false

...

先生成这张表(可先填入1000条),是否字段记录使用情况,使用过的编号为true,录入时到这张表选一个最小的未用的编号,取消的编号更新这张表为false,……

我做过一个文件档案数据库就是这样的,比这个要复杂一点,有mdb和adp版的,云南的那位还没付钱,现在不便公开。
作者: andymark    时间: 2006-5-7 18:23
你可以另建一个窗体,直接合成编号,也可以编一个函数,在增加时检查是否有缺号.

有就补,没有就增加
作者: mayans    时间: 2006-5-7 18:42
我的例子,本来我已经写了自动编号代码,不过太混乱,怕你看起来头痛,我就删了[attach]17598[/attach]

作者: leaderzhu    时间: 2006-5-7 23:53
新人  凑字凑字
作者: andymark    时间: 2006-5-8 05:04
把你编号规则说出来,下面都代表什么

BBVDS-D5-0001-2P/LCH



BBVDS-D5-0002/ABC



BBVDS-D9-0001/LCH



BBVDS-D9-0002-3P/XYZ



BBVDS-D9-0003-2P/LCH



BBVDS-D9-0004/LCH
作者: mayans    时间: 2006-5-8 17:38
库名称-碟片类型-连续编号-碟片数量/提供者 如这部影片只有一张碟就省略-2P这段

Dim a, intIndex As Integer
For intIndex = 1 To CInt(Right(Left(DMax("[影片编号]", "[影片表]", "[影片编号] Like 'BBVDS-D5" & "*'"), 13), 4))
If IsNull(DLookup("[影片编号]", "[影片表]", "CInt(Right(Left(影片表.影片编号, 13), 4)) = intIndex" _
And "[影片表].[影片编号] Like 'BBVDS-D5" & "*'")) Then
a = intIndex
Exit For
End If
Next intIndex
Me.影片编号.Value = "BBVDS-D5" & Format(a, "0000")

我昨天尝试写了这么一段,想把前面是BBVDS-D5的断号找出来,不过我好像写的不对
作者: andymark    时间: 2006-5-8 19:14
不了解你的编号规则,无法写完整的函数,下面的代码只是以BBVDS-D5为例子,其他的可以参照修改

Dim Sql As String
Dim StrNo As String
Dim Rs As New ADODB.Recordset

Sql = "select * from 影片表  where left([影片编号],8)='BBVDS-D5'ORDER BY 影片表.影片编号"
Rs.Open Sql, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
i = 0
Do While Not Rs.EOF
   If Mid(Rs.Fields("影片编号"), 10, 4) - i = 1 Then
   i = Mid(Rs.Fields("影片编号"), 10, 4)
Else
   i = i + 1    '填补缺号
GoTo AA
End If

Rs.MoveNext
Loop
i = i + 1       '直接增加

AA:
StrNo = "BBVDS-D5" & Format(i, "0000")
MsgBox StrNo


Set Rs = Nothing

作者: LucasLynn    时间: 2006-5-9 00:45
以下是引用mayans在2006-5-7 9:42:00的发言:


不好意思,可能是我说的不够明白,关于自动编号添加断号是有很多例子的

我的编号是用来给我的DVD影片编号的格式如:BBVDS-D5-0001-2P/LCH

代表的含义分别是  库名称-碟片类型-连续编号-碟片数量/提供者 如过这部影片只有一张碟就省略-2P这段

所以我的编号最终会产生象下面这些编号

BBVDS-D5-0001-2P/LCH

BBVDS-D5-0002/ABC

BBVDS-D9-0001/LCH

BBVDS-D9-0002-3P/XYZ

BBVDS-D9-0003-2P/LCH

BBVDS-D9-0004/LCH

象这样的情况如果BBVDS-D9-0003这个编号没有了,怎么在自动生成编号的时候把他加进去





你的问题可以分解为两个问题:

1、组合编号

2、自动编号

可以在表中使用一个自动编号,然后通过查询来实现组合编号。

自动编号的连续问题,请参考下帖:

http://www.office-cn.net/forum.php?mod=viewthread&tid=32310
作者: mayans    时间: 2006-5-10 17:14
先谢谢你的帮忙,不过很奇怪,如果我把代码该成下面这段,就不能用了,我断点查过 dvdtype的值也是BBVDS-D5 ,这样改跟原来的有什么区别吗?



Private Sub Command78_Click()
Dim Sql As String
Dim StrNo As String
Dim Rs As New ADODB.Recordset
Dim dvdtype As String
dvdtype = "BBVDS-D" & Mid(盘片格式.Value, 3, 1)
Sql = "select * from 影片表  where left([影片编号],8)='dvdtype' ORDER BY 影片表.影片编号"
Rs.Open Sql, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
i = 0
Do While Not Rs.EOF
   If Mid(Rs.Fields("影片编号"), 10, 4) - i = 1 Then
   i = Mid(Rs.Fields("影片编号"), 10, 4)
Else
   i = i + 1    '填补缺号
GoTo AA
End If

Rs.MoveNext
Loop
i = i + 1       '直接增加

AA:
StrNo = dvdtype & "-" & Format(i, "0000")
MsgBox StrNo


Set Rs = Nothing


End Sub

作者: andymark    时间: 2006-5-10 17:47
试试:

Sql = "select * from 影片表  where left([影片编号],8)='" & dvdtype & "' ORDER BY 影片表.影片编号"
作者: mayans    时间: 2006-5-10 22:46
嘿嘿,终于搞定,太谢谢你们了




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3