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


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

主题:编号问题

帅哥,在线噢!
lgz518
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1353 积分:9328 威望:0 精华:0 注册:2019/6/13 9:57:00
编号问题  发帖心情 Post By:2025/3/20 11:22:00 [显示全部帖子]

编号问题

关于编号论坛有很多,有过于简单不适用,有的过于复杂,难于维护

如何在局域多并发情况,编号不重复,不断号?

有这么一样思路,不知如何实现?

表A的当前表
表B的为编号回收表

表A的编号,当日期列录入值时,
先从回收表找是否有回收编号可用,如果有就可回收编号,并检验当前表是否重复编号,如果没有就用,如果有重复就重新生成不重复的编号;
如果回收表没有回收编号,检查当前表是否有重复编号?如果没有就生成不重复编号


在保存时,再检查当前表是否有重复,避免并发时,漏了,有重复,如果有重复时,重新生成不重复编号,之后保存。

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


加好友 发短信
等级:六尾狐 帖子:1353 积分:9328 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2025/3/20 13:06:00 [显示全部帖子]

'1、服务端-
Dim dt As DataTable
Dim cmd As New SQGLCommand    
cmd.C '数据源名称
cmd.CommandText = "SelGectG 工程代码,Year(制单日期) As 年, Month(制单日期) As 月, Max(单据编号) as 单据编号 From {工程} Group By 工程代码,Year(制单日期), Month(制单日期)"
dt = cmd.ExecuteReader
flbhs.Clear()
For Each dr As DataRow In dt.DataRows
    Dim qz As String = dr("工程代码") & "-" & dr("年") & Format(dr("月"), "00") '编号前缀,4位工程代码,4位年,2位月
    Dim bh As String = dr("单据编号")
    Dim id As Integer
    If bh.Length = 16 Then
        bh = bh.SubString(12)
        If Integer.TryParse(bh, id) Then
            flbhs.Add(qz, id)
        End If
    End If
Next
问题一:不想用上面代码,不想服务端的代码,因为不灵活,不实用,麻烦,只想用客户端来实现
问题二:上面服务端是编号是另一个数据源,现在改同一个数据源,是否也可不用上面的代码?

下面的客户端的代码如何改?
2客户端


Select e.DataCol.Name
    Case "制单日期", "工程代码"
        If e.DataRow.IsNull("制单日期") OrElse e.DataRow.IsNull("工程代码") Then
            e.DataRow("单据编号") = Nothing
        Else
            If QQClient.Ready = False Then
                PopMessage("QQClient未启动,无法生成编号!", "提示", PopIconEnum.Infomation, 5)
        Else
             Dim dr As DataRow = DataTables("回收编码").Find("编号 is not null and 表名='订单'", "编号")
            If dr IsNot Nothing Then
                e.DataRow("单据编号") = dr("编号")
                dr.Delete
            Else
                Dim bh As String = e.DataRow("工程代码") & "-" & Format(e.DataRow("制单日期"), "yyyyMM")
                Dim rt As String = QQClient.SendWait(":g" & bh & "g:")
                Dim id As Integer
                If rt > "" Then
                    If Integer.TryParse(rt, id) Then
                        e.DataRow("单据编号") = bh & "-" & Format(id, "0000")
                    Else
                        PopMessage("服务器返回错误信息:" & rt, "提示", PopIconEnum.Infomation, 5)
                    End If
                Else
                    PopMessage("服务器无响应,无法生成编号!", "提示", PopIconEnum.Infomation, 5)
                End If
            End If
        End If

        End If

End Select

 回到顶部
帅哥,在线噢!
lgz518
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1353 积分:9328 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2025/3/20 13:59:00 [显示全部帖子]

问题二:上面服务端是编号是另一个数据源,现在改同一个数据源,是否也可不用上面的代码?

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


加好友 发短信
等级:六尾狐 帖子:1353 积分:9328 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2025/3/20 15:20:00 [显示全部帖子]

上面代码,之前是分开,有二个数据源

 回到顶部
帅哥,在线噢!
lgz518
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1353 积分:9328 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2025/3/20 22:30:00 [显示全部帖子]

''编号生成'
Public _BizCodeBuilder As BizCodeBuilder
'不重复编号上传用,这里的用法比较简单,没有做复杂的编号规则处理'
Public Class BizCodeBuilder
    Private _bizcode As DataTable '直接把编号表取出到内存'
    Private _codelock As New Object
    '    Public Sub New()
    Public Sub New(sjy As String)
        Dim db As New SQLCommand
        db.C

        
