以文本方式查看主题

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

--  作者:cd_tdh
--  发布时间:2021/8/31 9:37:00
--  编号重复

老师,我有一个表的编号代码如下,偶尔会出现重复,一直没找到问题所在,请老师看看哪儿有问题,代码在录入窗口的保存按钮中,其他窗口也是类似的编号但没有这样的情况。

Dim r As Row = Tables("报名登记表") .Current
If r("登记状态") = True Then
    MessageBox.Show("你已提交登记,如需修改,请联系管理员打回!","提示",MessageBoxButtons.OK,MessageBoxIcon.Warning)
    Return
Else
    If r.IsNull("项目编码") Then
        r("登记状态") = True
        r("登记人") = _UserXingMing
        r("ID") = Guid.NewGuid.TOstring()
        r("登记日期") = Date.Now
        Dim d As Date = r("登记日期")
        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 r("项目编码").StartsWith(bh) = False \'如果编号的前6位不符
            Dim max As String
            Dim idx As Integer
            max = DataTables("报名登记表").SQLCompute("Max(项目编码)","登记日期 >= \'" & fd & "\' And 登记日期 <= \'" & ld & "\' And [_Identify] <> " & r("_Identify")) \'取得该月的最大编号
            If  max > "" Then \'如果存在最大编号
                idx = CInt(max.Substring(7,3)) + 1  \'获得最大编号的后三位顺序号,并加1
            Else
                idx = 1 \'否则顺序号等于1
            End  If
            r("项目编码") = bh & "-" & Format(idx,"000")
            r.save
        End If
    Else
        r("登记状态") = True
        r("登记人") =  _UserXingMing
        r("登记日期") = Date.Now
        r.save
    End If
End If
e.Form.Close()


--  作者:有点蓝
--  发布时间:2021/8/31 9:49:00
--  
这种用法是无法保证不会重复的,除非是单机使用。多人使用,必须有专门的服务端进行控制,也就是要有一个统一生成编号的地方,比如:http://www.foxtable.com/webhelp/topics/3008.htm
--  作者:cd_tdh
--  发布时间:2021/8/31 9:51:00
--  

并发不大啊,我另外的表数据更多,并发更大,重来没出现重复过。

1、就这个表,同一个人录入时,连续两条都会重复;

2、不同的人录入时间虽然在同一天,但是时间间隔很大,也会出现重复;

就一直没找到问题所在。

 

[此贴子已经被作者于2021/8/31 9:54:25编辑过]

--  作者:有点蓝
--  发布时间:2021/8/31 9:57:00
--  
只要有并发,就有可能有问题的,比如2个人刚好在那个时间点生成编号。并发大,只是出问题的机会多而已

另外检查是不是短时间内重复点击按钮造成的,另外看看是不是生成编号后没有成功保存

--  作者:cd_tdh
--  发布时间:2021/8/31 10:25:00
--  

窗口录入保存后都会关闭窗口,新增才会又从新打开录入窗口,没有保存成功的话,窗口应该不会关闭啊,我核实过,登记日期都是长时间格式,时间间隔都没有挨很近的情况。


--  作者:有点蓝
--  发布时间:2021/8/31 10:28:00
--  
那还是看2楼吧。总之这个方式没有办法保证不重复
--  作者:cd_tdh
--  发布时间:2021/8/31 13:32:00
--  

感觉这句代码是不是有bug,我用这句代码出来的最大编号是30号的最大编号,不是今天的最大编号

max = DataTables("报名登记表").SQLCompute("Max(项目编码)","登记日期 >= \'" & fd & "\' And 登记日期 <= \'" & ld & "\' And [_Identify] <> " & r("_Identify")) \'取得该月的最大编号

改为这样就正常了:

max = DataTables("报名登记表").SQLCompute("Max(项目编码)","登记日期 >= \'" & fd & "\' And 登记日期 <= \'" & ld.adddays(1)  & "\' And [_Identify] <> " & r("_Identify")) \'取得该月的最大编号

红色位置不对

但是ld出来确实又是2021-08-31,搞不懂了

[此贴子已经被作者于2021/8/31 13:34:09编辑过]

--  作者:有点蓝
--  发布时间:2021/8/31 13:39:00
--  
登记日期有时分秒?
max = DataTables("报名登记表").SQLCompute("Max(项目编码)","登记日期 >= \'" & fd & "\' And 登记日期 < \'" & ld.adddays(1)  & "\' And [_Identify] <> " & r("_Identify")) 

--  作者:cd_tdh
--  发布时间:2021/8/31 13:59:00
--  
,是的,登记日期有时分秒,我修改了试试用一段时间看看会不会有问题,谢谢老师!
[此贴子已经被作者于2021/8/31 14:00:12编辑过]