以文本方式查看主题

-  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
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
--  发布时间: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

 

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