以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  编号重复  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=145239)

--  作者:cd_tdh
--  发布时间:2020/1/13 15:50:00
--  编号重复

老师,我生成申请单号,以下代码还有出现重复情况,请老师看看怎么处理?

生成申请单号编码(代码放在保存按钮中):

    If a.IsNull("申请单号") Then
        a("登记人") = _UserXingMing
        a("登记日期") = Functions.Execute("服务器时间")
        a("申请单号") = Functions.Execute("委托支付编码")
        a("审批状态") = "待财务部制单审批"
        a("ID") = Guid.NewGuid.TOstring()
        a("登记状态") = True
        a.save

 

生成申请单号的内部函数如下:

\'\'生成申请单号
Dim dt As DataTable = DataTables("委托支付管理")
Dim dr As Row = Tables("委托支付管理").Current
If dr.IsNull("登记日期") Then
    dr("申请单号") = Nothing
Else
    Dim d As Date = dr("登记日期")
    Dim y As Integer = d.Year
    Dim m As Integer = d.Month
    Dim  Days As  Integer = Date.DaysInMonth(y,m)
    Dim fd As Date = New Date(y,m,1)  \'获得该月的第一天
    Dim ld As Date = New Date(y,m,Days)  \'获得该月的最后一天
    Dim bh As String = Format(d,"yyyyMM") \'生成申请单号的前6位,4位年,2位月.
    If dr("申请单号").StartsWith(bh) = False \'如果申请单号的前6位不符
        Dim  max As String
        Dim  idx As  Integer
        max = dt.sqlCompute("Max(申请单号)","登记日期 >= \'" & fd & "\' And 登记日期 <= \'" & ld & "\' And [_Identify] <> " & dr("_Identify")) \'取得该月的最大申请单号
        If  max > "" Then \'如果存在最大申请单号
            idx = CInt(max.Substring(7,3)) + 1  \'获得最大申请单号的后三位顺序号,并加1
        Else
            idx = 1 \'否则顺序号等于1
        End  If
        dr("申请单号") = bh & "-" & Format(idx,"000")
    End If
End  If
Return dr("申请单号")

 

 

[此贴子已经被作者于2020/1/13 15:51:20编辑过]

--  作者:有点蓝
--  发布时间:2020/1/13 16:05:00
--  
单机是没有问题。多人并发使用这种用法肯定会有重复的。多客户端的情况下需要有一个服务统一处理编号:http://www.foxtable.com/webhelp/topics/3008.htm
--  作者:cd_tdh
--  发布时间:2020/1/13 16:25:00
--  

之前做过一个这样的确实能解决,主要是有多个表都这样的话,每次还需要更新服务端就有点繁琐。

我每次也是生成后马上保存都不能解决这样的问题,并发也不是很多啊

我也不想断号。

[此贴子已经被作者于2020/1/13 16:30:38编辑过]

--  作者:有点蓝
--  发布时间:2020/1/13 17:13:00
--  
注意是要搞懂帮助处理问题的逻辑,而不是就抄代码。

首先需要有一个统一的地方生成编号,才不会有并发冲突
其次可以建一个专门的编号表,存储所有表的最新编号
最后结合帮助的用法,其实就是结合http://www.foxtable.com/webhelp/topics/1994.htmhttp://www.foxtable.com/webhelp/topics/3008.htm用法,相当于把第一个帮助的用法从客户端移到服务端处理,第二个帮助保留消息通讯那部分,生成编号的用法改为使用第一个帮助的用法

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:编号处理例子.zip



--  作者:cd_tdh
--  发布时间:2020/1/14 9:32:00
--  
老师,这种方式新增时就会有编号,我新增可能出现撤销的情况,有可能会断号,这种怎么处理呢?
--  作者:有点蓝
--  发布时间:2020/1/14 9:52:00
--  
我只是做个例子,能不能不要那么死板!在什么地方生成编号根据自己需要使用!

断号这种问题我没有办法解决。