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


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

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

帅哥哟,离线,有人找我吗?
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

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

 

请帮我指正,谢谢!

 

刘生


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


加好友 发短信
等级:八尾狐 帖子:1959 积分:15502 威望:0 精华:0 注册:2011/7/16 20:59:00
  发帖心情 Post By:2018/2/19 17:27:00 [只看该作者]

年月日后面为什么不直接引用序号呢?非要用个字母?建议还是引用序号为好!

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/2/21 18:44:00 [只看该作者]

参考这里设计

 

http://www.foxtable.com/webhelp/scr/2403.htm

 

001、002、003这些转换成字母的代码,参考

 

Dim idx As Integer = 30
Dim ac As Integer = 65
Dim str As String = ""
Do While True
    idx = idx - 1
    Dim m As Integer = idx Mod 26
    idx = idx \ 26
    str = str.Insert(0,chr(65+m))
    If idx = 0 Then
        Exit Do
    End If
Loop
output.show(str)

[此贴子已经被作者于2018/2/21 18:56:39编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
Darcylau
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | 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

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

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By: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
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


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

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

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


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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/3/4 20:35:00 [只看该作者]

以下是引用Darcylau在2018/3/4 20:20:00的发言:
版主,您好!
感谢你的回复,可是测试了,增加行时,订单号并没有自动输入,是空白的。
您看是否需要我把项目发给您,您给看看。
谢谢!

 

1、你的代码写在datacolchanged事件,你需要输入【编制日】的值,才会计算编号的。

 

2、如果想增加行,立马填入,你可以在DataRowAdded事件,写代码 e.DataRow("编制日") = Date.Today


 回到顶部
帅哥哟,离线,有人找我吗?
Darcylau
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | 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楼的代码,理论上是可以写到三位字母的,但不知道是什么原因还是不能成功。

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/3/5 8:53:00 [只看该作者]

用5楼代码,同时,删除默认值函数date(),在DataRowAdded事件,写代码 e.DataRow("编制日") = Date.Today

 

如果还有问题,请上传具体实例说明。


 回到顶部
总数 26 1 2 3 下一页