Foxtable(狐表)用户栏目专家坐堂 → [求助]关于联网多人增加行自动编号的代码的优化请教


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

主题:[求助]关于联网多人增加行自动编号的代码的优化请教

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


加好友 发短信
等级:童狐 帖子:204 积分:2037 威望:0 精华:0 注册:2015/3/6 17:12:00
[求助]关于联网多人增加行自动编号的代码的优化请教  发帖心情 Post By:2017/11/14 8:55:00 [只看该作者]

我设置了个程序,增加行时,编号列自动赋值(在最大号码上+1),保证编号唯一。程序是联网的,可多人同时操作。但是,当多人同时增加行时,因为网络延迟吧,编号列的值会重复,比如,有两个0002的编号,相关代码贴出如下,麻烦大神们予以建议或优化,幼狐感激不尽!

 

一、增加行按钮代码:

If CurrentTable.name = "单位设置" Or CurrentTable.name = "历史库" Then
    messagebox.show("此数据库禁止授权 , 操作取消 !")
Else
    If _usergroup = "编辑" Then
        CurrentTable.DataTable.AddNew()
        CurrentTable.save()
    Else
        messagebox.show("未经授权 , 操作取消 !")
    End If
End If

 

二、表内 DataRowAdding 的代码

Dim max As String
Dim idx As Integer
max = e.DataTable.SqlCompute("Max(编号)","[_Identify] <> " & e.DataRow("_Identify")) '取得该类别的最大编号
If max > "" Then '如果存在最大编号
    idx = CInt(max.Substring(0,5)) + 1
Else
    idx = 00001 '否则顺序号等于1
End If
e.DataRow("编号") = Format(idx,"00000")
e.DataRow.Save


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


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

1、代码要写到dataRowAdded事件,不是ing事件。

 

2、看看 http://www.foxtable.com/webhelp/scr/1994.htm

 

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

 

3、你的编号,不一定要连续,你可以把_Identify作为编号的一部分,这样能区别唯一。

 


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


加好友 发短信
等级:童狐 帖子:204 积分:2037 威望:0 精华:0 注册:2015/3/6 17:12:00
  发帖心情 Post By:2017/11/14 9:27:00 [只看该作者]

这是个档案系统,档案编号就是简单的从00001一直增加到99999这种,我把代码写到ed也不行,网络延迟是硬伤。

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


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

要先保存,把e.DataRow.Save放到dataRowAdded事件代码第一行

保存后直接取当前行的_Identify就可以了,没有必要再使用compute计算
[此贴子已经被作者于2017/11/14 10:00:07编辑过]

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


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

以下是引用jwt在2017/11/14 9:27:00的发言:
这是个档案系统,档案编号就是简单的从00001一直增加到99999这种,我把代码写到ed也不行,网络延迟是硬伤。

 

那就加入_Identify处理,如生产 00001-001、00002-002、00002-002 这样的编号,即便前面相同,后面都不同。

 

目前这个问题,除非你用openQQ,否则延时、并发的问题都不能解决。


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


加好友 发短信
等级:二尾狐 帖子:526 积分:5089 威望:0 精华:0 注册:2015/4/15 15:25:00
  发帖心情 Post By:2018/1/11 14:49:00 [只看该作者]

老师,我在DataColChanged输入以下代码,在网络上使用还是会出现重复编号,要如何处理?

Select Case e.DataCol.name
    Case "创建日期"     '由创建日期自动生成计划明细编码
        If e.DataRow.IsNull("创建日期") Then
            e.DataRow("编码") = Nothing
        Else
            If e.DataRow.IsNull("编码") Then
                Dim d As Date = e.DataRow("创建日期")
                Dim bh As String = Format(d,"yyMM")  
                Dim str As String = Format(e.DataRow("_Identify"),"00000")     
                e.DataRow("计划明细编码") = "JH" & bh & "-" & str
            End If
        End If
End Select

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


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

Select Case e.DataCol.name
    Case "创建日期"     '由创建日期自动生成计划明细编码
        If e.DataRow.IsNull("创建日期") Then
            e.DataRow("编码") = Nothing
        Else
            If e.DataRow.IsNull("编码") Then

                e.DataRow.Save '保存之后,才会获取_Identify值
                Dim d As Date = e.DataRow("创建日期")
                Dim bh As String = Format(d,"yyMM") 
                Dim str As String = Format(e.DataRow("_Identify"),"00000")    
                e.DataRow("计划明细编码") = "JH" & bh & "-" & str
            End If
        End If
End Select

 

 


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


加好友 发短信
等级:二尾狐 帖子:526 积分:5089 威望:0 精华:0 注册:2015/4/15 15:25:00
  发帖心情 Post By:2018/1/11 14:54:00 [只看该作者]

谢谢老师~
[此贴子已经被作者于2018/1/11 15:01:34编辑过]

 回到顶部