以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]关于一个编程的问题,按条件插入号  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=58784)

--  作者:zenbu
--  发布时间:2014/10/23 18:09:00
--  [求助]关于一个编程的问题,按条件插入号

下边是我要达到的效果,我自己编的效果不是很好,肯请大家的帮助

我自己编的当中最大的问题是无法判断1号,如果没有1号,只有从2号开始

那么即使插入1个号也是只能从3号开始插入,而且代码编的很繁复。

 


此主题相关图片如下:qq截图20141023180235.jpg
按此在新窗口浏览图片

 

 

‘--------下面是我自己编的代码

 


 

Dim st As Date = Date.Now \'将开始时间保存在变量st中

Dim dt As Date

Tables("packinglist").Sort = "ctno"  \'先进行排序
Dim n As Integer   \'= Tables("packinglist").Compute ("count(ctno)")  \'计算总行数

Dim js As WinForm.TextBox = e.Form.Controls("ct")
Dim ct As Integer = js.Value  \'把件数改为整数
Dim drd As Row = Tables("rukulist_table1").Current

Dim ttl As List(of String) = DataTables("packinglist").GetValues("ctno")
For Each t As String In ttl
    n = n + 1
Next

Dim mxn As Integer = DataTables("packinglist").Compute("max(ctno)")
Dim min As Integer = DataTables("packinglist").Compute("min(ctno)")

If n = 0 Then  \'如果没有任何箱号,那么就从1号开始
    For i As Integer = 1 To ct
        Dim dr As DataRow = DataTables("Packinglist").AddNew
        dr("ctno") = i
        dr.Save
    Next
   MessageBox.Show("完成啦`(*∩_∩*)′! 共耗时: " & (Date.Now - st).TotalSeconds & "秒") \'计算并显示执行代码所花费的秒数
End If


If mxn - min + 1 = n Then  \'如果最大号 减去 最小号 加 1个 等于 总件数, 那么表示中间没有可以插入的号码了
100:
    For i As Integer = 1 To ct
        Dim dr As DataRow = DataTables("Packinglist").AddNew
        dr("ctno") = mxn + i
        dr.Save
    Next
    MessageBox.Show("完成啦`(*∩_∩*)′! 共耗时: " & (Date.Now - st).TotalSeconds & "秒") \'计算并显示执行代码所花费的秒数
    Return
End If


If mxn - min + 1 <> n Then  \'如果最大号 减去 最小号 加 1个 不等于 总件数, 那么表示中间有可以插入的箱号

        Dim mm As List(of String) = DataTables("packinglist").GetValues("ctno")   \'用这个就不能从1号开始,必须要有1号才可以从1号开始
        For Each m As String In mm
            Dim nn As Integer = CInt(m)
            If nn < mxn Then  \'如果当前号码小于最大号
                Dim nx As Integer = DataTables("packinglist").Compute("min(ctno)","ctno > \'" & nn & "\'") \'找到比当前号码大的箱号
                If nx - nn - 1 >= ct Then
                    For i As Integer = 1 To ct
                        Dim dr As DataRow = DataTables("Packinglist").AddNew
                        dr("ctno") = nn + i
                        dr.Save
                    Next
                    MessageBox.Show("完成啦`(*∩_∩*)′! 共耗时: " & (Date.Now - st).TotalSeconds & "秒") \'计算并显示执行代码所花费的秒数
                    Return
                End If
            End If


        If nn = mxn Then  \'如果当前号码等于最大号
            goto 100
        End If
    Next
End If


 


--  作者:zenbu
--  发布时间:2014/10/23 18:26:00
--  

这个代码之前也编过一个,笨方法,从1号开始核对上一个号是否满足条件

数量少的时候还行,但是行数有2,3千的时候就很慢了

因为有时候数字是有2,3,2000这种时候。

所以改成上边的方式,速度是快了一些,但是有点问题

[此贴子已经被作者于2014-10-23 18:28:29编辑过]

--  作者:有点甜
--  发布时间:2014/10/23 19:08:00
--  
 不知道你想做什么,再有,例子发上来。
--  作者:zenbu
--  发布时间:2014/10/23 20:52:00
--  

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:555.rar

上传了列子了


--  作者:有点甜
--  发布时间:2014/10/23 20:54:00
--  
 你的逻辑是什么。
--  作者:zenbu
--  发布时间:2014/10/23 21:14:00
--  

图片点击可在新窗口打开查看此主题相关图片如下:qq截图20141023211546.jpg
图片点击可在新窗口打开查看

--  作者:不倒的翁
--  发布时间:2014/10/23 21:35:00
--  
接龙游戏,4条龙。。。
--  作者:有点甜
--  发布时间:2014/10/23 21:41:00
--  

 这个意思?

 

Dim count As Integer = 2

Dim dt As DataTable = DataTables("表A")
Dim nums As List(of String) = dt.GetValues("第一列")

Dim pn As Integer = 0

For i As Integer = 0 To nums.Count - 1
    If nums(i) - pn > count Then
        Exit For
    Else
        pn = nums(i)
    End If
Next

For i As Integer = 1 To count
    Dim nd As DataRow = dt.AddNew
    nd("第一列") = pn + i
Next


--  作者:游
--  发布时间:2014/10/23 21:46:00
--  

增加辅助列,放置上下差额

 

find 大于等于插入数的行

 

累加插入


--  作者:zenbu
--  发布时间:2014/10/23 21:55:00
--  
是的,是这个样子图片点击可在新窗口打开查看,太厉害了