标题:该如何避免编号重复?
只看楼主
yewxj
Rank: 3Rank: 3
等 级:论坛游侠
威 望:5
帖 子:157
专家分:153
注 册:2015-6-18
结帖率:83.33%
已结贴  问题点数:20 回复次数:5 
该如何避免编号重复?
下面代码是用户点击提交后,先取服务器最大签报编号,然后在此基础上加‘1’,再将新的编号记录写入服务器。
可发生过两个用户同时点击提交,导致编号相同的问题,请问各位老师是如何避免类似的问题的?

-------------------------------------------------------
    *-计算签报编号
    DO CASE      
    CASE ALLTRIM(_WenZ) == "费用"
        _shou = "FY"
    CASE ALLTRIM(_WenZ) == "差旅"
        _shou = "CL"
    CASE ALLTRIM(_WenZ) == "假期"
        _shou = "JQ"
    ENDCASE
    SQLIDLEDISCONNECT(_SQLOA)
    IF SQLEXEC(_SQLOA,"SELECT top 1 QianBBH FROM oa..LiuShui WHERE WenZ = ?_WenZ ORDER BY QianBBH DESC") = 1   &&取服务器当前文种最大签报编号
        SQLIDLEDISCONNECT(_SQLOA)
        IF RECCOUNT() = 0
            _QianBBH = _shou + LEFT(_SendDate,4) + "-00001"
        ELSE
            qbbh = VAL(RIGHT(ALLTRIM(sqlresult.QianBBH),5))
            qbbh = qbbh + 1
            DO CASE
            CASE LEN(ALLTRIM(STR(qbbh))) = 1
                _QianBBH = _shou + LEFT(_SendDate,4) + "-" + "0000" + ALLTRIM(STR(qbbh))
            CASE LEN(ALLTRIM(STR(qbbh))) = 2
                _QianBBH = _shou + LEFT(_SendDate,4) + "-" + "000" + ALLTRIM(STR(qbbh))
            CASE LEN(ALLTRIM(STR(qbbh))) = 3
                _QianBBH = _shou + LEFT(_SendDate,4) + "-" + "00" + ALLTRIM(STR(qbbh))
            CASE LEN(ALLTRIM(STR(qbbh))) = 4
                _QianBBH = _shou + LEFT(_SendDate,4) + "-" + "0" + ALLTRIM(STR(qbbh))
            OTHERWISE
                _QianBBH = _shou + LEFT(_SendDate,4) + "-" + ALLTRIM(STR(qbbh))
            ENDCASE
        ENDIF
    ELSE
        MESSAGEBOX("取签报号失败。",48,"错误信息")
        RETURN
    ENDIF
   
    *-根据标题写各分表
    DO CASE
    *-安全防范费
    CASE _BiaoTi = "安全防范费"
        SQLIDLEDISCONNECT(_SQLOA)
        DO CASE
        CASE LEN(ALLTRIM(_QianBBHCG)) = 0   &&如果 _QianBBHCG 长度等于0,说明是新建签报,分表直接写入
            IF SQLEXEC(_SQLOA,"INSERT INTO oa..aqff (QianBBH,FeiYLX,GongH,XingM,BuM,FeiYHJ,FangFanNR,ShiY) VALUES (?_QianBBH,?_BiaoTi,?_GongHao,?_XingMing,?_BuM_CLR,?_FB0,?_FB1,?_FB2)") < 1
                MESSAGEBOX("写表失败。"+_BiaoTi,48,"错误信息")
                RETURN
            ENDIF
        ENDCASE
    ENDCASE

*-写主流水表新建第一条签报信息
IF SQLEXEC(_SQLOA,"INSERT INTO oa..LiuShui .........

[此贴子已经被作者于2018-7-24 12:28编辑过]

搜索更多相关主题的帖子: 编号 CASE IF LEFT STR 
2018-07-24 12:14
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:10 
* 用1个专门的编号表来记录编号,
* 或者先插入空数据,读取编号后,更新其他数据
c标记 = sys(2015)
if sqlexec(句柄,'insert into bianhao(编号,标记) select max(编号)+1,?c标记 from bianhao')>0
   sqlexec(句柄,'select 编号,标记 from bianhao where 标记=?c标记','tmp_biaohao')
   ?tmp_biaohao.编号
endif

2018-07-24 12:39
yewxj
Rank: 3Rank: 3
等 级:论坛游侠
威 望:5
帖 子:157
专家分:153
注 册:2015-6-18
得分:0 
回复 2楼 mywisdom88
谢谢老师!
2018-07-24 14:23
isealer
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:33
专家分:110
注 册:2017-8-25
得分:10 
2018-07-25 08:36
yewxj
Rank: 3Rank: 3
等 级:论坛游侠
威 望:5
帖 子:157
专家分:153
注 册:2015-6-18
得分:0 
回复 4楼 isealer
学习中,感谢!
2018-07-25 09:08
yewxj
Rank: 3Rank: 3
等 级:论坛游侠
威 望:5
帖 子:157
专家分:153
注 册:2015-6-18
得分:0 
最后解决方法是使用一个专门的编号表来记录编号,运行程序时先从此表取最大编号进行计算,写表时先将编号写入此表,如写入失败,再重新取编号计算再写入,反复几次仍失败则提示后终止运行。
2018-07-31 08:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-488787-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.182218 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved