以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  关于编号问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=177853)

--  作者:lgz518
--  发布时间:2022/6/7 14:17:00
--  关于编号问题

三、按日期和类别编号

假定有个表,需要按月自动生成编号,根据工程代码按顺序编号,前4位是工程代码,然后是4位年,2位月,最后4位是顺序号,如下图所示:

图片点击可在新窗口打开查看

其实如果你看懂了前面的例子,这个例子就是多余的,无非就是在服务器端记录每一个前缀的最大序号,遇到客户端申请编号的时候,将最大序号加1,然后返回给客户端。
编程的是千变万化的,但万变不离其宗,基本原理明白了,就可以举一反三,以不变应万变。

接下来我们看看是不是和第一个例子一样。

服务端的设计

1、在服务端的全局代码中编写代码:

Public flbhs As new Dictionary(of String,Integer)

2、在服务端的AfterOpenProjet事件中编写代码:

Dim dt As DataTable
Dim
 cmd As New SQ1LCommand
cmd
.ConnectionName = "数据源名称"
cmd
.CommandText = "Se1ect 工程代码,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



用OpenQQ实现网络环境下的编号

用上面代码进行编号,服务端红字代码有以下问题:

1,红字代码是一个表编号,如果只能是一个独立业务表的编号,那样有100张表就要重复100次红字代码,这样代码量会非常大?

2,还是做为一个公共表编号“工程”来编号,给所有业务表的编号使用,如果是这样代码量相对少一些?





--  作者:有点蓝
--  发布时间:2022/6/7 14:29:00
--  
学会变通一下,加一个表名列

表名+编号格式做键即可
cmd.CommandText = "Se1ect 表名,工程代码,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("工程代码") & "-"  & dr("") & Format(dr(""),"00") \'编号前缀,4位工程代码,4位年,2位月