以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]DataColChanged使用  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=161176)

--  作者:ynhyxin
--  发布时间:2021/3/9 10:03:00
--  [求助]DataColChanged使用
 现在想使用“DataColChanged”来实现自动编号功能。
即:
图片点击可在新窗口打开查看
说明:1、ID列应为数据流水号,如果有删除数据,应自动补全流水号(重排流水号)
        2、资产编号不能编辑,编号规则是:类别编号+6位流水
        3、类别列是一个数据字典,取值编号,显示名称。
下面是代码:
Select e.DataCol.Name
    Case "类别"
        If e.DataRow.IsNull("类别") Then
            e.DataRow("资产编号") = Nothing
        Else
            Dim lb As String = e.DataRow("类别")
            If e.DataRow("资产编号").StartsWith(lb) = False \'如果资产编号前缀不符
                Dim max As String
                Dim idx As Integer
                max = e.DataTable.Compute("Max(资产编号)","类别 = \'" & lb & "\' And [_Identify] <> " & e.DataRow("_Identify")) \'取得该类别的最大编号
                If max > "" Then \'如果存在最大编号
                    idx = CInt(max.Substring(2,8)) + 1 \'获得最大编号的后八位顺序号,并加1
                Else
                    idx = 1 \'否则顺序号等于1
                End If
                e.DataRow("资产编号") = lb & Format(idx,"000000")
            End If
        End If
End Select


现在的问题:一种类别只能增加一条记录。即,XX000001
                增加同一种类别第二条记录时报错:
错误所在事件:表,低值耐久品,DataColChanged
详细错误信息:
调用的目标发生了异常。
索引和长度必须引用该字符串内的位置。
参数名: length
                                                  

请问:各位老师如何解决此问题?谢谢!       

--  作者:有点蓝
--  发布时间:2021/3/9 10:07:00
--  
idx = CInt(max.Substring(max.length - 6)) + 1 \'获得最大编号的后八位顺序号,并加1
--  作者:ynhyxin
--  发布时间:2021/3/9 10:14:00
--  
 谢谢!
以上代码已经解决报错问题。但是要如何实现“ID列应为数据流水号,如果有删除数据,应自动补全流水号(重排流水号)” ?

--  作者:有点蓝
--  发布时间:2021/3/9 10:20:00
--  
如果数据不多,这个功能到没什么,从删除行的前一行开始遍历所有行重新排序即可。

如果数据多,假设以后会有几十W的数据,然后极端情况下用户删除了第一行,后面所有的几十W行都要重新重排流水号,确定要做这种一个功能?其实不说几十W,就几万行数据,随便删除一下,估计程序都不用做其它东西了

--  作者:ynhyxin
--  发布时间:2021/3/9 10:34:00
--  
 现在是需要寻求一种自动重排流水的决绝方法。
--  作者:有点蓝
--  发布时间:2021/3/9 10:38:00
--  
只能遍历所有行,逐行处理,从删除行的前一行开始遍历所有行重新排序