以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]关于联网多人增加行自动编号的代码的优化请教  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=109519)

--  作者:jwt
--  发布时间: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


--  作者:有点甜
--  发布时间: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
--  发布时间:2017/11/14 9:27:00
--  
这是个档案系统,档案编号就是简单的从00001一直增加到99999这种,我把代码写到ed也不行,网络延迟是硬伤。
--  作者:有点蓝
--  发布时间:2017/11/14 9:59:00
--  
要先保存,把e.DataRow.Save放到dataRowAdded事件代码第一行

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

--  作者:有点甜
--  发布时间: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
--  发布时间: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

--  作者:有点甜
--  发布时间: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
--  发布时间:2018/1/11 14:54:00
--  
谢谢老师~
[此贴子已经被作者于2018/1/11 15:01:34编辑过]