以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [分享] 新版《网络环境下复杂的不重复编号》  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=26913)

--  作者:程兴刚
--  发布时间: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编辑过]

--  作者:blackzhu
--  发布时间:2012/12/17 13:40:00
--  
保留着   大有用场.
--  作者:hanxuntx
--  发布时间:2012/12/17 13:45:00
--  

呵呵,好贴。


--  作者:狐狸爸爸
--  发布时间:2012/12/17 13:57:00
--  

顶老程


--  作者:sunsenfeng
--  发布时间:2012/12/17 14:04:00
--  

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


--  作者:lin_hailun
--  发布时间:2012/12/17 14:13:00
--  
 不错,编号回收这个确实不错。顶一下。
--  作者:程兴刚
--  发布时间:2012/12/17 15:00:00
--  
以下是引用sunsenfeng在2012-12-17 14:04:00的发言:

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

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

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


--  作者:blackzhu
--  发布时间:2012/12/24 7:31:00
--  
老大 给个精华!
--  作者:程兴刚
--  发布时间:2012/12/24 17:00:00
--  
以下是引用blackzhu在2012-12-24 7:31:00的发言:
老大 给个精华!

 

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