以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]关于自动编号生成  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=111547)

--  作者:kakawcj
--  发布时间:2017/12/24 17:12:00
--  [求助]关于自动编号生成
请教老师,我今天遇到问题是这样: 有“合同单号”,命名规则为“[领域] & [签订日期] & [3位按日流水号],如A171224001,A171224002,A171224003,我在参考说明书中“自动编号生成方法”自行设计代码如下
(DataRowAdding):

e.DataRow("签订日期") = Date.Today()

e.DataRow("业务员") = User.Name

e.DataRow("领域") = "A" \'领域的默认值定义为A

Dim bh As String = e.DataRow("领域") & Format(e.DataRow("签订日期"),"yyMMdd") \'取得编号的7位前缀

Dim max As String

Dim idx As Integer

max = e.DataTable.Compute("Max(合同单号)","签订日期 = #" & e.DataRow("签订日期") & "# And [_Identify] <> " & e.DataRow("_Identify")) \'取得该天的最大编号

If max > "" Then \'如果存在最大编号

    idx = CInt(max.Substring(7,3)) + 1 \'获得最大编号的后三位顺序号,并加1

Else

    idx = 1 \'否则顺序号(起始号)等于1(有签订日期,无合同编号时的判断)

End If

e.DataRow("合同单号") = bh & Format(idx,"000")



同时,我在DataCalChanged添加了代码,使修改"领域"后,"合同单号"会对应修改,如"合同单号"为A171224003行的"领域"改为"C",则合同单号改为了"C171224003",但问题来了:
每次增加一行时,自动添加生成的编号一直都是A171224004,无法按顺序编号自动生成了,怎么修改呢?
[此贴子已经被作者于2017/12/25 9:20:34编辑过]

--  作者:有点甜
--  发布时间:2017/12/24 19:55:00
--  

datacolchaned事件

 

Select Case e.DataCol.name
    Case "签订日期", "领域"
        Dim bh As String = e.DataRow("领域") & Format(e.DataRow("签订日期"),"yyMMdd") \'取得编号的7位前缀
       
        Dim max As String
       
        Dim idx As Integer
       
        max = e.DataTable.Compute("Max(合同单号)","领域 = \'" & e.DataRow("领域") & "\' And 签订日期 = #" & e.DataRow("签订日期") & "# And [_Identify] <> " & e.DataRow("_Identify")) \'取得该天的最大编号
       
        If max > "" Then \'如果存在最大编号
           
            idx = CInt(max.Substring(bh.length,3)) + 1 \'获得最大编号的后三位顺序号,并加1
           
        Else
           
            idx = 1 \'否则顺序号(起始号)等于1(有签订日期,无合同编号时的判断)
           
        End If
       
        e.DataRow("合同单号") = bh & Format(idx,"000")
       
end select


--  作者:kakawcj
--  发布时间:2017/12/25 9:17:00
--  
我总算搞清楚原因了,是因为Max(合同单号)在判断时,认为“C171224003”比“A171224004”,因而做出后面的一直增加数据都只会认为“C171224003”是最大编号,因而造成怎么增加行都是生成“A171224004”,按您的改法,只是在获取最大编号时增加考虑“领域”一个条件而已,从逻辑上还是会出错,我目的是不管领域如何变化,我要求获得“合同单号”这个列的指定日期内最大的编号,思路上是可以找到符合条件(指定“签订日期”、去除第一位“领域”字符)的所有“合同单号”放入一个集合中,但从集合里获取最大值,不增加列的情况下如何实现呢?

同样遇到类似的问题,我想对Table某列进行排序用Sort,其对象也像Max一样只能是列名吗?可否是条件表达式?
[此贴子已经被作者于2017/12/25 9:22:40编辑过]

--  作者:有点甜
--  发布时间:2017/12/25 9:23:00
--  

不增加列无法实现的,除非你用sqlcompute http://www.foxtable.com/webhelp/scr/2897.htm

 

使用compute获取最大值的话,要加一列表达式列,把签订日期+编号的值存放起来,根据此表达式列得到最大值。

 

或者是,改成循环每一行获取最大值,如

 

For Each dr As DataRow in e.DataTable.DataRows

  

Next


--  作者:kakawcj
--  发布时间:2017/12/26 0:05:00
--  

又遇到自动编号新问题,再次请教:

DataColChanged事件:

Select Case e.DataCol.Name

    Case "合同单号"

        Dim dr As DataRow = DataTables("报告管理_客服员").Find("合同单号 = \'" & e.OldValue & "\'")

        If dr Is Nothing Then

            dr = DataTables("报告管理_客服员").AddNew()

            dr("合同单号") = e.DataRow("合同单号")

            Dim max As String

            Dim idx As Integer

            max = DataTables("报告管理_客服员").Compute("Max(编号)","[_Identify] <> " & e.DataRow("_Identify")) \'取得最大编号

            If max > "" Then \'如果存在最大编号

                idx = CInt(max) + 1 \'获得最大编号后加1

            Else

                idx = 200 \'否则顺序号(起始号)等于200

            End If

            dr("报告编号") = e.DataRow("场所") & e.DataRow("领域") & Format(idx,"00000")

        Else

            dr("合同单号") = e.DataRow("合同单号")

        End If

End Select

 

 
此主题相关图片如下:1111.jpg
按此在新窗口浏览图片

增加了表达式列[编号],可以用Max统计该列最大编号,但由于某种操作,是会删除中间部分曾用过的报告编号,如附件所示,删除的BA00210、BA00211两个编号已被删除,但希望能加以判断优先使用曾被删除的编号,再去使用最大编号,请问该怎么实现呢?

[此贴子已经被作者于2017/12/26 0:06:04编辑过]

--  作者:有点蓝
--  发布时间:2017/12/26 8:35:00
--  
增加一个表保存被删除的编号,按顺序取值,没有再去使用最大编号
--  作者:有点甜
--  发布时间:2017/12/26 9:02:00
--  

增加了表达式列[编号],可以用Max统计该列最大编号,但由于某种操作,是会删除中间部分曾用过的报告编号,如附件所示,删除的BA00210、BA00211两个编号已被删除,但希望能加以判断优先使用曾被删除的编号,再去使用最大编号,请问该怎么实现呢?

[此贴子已经被作者于2017/12/26 0:06:04编辑过]

 

参考 http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=85293&skin=0