以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- [求助] 订单号按规则顺序输入 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=114739) |
-- 作者:Darcylau -- 发布时间:2018/2/19 17:10:00 -- [求助] 订单号按规则顺序输入 您好!
我们的订单系统中的订单号的生成想实现如下功能。 由录入当日年份的后两位数字 + 月份的两位数字 + 日期的两位数字(如果月份或日期是一位数字,则在前面补0) + 一位字母(当天第一个用A、第二个单用B、第三个单用C.....,第27个单用AA表示、第28个单用AB表示.......,当到达两位最大数ZZ时,下一位自动从AAA、AAB、AAC.....,AAZ、ABA、ABB......,ZZZ,以此类推,不论是增加行时自动生成的订单号,还是手动输入,订单号依次不重复、不后退、不跳跃。 如果手动输入不合规,则光标不能离开单元格,直到输入正确为止)。
例如170508A,代表2017年5月8日第一个订单;161130H,代表2016年11月30日的第八个订单。
我在Datarowadding实践中写入并保存了如下代码: Dim mo As String = cstr(Date.today.Month) Dim da As String = cstr( Date.today.Day) If mo.length = 1 mo = "0" & mo ElseIf da.length = 1 da = "0" & da End If Dim qz As String = cstr(Date.today.Year).SubString(2,2) & mo & da Dim ac As Integer = 65 If e.DataRow("订单号").contains(qz) ac = asc(right(e.DataRow("订单号"),1)) + 1 e.DataRow("订单号") = qz & chr(ac) Else e.DataRow("订单号") = qz & chr(ac) End If 但是只实现了当天第一个订单的输入。 由于我再Datacolchanging 实践中输入了代码: Select Case e.DataCol.Name Case "订单号" Dim dr As DataRow = e.DataTable.Find("订单号 = \'" & e.NewValue & "\'") If dr IsNot Nothing Then MessageBox.Show("此订单号已经存在!") e.Cancel = True ElseIf e.DataCol.Name = "订单号" Then If e.NewValue Is Nothing Then MessageBox.Show("订单号不允许为空!") e.Cancel = True End If End If End Select 所以再增加一行时,显示弹出对话框显示("此订单号已经存在!"), 此新增的订单号输入不成功。
请帮我指正,谢谢!
刘生 |
-- 作者:新福星 -- 发布时间:2018/2/19 17:27:00 -- 年月日后面为什么不直接引用序号呢?非要用个字母?建议还是引用序号为好! |
-- 作者:有点甜 -- 发布时间:2018/2/21 18:44:00 -- 参考这里设计
http://www.foxtable.com/webhelp/scr/2403.htm
001、002、003这些转换成字母的代码,参考
Dim idx As Integer = 30 [此贴子已经被作者于2018/2/21 18:56:39编辑过]
|
-- 作者:Darcylau -- 发布时间:2018/3/2 1:19:00 -- 谢谢版主的帮助。我写了如下代码: Select Case e.DataCol.name Case "编制日" If e.DataRow.IsNull("编制日") Then e.DataRow("订单号") = Nothing Else Dim bh As String = Format(e.DataRow("编制日"),"yyMMdd") \'取得编号的6位前缀 If e.DataRow("订单号").StartsWith(bh) = False \'如果编号的前6位不符 Dim idx As Integer Dim drs As List(Of DataRow) drs = e.DataTable.Select("编制日 = #" & e.DataRow("编制日") & "#") \'找出所有符合条件的行 If drs.count > 0 Idx = Idx + 1 Else Idx = 1 \'否则顺序号等于1 End If e.DataRow("订单号") = bh & IIf(idx>702,Chr((idx-703)\\676+65),"")&IIF(idx>26,Chr(((idx-1)/26-1) Mod 26 +65),"")&Chr((idx-1) Mod 26 +65) ‘参考Excel 表达式IF(ROW()>702,CHAR(INT((ROW()-703)/676)+65),"")&IF(ROW()>26,CHAR(MOD((ROW()-1)/26-1,26)+65),"")&CHAR(MOD(ROW()-1,26)+65)’ End If End If \'End If End Select 只能生成了第一编号,第二个就显示重复了。您能帮我看看哪里出错了吗?
|
-- 作者:有点甜 -- 发布时间:2018/3/2 9:14:00 -- Select Case e.DataCol.name Case "编制日" If e.DataRow.IsNull("编制日") Then e.DataRow("订单号") = Nothing Else Dim bh As String = Format(e.DataRow("编制日"),"yyMMdd") \'取得编号的6位前缀 If e.DataRow("订单号").StartsWith(bh) = False \'如果编号的前6位不符 Dim idx As Integer Dim drs As List(Of DataRow) drs = e.DataTable.Select("编制日 = #" & e.DataRow("编制日") & "#", "_Identify") \'找出所有符合条件的行 For i As Integer = 0 To drs.count-1 If drs(i)("_Identify") =e.DataRow("_Identify") idx = i + 1 drs(i)("订单号") = bh & IIf(idx>702,Chr((idx-703)\\676+65),"")&IIF(idx>26,Chr(((idx-1)/26-1) Mod 26 +65),"")&Chr((idx-1) Mod 26 +65) \'参考Excel 表达式IF(Row()>702,Char(INT((Row()-703)/676)+65),"")&IF(Row()>26,Char(Mod((Row()-1)/26-1,26)+65),"")&CHAR(Mod(Row()-1,26)+65)\' End If Next End If End If End Select |
-- 作者:Darcylau -- 发布时间:2018/3/4 20:20:00 -- 版主,您好! 感谢你的回复,可是测试了,增加行时,订单号并没有自动输入,是空白的。 您看是否需要我把项目发给您,您给看看。 谢谢!
|
-- 作者:Darcylau -- 发布时间:2018/3/4 20:24:00 -- 我用了另外一串代码,只实现了从尾号从A到Z编号,Z之后一个编号就是180304[,再增加一行时,弹出对话框说“此订单号已经存在”。 显然达不到公司的要求。
Case "编制日" If e.DataRow.IsNull("编制日") Then e.DataRow("订单号") = Nothing Else Dim bh As String = Format(e.DataRow("编制日"),"yyMMdd") \'取得编号的6位前缀 If e.DataRow("订单号").StartsWith(bh) = False \'如果编号的前6位不符 Dim idx As Integer Dim max As String = e.DataTable.Compute("Max(订单号)","编制日 = #" & e.DataRow("编制日") & "# And [_Identify] <> " & e.DataRow("_Identify")) \'取得该天的最大编号,并赋值给变量max If max > "" Then \'如果存在最大编号 idx = asc(max.Substring(max.Length - 1,1)) + 1 \'获得最大编号最后一个字母的ASC码值,并加1 Else idx = 65 \'否则顺序号等于1 End If e.DataRow("订单号") = bh & chr(idx) End If End If |
-- 作者:有点甜 -- 发布时间:2018/3/4 20:35:00 -- 以下是引用Darcylau在2018/3/4 20:20:00的发言:
版主,您好! 感谢你的回复,可是测试了,增加行时,订单号并没有自动输入,是空白的。
您看是否需要我把项目发给您,您给看看。
谢谢!
1、你的代码写在datacolchanged事件,你需要输入【编制日】的值,才会计算编号的。
2、如果想增加行,立马填入,你可以在DataRowAdded事件,写代码 e.DataRow("编制日") = Date.Today |
-- 作者:Darcylau -- 发布时间:2018/3/4 23:31:00 -- 感谢回复 可是我已经在[编制日]的列属性默认值里面写了Date(), 是否等效于在DataRowAdded事件中的代码 e.DataRow("编制日") = Date.Today? 增加行时,[编制日]会自动写入当天的日期。我7楼的代码,增加行时,订单号会自动输入,但只实现了从尾号从A到Z编号,Z之后一个编号就是180304[,再增加一行时,弹出对话框说“此订单号已经存在”。显然达不到公司的要求。 我司想要达到的效果是: 订单号日期后的字母(当天第一个用A、第二个单用B、第三个单用C.....,第27个单用AA表示、第28个单用AB表示.......,当到达两位最大数ZZ时,下一位自动从AAA、AAB、AAC.....,AAZ、ABA、ABB......,ZZZ,以此类推,不论是增加行时自动生成的订单号,还是手动输入,订单号依次不重复、不后退、不跳跃。 如果手动输入不合规,则光标不能离开单元格,直到输入正确为止)。 您5楼的代码,理论上是可以写到三位字母的,但不知道是什么原因还是不能成功。
|
-- 作者:有点甜 -- 发布时间:2018/3/5 8:53:00 -- 用5楼代码,同时,删除默认值函数date(),在DataRowAdded事件,写代码 e.DataRow("编制日") = Date.Today
如果还有问题,请上传具体实例说明。 |