以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  移动行  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=184389)

--  作者:采菊东篱下
--  发布时间:2022/12/5 11:40:00
--  移动行
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目2.foxdb


如果临时过渡表桌号不为0的个数除2,余数为1,如果临时过渡表最后一行的姓名等于比赛积分表中每一轮桌号不为0,但最后一行没有对手的姓名,则临时过渡表从下向上分析,把最后一个姓名不等于比赛积分表中每一轮桌号不为0,但最后一行没有对手的姓名移到最后一行,我这样写,逐步测试已看到相同的姓名了,唯独移动行没反应。
With Tables("临时过渡取数")
    Dim Names As New List(Of String)
    Dim zhyh As Integer
    If (.rows.count - 3) Mod 2 = 1 Then
        For zhcs As Integer = 1 To 4
            Dim drs As List(Of DataRow) = DataTables("比赛积分").SQLSelect("[团体赛或个人赛] = \'个人赛\' And [棋赛名称] = \'2020年迎春杯\' And [分组] = \'综合组\' And [第几轮比赛] = " & zhcs & " And [桌号] >" & 0)
            If drs.count Mod 2 = 1 Then
                Names.Add(drs(drs.count - 1)("姓名"))
            End If
        Next
        MessageBox.Show(Names.count)
        For Each nm As String In Names
            MessageBox.Show(nm)
        Next
        MessageBox.Show(.rows.count - 3 - 1)
        If Names.Contains(.Rows(.rows.count - 3 - 1)("姓名")) = True Then
            For zhyh = .rows.count - 3 - 2 To 0 Step - 1
                If Names.Contains(.Rows(zhyh)("姓名")) = True Then
                    Continue For
                ElseIf Names.Contains(.Rows(zhyh)("姓名")) = False Then
                    MessageBox.Show(.Rows(zhyh)("姓名"))
                    Exit For
                End If
                .Rows(zhyh).Move(.rows.count - 3 - 1)
            Next
        End If
    End If
End With
[此贴子已经被作者于2022/12/5 11:40:53编辑过]

--  作者:有点蓝
--  发布时间:2022/12/5 12:03:00
--  
Continue For和Exit For后面的代码都不会执行的,考虑把移动行的代码放到Continue For或者Exit For前面。至于放到哪个前面,自己试把,您的业务逻辑我没看懂

--  作者:采菊东篱下
--  发布时间:2022/12/5 12:37:00
--  
With Tables("临时过渡取数")
    Dim Names As New List(Of String)
    Dim zhyh As Integer
    If (.rows.count - 3) Mod 2 = 1 Then
        For zhcs As Integer = 1 To 4
            Dim drs As List(Of DataRow) = DataTables("比赛积分").SQLSelect("[团体赛或个人赛] = \'个人赛\' And [棋赛名称] = \'2020年迎春杯\' And [分组] = \'综合组\' And [第几轮比赛] = " & zhcs & " And [桌号] >" & 0)
            If drs.count Mod 2 = 1 Then
                Names.Add(drs(drs.count - 1)("姓名"))\'添加比赛积分表每一轮最后一行没有对手的集合成员
            End If
        Next
        \'        MessageBox.Show(Names.count)\'注识的代码是方便查看比赛积分表每一轮没对手的具体姓名,测试后不需要这代码的。
        \'        For Each nm As String In Names
        \'            MessageBox.Show(nm)
        \'        Next
        \'        MessageBox.Show(.rows.count - 3 - 1)
        If Names.Contains(.Rows(.rows.count - 3 - 1)("姓名")) = True Then\'如果Names集合包含临时过渡取数表桌号不为0的最后一行姓名
            For zhyh = .rows.count - 3 - 2 To 0 Step - 1\'则从临时过渡取数表桌号不为0的最后第二行向上查找
                If Names.Contains(.Rows(zhyh)("姓名")) = True Then\'如果Names集合包含临时过渡取数表桌号不为0的这一行姓名,则取消执行这行代码,继续下一行查找。
                    Continue For
                ElseIf Names.Contains(.Rows(zhyh)("姓名")) = False Then
                    \'                    MessageBox.Show(.Rows(zhyh)("姓名"))\'测试
                    \'.Rows(zhyh).Move(.rows.count - 3 - 1)\'如果Names集合不包含临时过渡取数表桌号不为0的这一行姓名,则退出循环,把这行姓名移到桌号不为0的最后一行。
                    Exit For
                End If
            Next
            .Rows(zhyh).Move(.rows.count - 3 - 1)\'如果Names集合不包含临时过渡取数表桌号不为0的这一行姓名,则退出循环,把这行姓名移到桌号不为0的最后一行,但这行代码无论放在这还是上面注识的地方,都弹窗提示不允许移动行。
        End If
    End If
End With
[此贴子已经被作者于2022/12/5 13:01:50编辑过]

--  作者:有点蓝
--  发布时间:2022/12/5 13:33:00
--  
有插入行标记(_sortkey)列的表才能移动行:http://www.foxtable.com/webhelp/topics/1791.htm
--  作者:采菊东篱下
--  发布时间:2022/12/5 15:22:00
--  
谢谢指教,行了。