Foxtable(狐表)用户栏目专家坐堂 → 编号重复


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

主题:编号重复

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


加好友 发短信
等级:狐精 帖子:3150 积分:20981 威望:0 精华:0 注册:2016/3/28 16:57:00
编号重复  发帖心情 Post By: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()


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


加好友 发短信
等级:超级版主 帖子:109736 积分:558396 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/8/31 9:49:00 [只看该作者]

这种用法是无法保证不会重复的,除非是单机使用。多人使用,必须有专门的服务端进行控制,也就是要有一个统一生成编号的地方,比如:http://www.foxtable.com/webhelp/topics/3008.htm

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


加好友 发短信
等级:狐精 帖子:3150 积分:20981 威望:0 精华:0 注册:2016/3/28 16:57:00
  发帖心情 Post By:2021/8/31 9:51:00 [只看该作者]

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

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

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

就一直没找到问题所在。

 

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

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


加好友 发短信
等级:超级版主 帖子:109736 积分:558396 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/8/31 9:57:00 [只看该作者]

只要有并发,就有可能有问题的,比如2个人刚好在那个时间点生成编号。并发大,只是出问题的机会多而已

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

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


加好友 发短信
等级:狐精 帖子:3150 积分:20981 威望:0 精华:0 注册:2016/3/28 16:57:00
  发帖心情 Post By:2021/8/31 10:25:00 [只看该作者]

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


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


加好友 发短信
等级:超级版主 帖子:109736 积分:558396 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/8/31 10:28:00 [只看该作者]

那还是看2楼吧。总之这个方式没有办法保证不重复

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


加好友 发短信
等级:狐精 帖子:3150 积分:20981 威望:0 精华:0 注册:2016/3/28 16:57:00
  发帖心情 Post By: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编辑过]

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


加好友 发短信
等级:超级版主 帖子:109736 积分:558396 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/8/31 13:39:00 [只看该作者]

登记日期有时分秒?
max = DataTables("报名登记表").SQLCompute("Max(项目编码)","登记日期 >= '" & fd & "' And 登记日期 < '" & ld.adddays(1)  & "' And [_Identify] <> " & r("_Identify")) 

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


加好友 发短信
等级:狐精 帖子:3150 积分:20981 威望:0 精华:0 注册:2016/3/28 16:57:00
  发帖心情 Post By:2021/8/31 13:59:00 [只看该作者]

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

 回到顶部