Foxtable(狐表)用户栏目专家坐堂 → [分享] 新版《网络环境下复杂的不重复编号》


  共有17964人关注过本帖树形打印复制链接

主题:[分享] 新版《网络环境下复杂的不重复编号》

帅哥哟,离线,有人找我吗?
程兴刚
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
[分享] 新版《网络环境下复杂的不重复编号》  发帖心情 Post By:2012/12/17 13:17:00 [显示全部帖子]

注:实现了自动补号,删除记录自动回收编号供调用:

 

【后台“编号”表结构截图】:

 
此主题相关图片如下:未命名.jpg
按此在新窗口浏览图片

 

【各事件代码:】

 

一、:DataRowAdding 事件代码:

 

Dim cmd As New SQLCommand
Dim dt As Date
cmd.C
cmd.CommandText = "Select GetDate()"
dt = cmd.ExecuteScalar()
e.DataRow("入库日期")= format(dt,"yyyy-MM-dd")  ‘按照服务器时间设置入库时间,杜绝用户修改系统时间导致事后补单;

 

二、DataRowAdded事件代码:调用后台可用入库,并未下一个用户生成新的备用编号:

 

Dim cmd As New SQLCommand
Dim dt As Date
cmd.C
cmd.CommandText = "Select GetDate()"
dt = cmd.ExecuteScalar() ’之所以重取后台时间,因为是长日期时间格式,已被将来根据用户ID或姓名,加上这个时间,自动生成增删记录,生成文本文件而备用!
Dim dr As DataRow = e.DataRow
Dim pf As String = "RK" & format(dr("入库日期"),"yyyyMMdd") & "-" '设置入库单编号前缀
Dim cmd1 As New SQLCommand
Dim cmd2 As New SQLCommand
Dim Key1,key2 As Integer
Dim nm As String = e.DataTable.name
cmd1.C '设置数据源名称
cmd2.C
cmd1.commandText = "Select Count(*) From [编号] Where [前缀] = '" & pf & "' And 表名 = '" & nm & "' and 已用标识 = 0"
If cmd1.ExecuteScalar = 0 Then '如果编号表不存在前缀的行,那么增加一行
    cmd1.commandtext = "Insert Into 编号 (表名, 日期, 前缀, 顺序号, 已用标识) Values('" & nm & "','" & dt & "','" & pf & "',1,0)"
    cmd1.ExecuteNonQuery
End If
cmd1.CommandText = "Select Min(顺序号) From {编号} Where 表名 = '" & nm & "' and 前缀 = '" & pf & "' and 已用标识 = 0 Or 已用标识 Is Null"
key1 = cmd1.ExecuteScalar()

cmd1.CommandText = "Select Max(顺序号) From {编号} Where 表名 = '" & nm & "' and 前缀 = '" & pf & "' and 已用标识 = 0"
key2 = cmd1.ExecuteScalar()
cmd1.commandText = "Update [编号] Set [已用标识] = 1 Where [顺序号] = " & Key1 & " And [前缀] = '" & pf & "' And 表名 = '" & nm & "'"
cmd1.ExecuteNonQuery()
If key1 = key2
    cmd1.commandtext = "Insert Into 编号 (表名, 日期, 前缀, 顺序号, 已用标识) Values('" & nm & "','" & dt & "','" & pf & "'," & key2+1 & ",0)"
    cmd1.ExecuteNonQuery
End If
cmd1.CommandText = "DELETE FROM {编号} Where 表名 = '" & nm & "' and 前缀 = '" & pf & "' and 顺序号 = " & key1 & "And 已用标识 = 1"
cmd1.ExecuteNonQuery()
Dim dr1 As DataRow = DataTables("sys_系统设置").find("[设置名称] = '出库单编号位数'")
If dr1 Is Nothing
    dr1 = DataTables("sys_系统设置").AddNew()
    dr1("设置名称") = "入库单编号位数"
    dr1("设置值") = 5
End If
Dim a As Byte = dr1("设置值")
Dim s As String = Format(Key1,"00000000000000000000")
e.DataRow("入库单编号") = pf & s.SubString(s.Length - a)

 

三、BeforeDeleteDataRow事件代码:【删除记录时,回收编号到后台】

 

Dim cmd As New SQLCommand
Dim dt As Date
cmd.C
cmd.CommandText = "Select GetDate()"
dt = cmd.ExecuteScalar()
Dim dr As DataRow = e.DataRow
Dim dh As String = dr("入库单编号")
Dim pf As String = dh.Split("-")(0) & "-"
Dim Key As Integer = val(dh.Split("-")(1))
Dim nm As String = e.DataTable.name
cmd.commandtext = "Insert Into 编号 (表名, 日期, 前缀, 顺序号, 已用标识) Values('" & nm & "','" & dt & "','" & pf & "'," & key & ",0)"
cmd.ExecuteNonQuery

 

