Foxtable(狐表)用户栏目专家坐堂 → [求助] 订单号按规则顺序输入


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

主题:[求助] 订单号按规则顺序输入

帅哥哟,离线,有人找我吗?
Darcylau
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:55 积分:439 威望:0 精华:0 注册:2017/6/5 21:39:00
[求助] 订单号按规则顺序输入  发帖心情 Post By: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

所以再增加一行时,显示弹出对话框显示("此订单号已经存在!"), 此新增的订单号输入不成功。

 

请帮我指正,谢谢!

 

刘生


 回到顶部
帅哥哟,离线,有人找我吗?
Darcylau
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:55 积分:439 威望:0 精华:0 注册:2017/6/5 21:39:00
  发帖心情 Post By: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

只能生成了第一编号,第二个就显示重复了。您能帮我看看哪里出错了吗?

 回到顶部
帅哥哟,离线,有人找我吗?
Darcylau
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:55 积分:439 威望:0 精华:0 注册:2017/6/5 21:39:00
  发帖心情 Post By:2018/3/4 20:20:00 [显示全部帖子]

版主,您好!
感谢你的回复,可是测试了,增加行时,订单号并没有自动输入,是空白的。
您看是否需要我把项目发给您,您给看看。
谢谢!

 回到顶部
帅哥哟,离线,有人找我吗?
Darcylau
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:55 积分:439 威望:0 精华:0 注册:2017/6/5 21:39:00
  发帖心情 Post By: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


 回到顶部
帅哥哟,离线,有人找我吗?
Darcylau
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:55 积分:439 威望:0 精华:0 注册:2017/6/5 21:39:00
  发帖心情 Post By: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楼的代码,理论上是可以写到三位字母的,但不知道是什么原因还是不能成功。

 回到顶部
帅哥哟,离线,有人找我吗?
Darcylau
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:55 积分:439 威望:0 精华:0 注册:2017/6/5 21:39:00
  发帖心情 Post By:2018/3/5 13:01:00 [显示全部帖子]

感谢你的回复。
到180305AM后,下一个应该是180305AN, 可是变成了180305BN,继续180305BO、180305BP、180305BR.......180305BZ, 然后又跳会到180305BA, 右显示订单号重复。
应该是这串代码出了问题。 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),是吗?

 回到顶部
帅哥哟,离线,有人找我吗?
Darcylau
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:55 积分:439 威望:0 精华:0 注册:2017/6/5 21:39:00
  发帖心情 Post By:2018/3/5 13:54:00 [显示全部帖子]

谢谢您的回复
当到180305AM时,下一个应该是180305AN,可是变成了180305BN,再是180305BO, 180305BP, 180305BR, ........ 180305BZ, 再有变回180305BA, 180305BB....180305BM, 下一个就提示订单重复。
应该是这个串代码 有问题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),是吗?

 回到顶部
帅哥哟,离线,有人找我吗?
Darcylau
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:55 积分:439 威望:0 精华:0 注册:2017/6/5 21:39:00
  发帖心情 Post By:2018/3/5 18:08:00 [显示全部帖子]

感谢您,测试可以了。
其实我们编制日是想做成短日期时间格式,也就是增加行时,编制日为当天日期、当时时间。例如 2018-03-05 10:25。请问如何设置代码?

我们还有一个“入库时间”、“出库时间”,是手动输入的,也要短日期时间格式,是在列属性里面设置吗?如何设置呢?

谢谢您!

 回到顶部
帅哥哟,离线,有人找我吗?
Darcylau
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:55 积分:439 威望:0 精华:0 注册:2017/6/5 21:39:00
  发帖心情 Post By:2018/3/5 23:00:00 [显示全部帖子]

感谢回复
可是按您所说的,增加行时,编制日并没有输入任何内容。
输入e.DataRow("编制日") = Date.Today,倒是自动输入日期,但没有时间。我把列属性的日期时间格式分别设置DateTime,DateLongTime,都还是不行。

 回到顶部
帅哥哟,离线,有人找我吗?
Darcylau
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:55 积分:439 威望:0 精华:0 注册:2017/6/5 21:39:00
  发帖心情 Post By:2018/3/6 8:18:00 [显示全部帖子]

感谢回复

可是按您所说的,datarowadded事件,写代码e.DataRow("编制日") = Date.now.  增加行时,编制日并没有输入任何内容。

如果输入e.DataRow("编制日") = Date.Today,倒是自动输入日期,但没有时间。我把列属性的日期时间格式分别设置DateTime,DateLongTime,都还是不行。

 回到顶部
总数 15 1 2 下一页