以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  求助,如何解决 编号的启用与停用这个问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=77558)

--  作者:covechen
--  发布时间:2015/11/20 14:28:00
--  求助,如何解决 编号的启用与停用这个问题

原范例是论坛上找的,实际应用中发现有些不大方便的地方,如下图


图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看

图1

图片点击可在新窗口打开查看此主题相关图片如下:2.png
图片点击可在新窗口打开查看

图2

 

1、如图1,我设了四个编号段,其中红色、黄色框内的号码段是正常情况下的(从小到大,号码段>=2),图2中也可以看出自动排出来的号码属于正常范围(灰色框)

2、但,图1中,绿色框内的号码段,开始号码比红色、黄色的还要小,在图2中就出现BUG了,只提取出1个号,其后的号码就不对了。

3、图1中,蓝色框的号码段只有1,图2也出现BUG。。

 

请教一下,如何解决2、3 这两个问题? 谢谢!

 

实例如下

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:启用和停止编号.table


--  作者:大红袍
--  发布时间:2015/11/20 15:21:00
--  

DataRowAdded事件

 

Dim dr As DataRow = e.DataRow
Dim bh As String = e.DataTable.Compute("Max(编号)") + 1
Dim fdr As DataRow
fdr = DataTables("号段管理").Find("开始号段 <= \'" & bh & "\' And 结束号段 >= \'" & bh & "\' And [启用] = True And ([停止] = False Or [停止] Is null)")

If fdr Is Nothing Then
    fdr = DataTables("号段管理").Find("开始号段 >= \'" & bh & "\' And [启用] = True And ([停止] = False Or [停止] Is null)", "开始号段")
    If fdr Is Nothing Then
        msgbox("没有号段了")
        e.DataRow.Delete
        Return
    Else
        dr("编号") = fdr("开始号段")
    End If
Else
    dr("编号") = bh
End If

DataTables("号段管理").ReplaceFor("停止", True, "结束号段 <= \'" & dr("编号") & "\'")

 


--  作者:covechen
--  发布时间:2015/11/20 15:58:00
--  
麻烦版主再帮我改下。
我刚刚用你的代码试了一下, 第3个问题解决了,但第2个问题还是不行,
你的代码直接跳过2,就是说,比最后一个号码还小的号码段,直接跳过

--  作者:狐表开发
--  发布时间:2015/11/20 16:30:00
--  
Dim dr As DataRow = e.DataRow
Dim dt As DataTable = DataTables("号段管理")
Dim dr1 As DataRow = dt.Find("[启用] = True And [停止] = False")
If dr1 IsNot Nothing Then
    Dim bh As String = dr1("开始号段")
    bh = Format(e.DataTable.Compute("Max(编号)","编号 >= " & dr1("开始号段") & " and 编号 <= " & dr1("结束号段")) + 1,"0000000")
    Do While bh > dr1("结束号段")
        dr1("启用") = False
        dr1("停止") = True
        dr1 = dt.Find("[启用] = False And [停止] = False")
        If dr1 IsNot Nothing Then
            dr1("启用") = True
            bh = dr1("开始号段")
            bh = Format(e.DataTable.Compute("Max(编号)","编号 >= " & dr1("开始号段") & " and 编号 <= " & dr1("结束号段")) + 1,"0000000")
            If bh <= dr1("结束号段") Then
                Exit Do
            End If
        Else
            MessageBox.Show("没有号段了")
            Return
        End If
    Loop
    dr("编号") = bh
End If

--  作者:大红袍
--  发布时间:2015/11/20 16:50:00
--  

逻辑有问题,编号只能递增,不能回头。

 


--  作者:大红袍
--  发布时间:2015/11/20 17:02:00
--  

如果要根据号段管理,取完所有编号,就这样写

 

Dim dr As DataRow = e.DataRow
Dim found As Boolean = False
For Each pdr As DataRow In DataTables("号段管理").Select("[启用] = True And ([停止] = False Or [停止] Is null)", "领用日期")
    For i As Double = pdr("开始号段") To pdr("结束号段")
        If e.DataTable.Find("编号 = \'" & i & "\'") Is Nothing Then
            dr("编号") = i
            found = True
            Exit For
        End If
    Next
    If found Then
        Exit For
    Else
        pdr("停止") = True
    End If
Next
If found = False Then
    e.DataRow.Delete
    msgbox("没有编号了")
End If


--  作者:covechen
--  发布时间:2015/11/20 18:21:00
--  
谢谢,很完美地解决所有问题 图片点击可在新窗口打开查看