四、AfterOpenProject事件

(加上这一段代码,保证以后每次启动时,自动删除今天以前的后台可用编号<如果您的编号是按月编码,改成删除本月以前的后台可用编号即可>,避免后台数据库膨胀。

 

 

Dim dt As Date
cmd.C
cmd.CommandText = "Select GetDate()"
dt = cmd.ExecuteScalar()
cmd.C '设置数据源名称
dt = "#" & format(dt,"yyyy-MM-dd") & " 00:00:00.000#"
cmd.CommandText = "DELETE FROM {编号} Where 日期 < '" & dt & "'"
cmd.ExecuteNonQuery()

 

 

     【说明】:培训操作人,下班前尽量不要从尾行以前删除记录,因为已经回收了的编号没有被得到再次启用,这样的断号是没办法解决的。

 

删号再新增记录优先补号效果截图(顺序不对不用担心,填写完所有记录,打印报表前按照编号、入库日期排序即可):

 
此主题相关图片如下:未命名.jpg
按此在新窗口浏览图片

[此贴子已经被作者于2012-12-17 13:26:36编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2012/12/17 15:00:00 [显示全部帖子]

以下是引用sunsenfeng在2012-12-17 14:04:00的发言:

按觉着这样不好,号码虽回收利用了,但没有了先后次序,就好像是身份证,人死了,号码就废了,如果在顶上新人,任复活了还是人没死,不好判断

1、这跟死不死的没关系,压根儿就是刚生没有户口,关键是随手删除再添加记录是太常见了,对于一个完全没有真正成立的记录的编号,再补充进来是合理的,否则,生成纸版的报表对帐时显得不方便! 2、顺序不对不是可以排序的吗?

 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2012/12/24 1:36:00 [显示全部帖子]

不知道是需求不大,还是真的没有实用性,再顶一下!


 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2012/12/24 17:00:00 [显示全部帖子]

以下是引用blackzhu在2012-12-24 7:31:00的发言:
老大 给个精华!

 

呵呵,这个应该还达不到精华标准,不用给精华的!


 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2012/12/26 0:55:00 [显示全部帖子]

其实这就是系统设置表,看完这张窗口和表的截图,您就会明白了:


图片点击可在新窗口打开查看此主题相关图片如下:未命名.jpg
图片点击可在新窗口打开查看

[此贴子已经被作者于2012-12-26 1:08:05编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2012/12/26 12:45:00 [显示全部帖子]

这个与您的编码规则有关,如果您按日(目前的示例这样),补号也是补当日,如果您按月编号,则按当月补号,总之与编号前缀有关!

 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2013/2/12 18:29:00 [显示全部帖子]

    1、我们大家用EXCEL习惯了添加删除记录,很多时候会因为我们的误操作引起断号,那是操作者确认该数据有效之前的操作,一旦该数据已经提交或者一经审核,这些记录是可以禁止删除的,但在此之前肯定存在添加删除的现象,再比如:企业管理人员指导操作员的演示数据,都会为断号留下隐患。

   2、前缀的问题,个人建议还是要加上,并不是麻烦不麻烦的事,比如:出库单编号和入库单编号,如果不添加前缀的话,将来一旦生成纸版报表,上报后在查阅过程中就不是那么方便,容易混淆!


 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2013/9/29 17:45:00 [显示全部帖子]

以下是引用jspta在2013-9-29 16:20:00的发言:

基础数据应当尽量减少删除的可能性。关于断号的回收感觉还是没必要,他只是个标识,本身没有太大意义。如果有意义,那这样回收岂不是乱套了?

正式保存后在生成编号,能够减少断号的可能性

前缀还是应当加,在做综合查询和输出或其他什么,还是能一眼看出编号不同的,特别是进行合并,这个作用非常明显

删除只是新增数据人员的操作习惯,出做只为杜绝这个坏习惯带来的敝端,如果只有新増者自己本人才有权删除自己的记录,那补号功能就有用了,因为会计帐、材料出入库查帐忌讳缺号,那样会造成人为的材料“假丢失”等一系列管理隐患,查对困难,难预料和判断哪一个断号是人为恶意删除除的!当然,当该记录一旦确认生成(完成打印、通过审核),则应该禁止删除,确实需要删除则需要多人同时确认,那是另一回事!在如上前提面前,自动补号就大有用处了!

 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2015/4/18 12:37:00 [显示全部帖子]

我的方案是:添加一行即生成了编号,删除一行回收编号供下次利用,难道您在添加行操作已经开始的过程中来终止添加行操作?


 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2015/4/19 1:42:00 [显示全部帖子]

二、DataRowAdded事件代码:

 

……

 

’最后一行添加如下代码:

e.datarow.save() '这样就杜绝了使用Tables("登记表").Current.Reject撤销命令,只有删除该行!


 回到顶部
总数 11 1 2 下一页