以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  自动编码重号  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=174380)

--  作者:nuoyan89
--  发布时间:2022/1/12 20:27:00
--  自动编码重号
老师,如图1,我在表事件中写了以下代码,也写了自动保存,但是怎么还会有重号的呢?分析了一下,应该是我点击之后相关的编码没有自动保存到后台数据中占位置,导致同时编辑的两个电脑生成了同一编码,会不会是因为我写了只有满足条件才能保存的缘故呢?
表事件代码:
If e.DataCol.Name = "上报日期"  Then
    If e.DataRow.IsNull("上报日期")  Then
        e.DataRow("单据编码") = Nothing
    Else
        e.DataRow.save
        Dim bh As String  =  Format(e.DataRow("上报日期"),"yyMMdd")  \' 取得编号的8位前缀
        If e.DataRow("单据编码").StartsWith(bh) = False \'如果编号的前8位不符
            Dim dt2 As DataTable = DataTables("生产异常停机")
            Dim max As String
            Dim idx As Integer
            max = e.DataTable.SQLCompute("Max(单据编码)","单据编码 like \'" & "GCJL"& bh & "%\' And [_Identify] <> " & e.DataRow("_Identify")) \'取得该天的最大编号
            If max > "" Then \'如果存在最大编号
                idx = CInt(max.Substring(10,3)) + 1 \'获得最大编号的后三位顺序号,并加1
            Else
                idx = 1 \'否则顺序号等于1
            End If
            e.DataRow("单据编码") = "GCJL"& bh  & Format(idx,"000")
            e.DataRow.save
        End If
    End If
End If
保存按钮代码:
If Tables("生产过程记录_生产过程记录").Current("上报类型") = "其他异常" Then
    For Each r As Row In Tables("生产过程记录_生产过程记录").rows
        Dim cls() As String ={"上报类型","成品编码","异常类型","上报类型","异常过程描述","处理部门","需审核人","是否停机","班次","重要程度"}
        For Each c As String In cls
            If r.isnull(c) Then
                msgbox(c & "信息请填写完整,不能有为空信息")
                Return
            End If
        Next
    Next
    For Each dr1 As DataRow In DataTables("生产过程记录_生产过程记录").DataRows
        Dim dr As DataRow = DataTables("生产过程记录_审核过程").AddNew()
        dr("年") = Format(Date.Today,"yyyy")
        dr("月") = Format(Date.Today,"yyyyMM")
        dr("审核单据编码") = dr1("单据编码")
        dr("单据内容") = dr1("录入人员")
        dr("审核状态") = "已审核"
        dr("流程名称") = "生产异常"
        dr("创建人员") = _UserName
        dr("创建日期") = Date.Now
        dr("流程编码") = "无"
        dr("审核人员") = _UserName
        dr("审核意见") = "提交申请"
        dr("审核结果") = "提交申请"
        dr("审核过程") = "提交申请"
        dr("处理人员") = _UserName
        dr("处理日期") = Date.Today
    Next
    For Each dr2 As DataRow In DataTables("生产过程记录_生产过程记录").DataRows
        Dim r1 As DataRow = DataTables("生产过程记录_审核过程").AddNew()
        r1("年") = Format(Date.Today,"yyyy")
        r1("月") = Format(Date.Today,"yyyyMM")
        r1("审核单据编码") = dr2("单据编码")
        r1("单据内容") = dr2("录入人员")
        r1("审核状态") = "待审核"
        r1("流程名称") = "生产异常"
        r1("创建人员") = _UserName
        r1("创建日期") = Date.Now
        r1("流程编码") = "无"
        r1("审核人员") = dr2("需审核人")
    Next
    DataTables("生产过程记录_生产过程记录").DeleteFor("异常过程描述 is null")
    DataTables("生产过程记录_生产过程记录").Save()
    
    DataTables("生产过程记录_审核过程").DeleteFor("审核单据编码 is null")
    DataTables("生产过程记录_审核过程").Save()
    
    DataTables("生产过程记录_生产过程记录").RemoveFor("")
    DataTables("生产过程记录_审核过程").RemoveFor("")
    e.Form.Close
End If

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

--  作者:有点蓝
--  发布时间:2022/1/13 8:43:00
--  
如果是多人使用系统,并发的情况下,这种用法是没有办法控制不重号的。

比较合理的就是有个统一生成编号的地方,比如服务端程序,如:http://www.foxtable.com/webhelp/topics/3008.htm

--  作者:nuoyan89
--  发布时间:2022/1/13 9:47:00
--  
不是有一种方法吗?就是我打开这个表时,先自动保存到后台,相当于占号一样的,然后所以信息填写完成在保存这样可以操作吗?
--  作者:有点蓝
--  发布时间:2022/1/13 9:49:00
--  
只要是并发,不通过服务端统一控制的,都没有办法不重号