以文本方式查看主题 - 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 |
-- 作者: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
增加了表达式列[编号],可以用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
|