Foxtable(狐表)用户栏目专家坐堂 → [求助]点上面的国开教室安排老是计算要很长时间,而且死机,哪位高手有设有更好的计算方法?求助


  共有2493人关注过本帖树形打印复制链接

主题:[求助]点上面的国开教室安排老是计算要很长时间,而且死机,哪位高手有设有更好的计算方法?求助

帅哥哟,离线,有人找我吗?
zgjmost
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:498 积分:4611 威望:0 精华:0 注册:2013/4/25 8:02:00
[求助]点上面的国开教室安排老是计算要很长时间,而且死机,哪位高手有设有更好的计算方法?求助  发帖心情 Post By:2016/12/6 20:47:00 [显示全部帖子]

[求助]点上面的国开教室安排老是计算要很长时间,而且死机,哪位高手有设有更好的计算方法?求助

http://url.cn/42DL4nG

程序在上面的连接中!

谢谢

 回到顶部
帅哥哟,离线,有人找我吗?
zgjmost
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:498 积分:4611 威望:0 精华:0 注册:2013/4/25 8:02:00
  发帖心情 Post By:2016/12/7 6:44:00 [显示全部帖子]

你这个代码没改变
你试过吗?

 回到顶部
帅哥哟,离线,有人找我吗?
zgjmost
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:498 积分:4611 威望:0 精华:0 注册:2013/4/25 8:02:00
  发帖心情 Post By:2016/12/7 7:36:00 [显示全部帖子]

Dim cls As List(Of DataRow) = DataTables("可供安排的教室").Select("", "优先使用顺序")

Dim dt As DataTable = DataTables("国开秩序安排")
dt.ResumeRedraw
dt.StopRedraw

'尽量不要一次性计算全部,因为运算是很慢的
Dim rqsjs As List(Of String()) = dt.GetValues("考试地址|日期|时间")
For Each rqsj() As String In rqsjs
    vars("cidx") = 0
    Dim filter As String = "考试地址 = '" & rqsj(0) & "' and 日期 = '" & rqsj(1) & "' and 时间 = '" & rqsj(2) & "'"
    Dim drs As List(Of DataRow) = dt.Select(filter, "人数 desc")
    Dim Ispick As new List(of Integer)
    Dim b(drs.Count-1) As Integer
    For i As Integer = 1 To drs.Count
        If i <= drs.Count - IsPick.Count Then
            e.Form.Controls("显示").Text = rqsj(0) & " " & rqsj(1) & " " & rqsj(2) & "(" & i & " " & drs.Count & " " & IsPick.count & ")"
            application.DoEvents
            Functions.Execute("组合排列", drs, b.length, i, b, i, cls, IsPick)
        End If
    Next
    Dim left As Integer = cls(vars("cidx"))("最大安排人数")
    For i As Integer = drs.count - 1 To 0 Step -1
        If Ispick.Contains(i) = False Then
            If left >= drs(i)("人数") Then
                drs(i)("教室") = cls(vars("cidx"))("教室名称")
                left -= drs(i)("人数")
            Else
                vars("cidx") += 1
                If cls.Count > vars("cidx") Then
                    left = cls(vars("cidx"))("最大安排人数")
                    drs(i)("教室") = cls(vars("cidx"))("教室名称")
                    left -= drs(i)("人数")
                Else
                    drs(i)("教室") = "教室不够"
                End If
            End If
        End If
    Next
Next
dt.ResumeRedraw

Tables("国开秩序安排").Sort = "考试地址,短日期,起始时间,人数"
   
    Dim Book2 As New XLS.Book(ProjectPath & "Attachments\国考秩序安排教室.xls ")
    Dim fl1 As String = ProjectPath & "Reports\国考秩序安排供安排之用(有建议教室安排).xls"
    Book2.Build() '生成细节区
    Book2.Save(fl1) '保存工作簿

msgbox("祝贺您!国考教室安排建议计算完毕,实际安排以您的最终安排为准!")

 回到顶部
帅哥哟,离线,有人找我吗?
zgjmost
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:498 积分:4611 威望:0 精华:0 注册:2013/4/25 8:02:00
  发帖心情 Post By:2016/12/7 7:43:00 [显示全部帖子]

对程序又进行了优化,但还是计算中断

http://url.cn/42E5X8N

Dim cls As List(Of DataRow) = DataTables("可供安排的教室").Select("", "优先使用顺序")

Dim dt As DataTable = DataTables("国开秩序安排")
dt.ResumeRedraw
dt.StopRedraw

'尽量不要一次性计算全部,因为运算是很慢的
Dim rqsjs As List(Of String()) = dt.GetValues("考试地址|日期|时间")
For Each rqsj() As String In rqsjs
    vars("cidx") = 0
    Dim filter As String = "考试地址 = '" & rqsj(0) & "' and 日期 = '" & rqsj(1) & "' and 时间 = '" & rqsj(2) & "'"
    Dim drs As List(Of DataRow) = dt.Select(filter, "人数 desc")
    Dim Ispick As new List(of Integer)
    Dim b(drs.Count-1) As Integer
    For i As Integer = 1 To drs.Count
        If i <= drs.Count - IsPick.Count Then
            e.Form.Controls("显示").Text = rqsj(0) & " " & rqsj(1) & " " & rqsj(2) & "(" & i & " " & drs.Count & " " & IsPick.count & ")"
            application.DoEvents
            Functions.Execute("组合排列", drs, b.length, i, b, i, cls, IsPick)
        End If
    Next
    Dim left As Integer = cls(vars("cidx"))("最大安排人数")
    For i As Integer = drs.count - 1 To 0 Step -1
        If Ispick.Contains(i) = False Then
            If left >= drs(i)("人数") Then
                drs(i)("教室") = cls(vars("cidx"))("教室名称")
                left -= drs(i)("人数")
            Else
                vars("cidx") += 1
                If cls.Count > vars("cidx") Then
                    left = cls(vars("cidx"))("最大安排人数")
                    drs(i)("教室") = cls(vars("cidx"))("教室名称")
                    left -= drs(i)("人数")
                Else
                    drs(i)("教室") = "教室不够"
                End If
            End If
        End If
    Next
