Foxtable(狐表)用户栏目专家坐堂 → [求助]关于自动编号生成


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

主题:[求助]关于自动编号生成

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


加好友 发短信
等级:婴狐 帖子:14 积分:190 威望:0 精华:0 注册:2017/10/15 11:57:00
[求助]关于自动编号生成  发帖心情 Post By: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编辑过]

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


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


加好友 发短信
等级:婴狐 帖子:14 积分:190 威望:0 精华:0 注册:2017/10/15 11:57:00
  发帖心情 Post By:2017/12/25 9:17:00 [只看该作者]

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

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

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


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


加好友 发短信
等级:婴狐 帖子:14 积分:190 威望:0 精华:0 注册:2017/10/15 11:57:00
  发帖心情 Post By: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编辑过]

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


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2017/12/26 8:35:00 [只看该作者]

增加一个表保存被删除的编号,按顺序取值,没有再去使用最大编号

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


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

 


 回到顶部