以文本方式查看主题

-  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=51007)

--  作者:aygp
--  发布时间:2014/5/16 21:01:00
--  代码优化
以下代码可以正常执行,但有二个问题,1、执行速度很慢,300条成绩在二表之间转入需要2分钟才能执行完成;2、在 2分钟的等待过程中屏幕给人以假死现象。请老师将 以下代码给以优化,提高执行速度。

For Each r As Row In Tables("成绩管理").Rows
    Dim dr As DataRow = DataTables("成绩导入").Find("注册学号 = \'" & r("注册学号") & "\' And 姓名 = \'" & r("姓名") & "\'")
    If dr IsNot Nothing Then
        For Each s As String In "成绩".Split("|")
            r(s) = dr(s)
        Next
    End If
Next

--  作者:y2287958
--  发布时间:2014/5/16 21:07:00
--  
上例子。
--  作者:程兴刚
--  发布时间:2014/5/16 23:19:00
--  
Dim dr As DataRow
For Each r As Row In Tables("成绩管理").Rows
     dr = DataTables("成绩导入").Find("注册学号 = \'" & r("注册学号")  & "\'")
    If dr IsNot Nothing Then
          r("成绩") = dr(“成绩”)
    End If
Next

--  作者:程兴刚
--  发布时间:2014/5/16 23:20:00
--  
用其它办法会更快,但需要示例文件!
--  作者:逛逛
--  发布时间:2014/5/17 8:43:00
--  

看看狐爸的帮助,  http://www.foxtable.com/help/topics/2225.htm

 

试试把查询和赋值分开,是否有用。


--  作者:lsy
--  发布时间:2014/5/17 9:01:00
--  
下面的代码,有三个循环,虽然只有300条记录,但循环的排列组合,就惊人了。
For Each r As Row In Tables("成绩管理").Rows \'1
    Dim dr As DataRow = DataTables("成绩导入").Find("注册学号 = \'" & r("注册学号") & "\' And 姓名 = \'" & r("姓名") & "\'") \'2
    If dr IsNot Nothing Then
        For Each s As String In "成绩".Split("|") \'3
            r(s) = dr(s)
        Next
    End If
Next
 
把例子传上来,让大家试试,有没有变通的方法,提高效率。

--  作者:aygp
--  发布时间:2014/5/18 12:16:00
--  
我现在把例子上传,由于商业版有点问题,所以上传了专业版,请各位老师指导!
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:成绩导入.rar



图片点击可在新窗口打开查看此主题相关图片如下:要实现的效果.jpg
图片点击可在新窗口打开查看



--  作者:有点甜
--  发布时间:2014/5/18 14:35:00
--  

 datacolchanged事件影响的。

 

SystemReady = False
For Each r As Row In Tables("成绩管理").Rows
    Dim dr As DataRow = DataTables("成绩导入").Find("注册学号 = \'" & r("注册学号") & "\' And 姓名 = \'" & r("姓名") & "\'")
    If dr IsNot Nothing Then
        For Each s As String In "成绩".Split("|")
            r(s) = dr(s)
        Next
    End If
Next
SystemReady = True

 


--  作者:aygp
--  发布时间:2014/5/18 19:49:00
--  
甜老师,我希望取消datacolchanged事件的以下代码,改用‘按钮’代码来实现以下功能。也就是等到毕业生的所有课程的成绩都录入以后,把毕业生筛选出来,再使用‘按钮’代码来实现"毕业成绩" = "成绩不合格" 和 "毕业成绩" = "成绩合格" 的判断,这样更科学些,请问‘按钮’代码如何写?

Select Case e.DataCol.Name
    Case "注册学号","成绩","补考","补考2","补考3"
        Dim drs1,drs2 As List(of DataRow)
        drs1 = e.DataTable.Select("注册学号 = \'" & e.DataRow("注册学号") & "\' And Substring([注册年级],1,4) = \'" & Date.Today.Year - 3 & "\'")
        drs2 = e.DataTable.Select("注册学号 = \'" & e.DataRow("注册学号") & "\' And 最终成绩 = \'及格\' And Substring([注册年级],1,4) = \'" & Date.Today.Year - 3 & "\'")
        If drs1.Count > 0 Then
            If drs1.Count > drs2.Count
                For i As Integer = 0 To drs1.Count - 1
                    If drs1(i)("最终成绩") = "不及格" Then
                        drs1(i)("毕业成绩") = "成绩不合格"
                        Exit For
                    End If
                Next
            Else
                drs1(0)("毕业成绩") = "成绩合格"
            End If
        End If
End Select


--  作者:有点甜
--  发布时间:2014/5/18 20:07:00
--  

 如下

 

For Each dr As DataRow In DataTables("成绩管理").DataRows
    Dim drs1, drs2 As List(of DataRow)
    drs1 = DataTables("成绩管理").Select("注册学号 = \'" & dr("注册学号") & "\' And Substring([注册年级],1,4) = \'" & Date.Today.Year - 3 & "\'")
    drs2 = DataTables("成绩管理").Select("注册学号 = \'" & dr("注册学号") & "\' And 最终成绩 = \'及格\' And Substring([注册年级],1,4) = \'" & Date.Today.Year - 3 & "\'")
    If drs1.Count > 0 Then
        If drs1.Count > drs2.Count
            For i As Integer = 0 To drs1.Count - 1
                If drs1(i)("最终成绩") = "不及格" Then
                    drs1(i)("毕业成绩") = "成绩不合格"
                    Exit For
                End If
            Next
        Else
            drs1(0)("毕业成绩") = "成绩合格"
        End If
    End If
Next