Next
dt.ResumeRedraw

Tables("国开秩序安排").Sort = "考试地址,短日期,起始时间,人数"
   
    Dim Book2 As New XLS.Book(ProjectPath & "Attachments\国考秩序安排教室.xls ")
    Dim fl1 As String = ProjectPath & "Reports\国考秩序安排供安排之用(有建议教室安排).xls"
    Book2.Build() '生成细节区
    Book2.Save(fl1) '保存工作簿

msgbox("祝贺您!国考教室安排建议计算完毕,实际安排以您的最终安排为准!")

主要是上面这段代码能不能优化?



 回到顶部
帅哥哟,离线,有人找我吗?
zgjmost
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:498 积分:4611 威望:0 精华:0 注册:2013/4/25 8:02:00
  发帖心情 Post By:2016/12/7 7:43:00 [显示全部帖子]

自定义函数

 

组合排列

 

Dim a As object = args(0)

Dim n As Integer = args(1)

Dim m As Integer = args(2)

Dim b() As Integer = args(3)

Dim Mm As Integer = args(4)

Dim cls As object = args(5)

Dim IsPick As Object = args(6)

 

For i As Integer = n To m Step -1

    If IsPick.Contains(i-1) = False Then

        b(m-1) = i-1

        If m > 1 Then

            Functions.Execute("组合排列", a, i-1, m-1, b, Mm, cls, IsPick)

        Else

            Dim sum As Double = 0

            For j As Integer = 0 To Mm - 1

                If IsPick.Contains(b(j)) Then Return Nothing

                sum += a(b(j))("人数")

            Next

            If sum = cls(vars("cidx"))("最大安排人数") Then

                For j As Integer = Mm - 1 To 0 Step -1

                    a(b(j))("教室") = cls(vars("cidx"))("教室名称")

                    IsPick.add(b(j))

                Next

                vars("cidx") += 1

            End If

        End If

    End If

Next

 

全局代码

 

Default

 

Public delimg As Image = GetImage("del.png")

 还有上面这个能不能优化下!


 回到顶部
帅哥哟,离线,有人找我吗?
zgjmost
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:498 积分:4611 威望:0 精华:0 注册:2013/4/25 8:02:00
  发帖心情 Post By:2016/12/7 9:35:00 [显示全部帖子]

Dim cls As List(Of DataRow) = DataTables("可供安排的教室").Select("", "优先使用顺序")

Dim dt As DataTable = DataTables("国开秩序安排")
dt.ResumeRedraw
dt.StopRedraw

'尽量不要一次性计算全部,因为运算是很慢的
Dim rqsjs As List(Of String()) = dt.GetValues("考试地址|日期|时间")
For Each rqsj() As String In rqsjs
    vars("cidx") = 0
    Dim filter As String = "考试地址 = '" & rqsj(0) & "' and 日期 = '" & rqsj(1) & "' and 时间 = '" & rqsj(2) & "'"
    Dim drs As List(Of DataRow) = dt.Select(filter, "人数 desc")
    Dim Ispick As new List(of Integer)
    Dim b(drs.Count-1) As Integer
    For i As Integer = 1 To drs.Count
        If i <= drs.Count - IsPick.Count Then
            e.Form.Controls("显示").Text = rqsj(0) & " " & rqsj(1) & " " & rqsj(2) & "(" & i & " " & drs.Count & " " & IsPick.count & ")"
            application.DoEvents
            Functions.Execute("组合排列", drs, b.length, i, b, i, cls, IsPick)
        End If
    Next
    Dim left As Integer = cls(vars("cidx"))("最大安排人数")
    For i As Integer = drs.count - 1 To 0 Step -1
        If Ispick.Contains(i) = False Then
            If left >= drs(i)("人数") Then
                drs(i)("教室") = cls(vars("cidx"))("教室名称")
                left -= drs(i)("人数")
            Else
                vars("cidx") += 1
                If cls.Count > vars("cidx") Then
                    left = cls(vars("cidx"))("最大安排人数")
                    drs(i)("教室") = cls(vars("cidx"))("教室名称")
                    left -= drs(i)("人数")
                Else
                    drs(i)("教室") = "教室不够"
                End If
            End If
        End If
    Next
Next
dt.ResumeRedraw

Tables("国开秩序安排").Sort = "考试地址,短日期,起始时间,人数"
   
    Dim Book2 As New XLS.Book(ProjectPath & "Attachments\国考秩序安排教室.xls ")
    Dim fl1 As String = ProjectPath & "Reports\国考秩序安排供安排之用(有建议教室安排).xls"
    Book2.Build() '生成细节区
    Book2.Save(fl1) '保存工作簿

msgbox("祝贺您!国考教室安排建议计算完毕,实际安排以您的最终安排为准!")

 回到顶部