一个经典示例
实现网络环境下实现复杂编号,一直是个不轻松的任务,Foxtable 2017之前的实现方法,你可以参考:
网络环境下的复杂编号
用OpenQQ实现网络环境下的编号
可以看到,即使有了OpenQQ,完成这个任务还是比较麻烦。
我们现在改用HttpServer+HttpClient来实现,你会发现代码简单了很多。
我们用其中最复杂的一个例子为例讲述。
假定有个名为"工程"的表,需要按月自动生成编号,根据工程代码按顺序编号,前4位是工程代码,然后是4位年,2位月,最后4位是顺序号,如下图所示:
重要提示:客户端和服务端必须分开两个项目运行,否则会锁死。
设计步骤:
1、服务端项目的HttpRequest事件代码:
Static
bhs As
new Dictionary(of
String,Integer)
'这个字典用于记录每个前缀的下一序号
If
e.Path =
"bianhao.htm"
If e.PostValues.ContainsKey("制单日期")
AndAlso e.PostValues.ContainsKey("工程代码")
Then
Dim max
As Integer
Dim bh
As String
Dim
prefix As
String = e.PostValues("工程代码")
& "-"
& Format(CDate(e.PostValues("制单日期")),
"yyyyMM")
If bhs.ContainsKey(prefix)
= False Then
'如果字典中不存在次前缀的序号,
Dim
cmd As New
SQLCommand
'cmd.ConnectionName = "数据源名称"
'外部表请设置数据源名称'
cmd.CommandText
= "Select max(单据编号) From {工程} Where 单据编号 Like '"
& prefix
& "%'"
bh
= cmd.ExecuteScalar
If
bh IsNot Nothing
Then
bh =
bh.SubString(12)
Integer.TryParse(bh,max)
End If
bhs.Add(prefix,max)
Else
max =
bhs(prefix)
End If
max =
max + 1
bhs(prefix)
= max
e.WriteString(Prefix
& "-"
& Format(max,"0000"))
End
If
End
If
2、在客户端项目工程表的DataColChanged事件加上代码:
Select
Case e.DataCol.name
Case
"工程代码","制单日期"
Dim dr
As DataRow =
e.DataRow
If dr.IsNull("工程代码")
= False AndAlso
dr.IsNull("制单日期")
= False Then
Dim
hc As
new HttpClient("http://127.0.0.1/bianhao.htm")
hc.FormData.Add("工程代码",dr("工程代码"))
hc.FormData.Add("制单日期",dr("制单日期"))
dr("单据编号")
= hc.GetData()
End
If
End
Select