以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]求老师帮忙,自动编号的问题!  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=31105)

--  作者:sadfox
--  发布时间:2013/4/10 11:54:00
--  [求助]求老师帮忙,自动编号的问题!

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 \'如果单据编号前缀不符
                e.DataRow("编号") = Nothing
                Dim max As String
                Dim idx As Integer
                max = e.DataTable.Compute("Max(编号)","类别 = \'" & lb & "\'") \'取得该类别的最大编号
                If max > "" Then \'如果存在最大编号
                    idx = CInt(max.Substring(2,2)) + 1 \'获得最大编号的后三位顺序号,并加1
                Else
                    idx = 1 \'否则顺序号等于1
                End If
                e.DataRow("编号") = lb & Format(idx,"00")
            End If
        End If
End Select

我想让自动编号都是从XX01到XX31,就是当XX01-XX31满了后,再次输入XX,则又从XX01开始到XX31结束,一直接这样循环编号,请问大神代码该怎么样改?

 


--  作者:Bin
--  发布时间:2013/4/10 11:57:00
--  
前面XX不变? XX01-XX31 无限循环?  这个有难度. 得好好想想..
--  作者:sadfox
--  发布时间:2013/4/10 12:02:00
--  
以下是引用Bin在2013-4-10 11:57:00的发言:
前面XX不变? XX01-XX31 无限循环?  这个有难度. 得好好想想..

对,就是这样,在类别列输入XX,当编号XX01-XX31满了后,继续输入XX,编号又从XX01开始编到XX31结束,就这样循环!


--  作者:不倒的翁
--  发布时间:2013/4/10 12:05:00
--  

建议使用SaveConfigValue函数和GetConfigValue函数

记忆主键列的值,每到达一个循环后将最大的XX31的主键值写入,然后进行重新编排。

或者在函数中保存一个周期变量。

或者直接在调用函数中的编号范围,如果达到最大,就重置,编号代码根据GetConfigValue来定义。

以上只是思路提醒,高手勿喷啊。


--  作者:blackzhu
--  发布时间:2013/4/10 12:11:00
--  
试试这边
idx = CInt(max.Substring(2,2)) + 1 

 if idx = 31 Then
       idx = 1 \'否则顺序号等于1
End if
         Else
       idx = 1 \'否则顺序号等于1
End If

--  作者:Bin
--  发布时间:2013/4/10 12:12:00
--  
为什么有这种需求 换个方案会不会好点?
非要这样的话.可以试试这个非常没效率的办法
声明2个变量,分别为:  上一编号数量, 下一编号数量
上1编号数量为 编号为01的行数
循环所有查找编号从02开始到31.
 查找编号为02的行数如果比01少 那么IDX就等于这个行数+1
 否则 上一编号数量赋值为 编号为02的行数 继续循环

--  作者:Bin
--  发布时间:2013/4/10 12:13:00
--  
以下是引用blackzhu在2013-4-10 12:11:00的发言:
试试这边
idx = CInt(max.Substring(2,2)) + 1 

 if idx = 31 Then
       idx = 1 \'否则顺序号等于1
End if
         Else
       idx = 1 \'否则顺序号等于1
End If

你这个只要有了一次31 永远都是1了.
--  作者:Bin
--  发布时间:2013/4/10 12:14:00
--  
以下是引用不倒的翁在2013-4-10 12:05:00的发言:

建议使用SaveConfigValue函数和GetConfigValue函数

记忆主键列的值,每到达一个循环后将最大的XX31的主键值写入,然后进行重新编排。

或者在函数中保存一个周期变量。

或者直接在调用函数中的编号范围,如果达到最大,就重置,编号代码根据GetConfigValue来定义。

以上只是思路提醒,高手勿喷啊。

这个思路可行.如果多用户就完蛋了.
--  作者:不倒的翁
--  发布时间:2013/4/10 12:16:00
--  
以下是引用Bin在2013-4-10 12:14:00的发言:

这个思路可行.如果多用户就完蛋了.

多用户独占编辑。


--  作者:sadfox
--  发布时间:2013/4/10 12:16:00
--  
以下是引用Bin在2013-4-10 12:12:00的发言:
为什么有这种需求 换个方案会不会好点?
非要这样的话.可以试试这个非常没效率的办法
声明2个变量,分别为:  上一编号数量, 下一编号数量
上1编号数量为 编号为01的行数
循环所有查找编号从02开始到31.
 查找编号为02的行数如果比01少 那么IDX就等于这个行数+1
 否则 上一编号数量赋值为 编号为02的行数 继续循环

老白啊,不懂,除了编号,那么有什么其他方法可以实现?