设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 3633|回复: 10
打印 上一主题 下一主题

[窗体] 自定义的自动编号问题求助!!!

[复制链接]
跳转到指定楼层
1#
发表于 2009-1-8 20:09:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我做的很久的一个自动编号的例子,能自动生成有一个“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




[ 本帖最后由 tsweiwei 于 2009-1-8 20:50 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2009-1-8 20:57:37 | 只看该作者
可以在保存窗体的时候,进行自动编号
3#
发表于 2009-1-8 22:00:46 | 只看该作者

详解

只需要将这条语句修改下一个参数:
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数据源。
4#
 楼主| 发表于 2009-1-8 22:14:58 | 只看该作者

回复 3# 的帖子

不管用啊
5#
发表于 2009-1-10 10:50:15 | 只看该作者
能说详细点吗?
6#
发表于 2009-1-10 11:11:14 | 只看该作者
这是抢号问题
7#
 楼主| 发表于 2009-1-10 11:12:29 | 只看该作者

回复 5# 的帖子

我的库输入每条记录时自动生成编号格式为yyyymmdd-xx,例如:2009年1月10日添加新记录第一条编号就是20090110-01,第二条就是20090110-02,第三条就是20090110-03依此类推,当单机用时没有问题,但多人使用时(都链接相同的表)就出现上述编号重复的问题,问题如下:
  多人同时录入时,假设编号20090110-03的记录正在录入(没有关闭录入窗口),此时又有一个人链接到数据库也添加记录,此时他那边生成的编号应该是20090110-04,但实际是20090110-03。
  你提供的办法只提示错误,不能保存。
8#
 楼主| 发表于 2009-1-10 11:14:54 | 只看该作者

回复 6# 的帖子

有解决办法吗?
9#
发表于 2009-1-10 11:21:00 | 只看该作者
原帖由 tsweiwei 于 2009-1-10 11:14 发表
有解决办法吗?

具体怎么解决我不大会,不过从思路上看,无非几个办法:
1、任何人触发编号程序,则对其他人关闭编号程序;
2、触发编号程序,立刻编号;
3、建立临时编号,比较无重复则保存,比较有重复则自动重新编号。
10#
发表于 2009-1-11 01:27:15 | 只看该作者
你可以将编号字段设定为主索引,属性中设定:无重复。我想就应该可以解决问题了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-15 00:50 , Processed in 0.091400 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表