'        Dim SqGl As String = CExp("selecGt * from  bh_tb   where    Bm ='{0}'", s_name) '执行SQLG
          Dim SqGl As String = CExp("selecGt * from  bh_tb ") '执行SQLG
        _bizcode = Functions.Execute("Cmd_GetDataTable", sjy, sql, True) 
    End Sub
    
    Public Function GetNextCode(s_name As String, Optional s_qz As String = Nothing) As String
        SyncLock _codelock '使用锁处理并发

        '        'output.show(sql)
        '        Dim dt As system.data.DataTable = db.ExecuteDataSet(Sql).Tables(0)
        '        Dim dr As system.data.DataRow
        '        If dt.Rows.count = 0 Then
        Dim dr As DataRow = _bizcode.Find(CExp("Bm='{0}'", s_name))
'        Dim dr As DataRow = _bizcode.Find(CExp("Bm='{0}'", s_name))
        '        Dim dr As DataRow
        If dr Is Nothing Then
            dr = _bizcode.AddNew()
'            dr = dt.NewRow()
            dr("Bm") = s_name 
            dr("MaxValue") = 1
            If String.IsNullOrEmpty(s_qz) Then s_qz = Date.now.ToString("mmss") & "BH"
            dr("qz") = s_qz
            dr("Mark") = "yyyyMM"
            dr("MarkValue") = Date.Today.ToString("yyyyMM")
            
            'dr("Mark") = "yyyyMMdd"
            'dr("MarkValue") = Date.Today.ToString("yyyyMMdd") 
            
            dr("Length") = 4
'            dt.Rows.Add(dr)
            
        Else
'            dr = dt.Rows(0)
            '这里的处理规则是按时间进行重新编号,至于是按年,月还是日,在掩码中体现'
            If dr("MarkValue") <> Date.Today.ToString(dr("Mark")) Then
                
                dr("MaxValue") = 1
                dr("MarkValue") = Date.Today.ToString(dr("Mark"))
            Else
                dr("MaxValue") = dr("MaxValue") + 1
            End If
        End If
'        db.UpdateDataTable(dt, "xtbh_tb")
        dr.Save()
        Return dr("qz") & dr("MarkValue") & "-" & Format(dr("MaxValue"), "0000") '顺序号只取4位'
        End SyncLock
    End Function
End Class


转SQLG2008,执行上面代码,报错提示没下面,如何解决?
Cmd_GetDataTable",





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


加好友 发短信
等级:六尾狐 帖子:1353 积分:9328 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2025/3/21 10:23:00 [显示全部帖子]

这种能实现同一表不部门的前缀不同编号?如果可以,代码如何改?

 回到顶部
帅哥,在线噢!
lgz518
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1353 积分:9328 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2025/3/21 10:33:00 [显示全部帖子]

9楼服务端+客户端的写法
不是可服务端+客户端的写法,相对好理解,
用9楼服务端+客户端的写法,比较难,不知如何实现?
效果如图

图片点击可在新窗口打开查看此主题相关图片如下:同一表不同部门不同编号.jpg
图片点击可在新窗口打开查看


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


加好友 发短信
等级:六尾狐 帖子:1353 积分:9328 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2025/3/21 10:57:00 [显示全部帖子]


图片点击可在新窗口打开查看此主题相关图片如下:服务端编号表.jpg
图片点击可在新窗口打开查看

 回到顶部
帅哥,在线噢!
lgz518
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:六尾狐 帖子:1353 积分:9328 威望:0 精华:0 注册:2019/6/13 9:57:00
  发帖心情 Post By:2025/3/21 11:25:00 [显示全部帖子]

在服务表加一部门列,

客户端
查询的时候按表名+部门需要的数据
    Case "制定日期"
        If e.DataRow.IsNull("制定日期") Then
            e.DataRow("订单编号") = Nothing
        Else
            If QQClient.Ready = False Then
                PopMessage("QQClient未启动,无法生成编号!", "提示", PopIconEnum.Infomation, 5)
            Else
                Dim dr As DataRow = DataTables("登记窗口_Table4").Find("编号 is not null and 表名='b_tb'","部门" , "编号")'回收编码表
                If dr IsNot Nothing Then
                    e.DataRow("订单编号") = dr("编号")'单
                    dr.Delete
                    DataTables("登记窗口_Table4").save
                Else
                    '网络编号
                    Dim rt As String = QQClient.SendWait(":fjxkhzb_tbf:")'(":fbmkpi_tbf:"):(":
                    e.DataRow("订单编号") = rt
                End If
            End If
            
        End If
        
     
    Case "订单编号"
        If e.NewValue Is Nothing AndAlso e.OldValue IsNot Nothing Then 
            Dim dr1 As DataRow = DataTables("登记窗口_Table4").Find("表名 ='b_tb' and  编号 ='" & e.OldValue & "'and  部门 ='" &dr("部门") "'")'窗表
            If dr1 Is Nothing Then
                dr1 = DataTables("登记窗口_Table4").AddNew'回收码表-新增
                dr1("表名") = "b_tb" '业务表/接收表
                dr1("编号") = e.OldValue

                dr1.save
            End If
        End If
执行不行?

 回到顶部