Office中国论坛/Access中国论坛

标题: 自定义的自动编号问题求助!!! [打印本页]

作者: tsweiwei    时间: 2009-1-8 20:09
标题: 自定义的自动编号问题求助!!!
我做的很久的一个自动编号的例子,能自动生成有一个“yyyymmdd-xx”,xx是两位数的编号,
     但是有一个缺陷是:
     在多人使用时,在有人录入时,自动生成的编号有重复,比如:有一个人正在录入假设生成的编号是20090108-12,在这个人录入的同时,另外一个人也登录录入,自动生成的编号也是20090108-12,本应该是20090108-13
     谁能帮忙解决一下吗?

案件录入窗体插入前编码如下:
d = DLookup("inum", "编号", "date =#" & Format(Date, "yyyy/mm/dd") & "#")
If IsNull(d) Then  '若找不到
    Set d1 = CurrentDb.OpenRecordset("编号")
    d1.AddNew   '新增
    d1("date") = Date
    d1("inum") = 0
    d1.Update
    d = 0
End If
Me![编号] = Format(Date, "yyyymmdd") & "-" & Format(d + 1, "00") '加1后显示

案件录入窗体更新前编码如下:
If Me.NewRecord = True Then  '若为新记录
    Set b = CurrentDb.OpenRecordset("select * from 编号 where date =#" & _
         Format(Date, "yyyy/mm/dd") & "#") '取得今日编号记录
    X = Right(Me![编号], 2)
    b.Edit
    b("inum") = CInt(X)   '回存目前使用编号
    b.Update
End If


[attach]34389[/attach]

[ 本帖最后由 tsweiwei 于 2009-1-8 20:50 编辑 ]
作者: 青苹    时间: 2009-1-8 20:57
可以在保存窗体的时候,进行自动编号
作者: yagi    时间: 2009-1-8 22:00
标题: 详解
只需要将这条语句修改下一个参数:
Set b = CurrentDb.OpenRecordset("select * from 编号 where date =#" &  Format(Date, "yyyy/mm/dd") & "#") '取得今日编号记录
改为:
Set b = CurrentDb.OpenRecordset("select * from 编号 where date =#" &  Format(Date, "yyyy/mm/dd") & "#",dbOpenDynamic,dbSeeChanges ) '取得今日编号记录
关于OpenRecordset函数的说明:
1、语法:
object.OpenRecordset (source, type, options, lockedits)
2、关于OPENRECORDSET函数的参数说明:
(1) object表示应用于:database,dynaset_type,querydef,recordset,snapshot_type   recordset,table_type   recordset,tabledef,connection 等对象  
(2)source表示要打开的记录集名称;
(3)type表示打开的记录集类型;
  该参数可以用如下值:
dbOpenTable 表示打开一个表类型的记录集对象(仅JET数据引擎使用)
dbOpenDynamic 打开一个类似于ODBC动态游标的动态记录集对象(仅ODBC工作空间可用)
dbOpenDynaset 打开一个类似于ODBC动态KEYSET动态游标的动态类型的记录集
dbOpenSnapshot 打开一个类似于静态游标的快照类型的记录集
dbOpenForwardOnly  打开一个仅向前类型的记录集  
(4)options是一个符号常量,用于指定打开的记录集的特性;
  该参数可以用如下值:
dbAppendOnly  允许在记录集上添加新记录,但不允许编辑和删除已存在的记录;(仅对动态集)
dbReadOnly  禁止用户对记录集进行修改;(仅对Microsoft Jet工作区)
dbSeeChanges  如果一个用户要修改的是另一个用户正在编辑的数据,将产生一个运行时错误;(仅用于Microsoft Jet动态集类型的记录集)
dbDenyWrite  禁止其他用户修改或者添加记录;(仅用于Microsoft Jet类型对象)
dbDenyRead  禁止其他用户读表中的数据;(仅用于Microsoft Jet表类型的记录集)
dbForwardOnly  建立仅向前快照;
dbSQLPassThrough  如果SOURCE是SQL语句,则将SQL语句传递到ODBC数据库进行处理;(仅用于快照)
dbConsistent  只允许一致的更新;
dbInconsistent  允许不一致的更新;
(5)lockedits是一个符号常量,用来控制对记录集的锁定
  该参数可以用如下值:
dbReadOnly     禁止用户对记录集进行修改;
dbPessmistic   在多用户环境中,用保守式锁定来决定修改记录集的方式,一旦使用edit方法,则立即锁定正在编辑的记录所在页;
dbPessmistic   在多用户环境中,用开放式锁定来决定修改记录集的方式,在执行Update前不锁定记录所在页;   
dbOptimisticValue 使用基于行值而非行IDs的优化并发,仅用于ODBCDirect数据源。
作者: tsweiwei    时间: 2009-1-8 22:14
标题: 回复 3# 的帖子
不管用啊
作者: yagi    时间: 2009-1-10 10:50
能说详细点吗?
作者: todaynew    时间: 2009-1-10 11:11
这是抢号问题
作者: tsweiwei    时间: 2009-1-10 11:12
标题: 回复 5# 的帖子
我的库输入每条记录时自动生成编号格式为yyyymmdd-xx,例如:2009年1月10日添加新记录第一条编号就是20090110-01,第二条就是20090110-02,第三条就是20090110-03依此类推,当单机用时没有问题,但多人使用时(都链接相同的表)就出现上述编号重复的问题,问题如下:
  多人同时录入时,假设编号20090110-03的记录正在录入(没有关闭录入窗口),此时又有一个人链接到数据库也添加记录,此时他那边生成的编号应该是20090110-04,但实际是20090110-03。
  你提供的办法只提示错误,不能保存。
作者: tsweiwei    时间: 2009-1-10 11:14
标题: 回复 6# 的帖子
有解决办法吗?
作者: todaynew    时间: 2009-1-10 11:21
原帖由 tsweiwei 于 2009-1-10 11:14 发表
有解决办法吗?

具体怎么解决我不大会,不过从思路上看,无非几个办法:
1、任何人触发编号程序,则对其他人关闭编号程序;
2、触发编号程序,立刻编号;
3、建立临时编号,比较无重复则保存,比较有重复则自动重新编号。
作者: tanhong    时间: 2009-1-11 01:27
你可以将编号字段设定为主索引,属性中设定:无重复。我想就应该可以解决问题了
作者: tsweiwei    时间: 2009-1-11 23:39
标题: 回复江羽!!!
我试过将编号字段设定为主索引,属性中设定:无重复,但是只出现提示如下:
[attach]34463[/attach]

我想让系统在多人使用时自己识别出正在用的那个20090110-03,然后将20090110-04自动添到编号里面去!还有别的方法吗?




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