Foxtable(狐表)用户栏目专家坐堂 → [求助]自动编号BUG


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

主题:[求助]自动编号BUG

帅哥哟,离线,有人找我吗?
积水成渊
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:348 积分:2805 威望:0 精华:0 注册:2016/8/24 10:39:00
[求助]自动编号BUG  发帖心情 Post By:2017/10/21 11:03:00 [只看该作者]

之前做了一个自动编号的功能,因为当时是一个人测试的,没有发现什么问题,后来几个人在使用自动编号这个功能的时候却发现自动编号存在相同的单据编号,这个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

 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:105942 积分:538779 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/10/21 11:22:00 [只看该作者]


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


加好友 发短信
等级:婴狐 帖子:30 积分:216 威望:0 精华:0 注册:2017/10/14 21:48:00
  发帖心情 Post By:2017/10/21 12:22:00 [只看该作者]

把事件改到beforesavedatarow

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


加好友 发短信
等级:婴狐 帖子:30 积分:216 威望:0 精华:0 注册:2017/10/14 21:48:00
  发帖心情 Post By:2017/10/21 12:23:00 [只看该作者]

compute改为sqlcompute

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


加好友 发短信
等级:小狐 帖子:348 积分:2805 威望:0 精华:0 注册:2016/8/24 10:39:00
  发帖心情 Post By:2017/10/24 14:39:00 [只看该作者]

感谢大家的方法

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


加好友 发短信
等级:幼狐 帖子:130 积分:1141 威望:0 精华:0 注册:2013/6/9 11:20:00
  发帖心情 Post By:2017/11/8 16:39:00 [只看该作者]

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

 

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

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By: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


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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2017/11/8 17:30:00 [只看该作者]

以下是引用gfj7126在2017/11/8 16:39:00的发言:

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

 

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

 

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


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


加好友 发短信
等级:幼狐 帖子:130 积分:1141 威望:0 精华:0 注册:2013/6/9 11:20:00
  发帖心情 Post By:2017/11/9 16:19:00 [只看该作者]

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


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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By: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

 


 回到顶部