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


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

主题:编号重复问题

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


加好友 发短信
等级:小狐 帖子:385 积分:2918 威望:0 精华:0 注册:2018/1/15 15:01:00
编号重复问题  发帖心情 Post By:2019/11/4 15:22:00 [只看该作者]

在datacolchanged里面设置了编号自动生成规则,然后发布项目,链接服务器SQL数据库,在不同电脑上同时操作的时候经常会出现编号一样的情况,这个要怎么处理,编号规则就是当天的第几笔数据,比如“20191104-001SQ”,前面是日期,然后是单号,加上两个字母。麻烦帮忙看下,谢谢。代码如下:

If e.DataCol.Name = "申请日期" Then
    If e.DataRow.IsNull("申请日期") Then
        e.DataRow("申请编号") = Nothing
    Else
        Dim bh As String = Format(e.DataRow("申请日期"),"yyyyMMdd") '取得编号的8位前缀
        If e.DataRow("申请编号").StartsWith(bh) = False '如果编号的前8位不符
            Dim max As String
            Dim idx As Integer
            max = e.DataTable.Compute("Max(申请编号)","申请日期 = #" & e.DataRow("申请日期") & "# And [_Identify] <> " & e.DataRow("_Identify")) '取得该天的最大编号
            If max > "" Then '如果存在最大编号
                idx = CInt(max.Substring(9,3)) + 1 '获得最大编号的后三位顺序号,并加1
            Else
                idx = 1 '否则顺序号等于1
            End If
            e.DataRow("申请编号") = bh & "-" & Format(idx,"000") & "-" & "SQ"
        End If
    End If
End If


图片点击可在新窗口打开查看此主题相关图片如下:1.jpg
图片点击可在新窗口打开查看

[此贴子已经被作者于2019/11/4 15:22:55编辑过]

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


加好友 发短信
等级:超级版主 帖子:112414 积分:572344 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/11/4 15:49:00 [只看该作者]

If e.DataRow("申请编号").StartsWith(bh) = False '如果编号的前8位不符
            Dim max As String
            Dim idx As Integer
            max = e.DataTable.SQLCompute("Max(申请编号)","申请日期 = #" & e.DataRow("申请日期") & "# And [_Identify] <> " & e.DataRow("_Identify")) '取得该天的最大编号
            If max > "" Then '如果存在最大编号
                idx = CInt(max.Substring(9,3)) + 1 '获得最大编号的后三位顺序号,并加1
            Else
                idx = 1 '否则顺序号等于1
            End If
            e.DataRow("申请编号") = bh & "-" & Format(idx,"000") & "-" & "SQ"
e.DataRow.save
        End If
……


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


加好友 发短信
等级:小狐 帖子:385 积分:2918 威望:0 精华:0 注册:2018/1/15 15:01:00
  发帖心情 Post By:2019/11/4 15:57:00 [只看该作者]

收到,谢谢,目前没有搭载openQQ功能,是不是在代码中加入你修改的部分就可以了呢。

还有就是,那个保存行的功能是不是早了,我只是存了个编号,就要保存信息了吗

[此贴子已经被作者于2019/11/4 16:00:46编辑过]

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


加好友 发短信
等级:超级版主 帖子:112414 积分:572344 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/11/4 16:38:00 [只看该作者]

因为是直接从后台数据库里取最大编号的,所以编号必须马上保存,否则其它人就无法取最大编号了。那么就会重号

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


加好友 发短信
等级:小狐 帖子:385 积分:2918 威望:0 精华:0 注册:2018/1/15 15:01:00
  发帖心情 Post By:2019/12/3 8:41:00 [只看该作者]

是不是加了每次生成编号的时候都从数据库取数就不会有编号重复的问题了,我现在好虚,因为编号重复的问题被人怼了好久了。代码加了SQLCompute之后,还有没有更近一步的保险做法。

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


加好友 发短信
等级:超级版主 帖子:112414 积分:572344 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/12/3 8:52:00 [只看该作者]

并发的情况下,SQLCompute仍然不能保证不会重号,比如2个客户端一秒钟内同时内调用SQLCompute。要解决重号最主要的是要有一个统一的地方生成编号,而不是由客户端自己做这种事。

1、改为使用openqq
2、使用存储过程,类似这种:http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=61811

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


加好友 发短信
等级:小狐 帖子:385 积分:2918 威望:0 精华:0 注册:2018/1/15 15:01:00
  发帖心情 Post By:2019/12/19 19:46:00 [只看该作者]

老师,你好。是这样的,我在窗口中做了一个“保存修改”的按钮,但是每次保存都只是保存在本地,只有关闭项目的时候提示是否保存才会存到数据库,我想在“保存修改”按钮中直接实现保存到数据库中,才不会出现自动生成编号重复的尴尬情况,求解,谢谢。
图片点击可在新窗口打开查看此主题相关图片如下:1.jpg
图片点击可在新窗口打开查看

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


加好友 发短信
等级:超级版主 帖子:112414 积分:572344 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/12/20 8:36:00 [只看该作者]

不可能,保存按钮肯定会直接保存到数据库中。

注意上面的代码只是保存当前选择的一行,而不是保存整个表。

可以改为

tables("表A").save
datatables("表A").save

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


加好友 发短信
等级:小狐 帖子:385 积分:2918 威望:0 精华:0 注册:2018/1/15 15:01:00
  发帖心情 Post By:2019/12/20 8:45:00 [只看该作者]

改为
tables("表A").save
datatables("表A").save
就能存到数据库了吗?

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


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

可以

 回到顶部
总数 19 1 2 下一页