以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]自动编号BUG  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=108376)

--  作者:积水成渊
--  发布时间:2017/10/21 11:03:00
--  [求助]自动编号BUG
之前做了一个自动编号的功能,因为当时是一个人测试的,没有发现什么问题,后来几个人在使用自动编号这个功能的时候却发现自动编号存在相同的单据编号,这个BUG该如何处理:
以下是部分自动编号的代码:
e.DataRow("日期") = Date.Today()

\'Dim bh As String = Format(e.DataRow("日期"),"yyMMdd") \'取得编号的8位前缀
\'If e.DataRow("单据编号").StartsWith(bh) = False \'如果编号的前8位不符
    \'Dim max As String
    \'Dim idx As Integer
    \'max = e.DataTable.Compute("Max(单据编号)","日期 = #" & e.DataRow("日期") & "# And [_Identify] <> " & e.DataRow("_Identify")) \'取得该天的最大编号
    \'If max > "" Then \'如果存在最大编号
        \'idx = CInt(max.Substring(6,4)) + 1 \'获得最大编号的后三位顺序号,并加1
    \'Else
        \'idx = 1 \'否则顺序号等于1
    \'End If
    \'e.DataRow("单据编号") = bh & "" & Format(idx,"0000")
\'End If

--  作者:有点蓝
--  发布时间:2017/10/21 11:22:00
--  
参考这种用法:http://www.foxtable.com/webhelp/scr/3008.htm
--  作者:hudouzhi
--  发布时间:2017/10/21 12:22:00
--  
把事件改到beforesavedatarow
--  作者:hudouzhi
--  发布时间:2017/10/21 12:23:00
--  
compute改为sqlcompute
--  作者:积水成渊
--  发布时间:2017/10/24 14:39:00
--  
感谢大家的方法
--  作者:gfj7126
--  发布时间:2017/11/8 16:39:00
--  

 这个方法新增一行就保存还是可行的,如果新多行再保存,所有新增行的编号就会是一样的。

 

[此贴子已经被作者于2017/11/8 17:11:10编辑过]

--  作者:有点甜
--  发布时间:2017/11/8 17:29:00
--  
以下是引用gfj7126在2017/11/8 16:39:00的发言:

 这个方法新增一行就保存还是可行的,如果新多行再保存,所有新增行的编号就会是一样的。

 

[此贴子已经被作者于2017/11/8 17:11:10编辑过]

 

不能写到beforesavedatarow事件,在DataRowAdded事件写代码

 

e.DataRow("日期") = Date.Today()

Dim bh As String = Format(e.DataRow("日期"),"yyMMdd") \'取得编号的8位前缀
If e.DataRow("单据编号").StartsWith(bh) = False \'如果编号的前8位不符
    Dim max As String
    Dim idx As Integer
    max = e.DataTable.sqlCompute("Max(单据编号)","日期 = #" & e.DataRow("日期") & "# And [_Identify] <> " & e.DataRow("_Identify")) \'取得该天的最大编号
    If max > "" Then \'如果存在最大编号
        idx = CInt(max.Substring(6,4)) + 1 \'获得最大编号的后三位顺序号,并加1
    Else
        idx = 1 \'否则顺序号等于1
    End If
    e.DataRow("单据编号") = bh & "" & Format(idx,"0000")
    e.DataRow.save
End If


--  作者:有点甜
--  发布时间:2017/11/8 17:30:00
--  
以下是引用gfj7126在2017/11/8 16:39:00的发言:

 这个方法新增一行就保存还是可行的,如果新多行再保存,所有新增行的编号就会是一样的。

 

[此贴子已经被作者于2017/11/8 17:11:10编辑过]

 

如果要写到beforesavedatarow事件,你保存项目的时候,你就要一行一行的保存数据,不能整体保存。


--  作者:gfj7126
--  发布时间:2017/11/9 16:19:00
--  

写在DataRowAdded事件中,无法解决多人输入时的重号问题,其中e.DataRow.save实际是没有将该数据存入后台的数据库中的,所以当另外一人新增时,找不到这条记录,会导致重号。


--  作者:有点甜
--  发布时间:2017/11/9 16:35:00
--  

DataRowAdded 事件,执行 e.DataRow.save 会保存数据到数据库的。你要认真测试。

 

重号问题,参考

 

http://www.foxtable.com/webhelp/scr/3008.htm

 

http://www.foxtable.com/webhelp/scr/1994.htm