请高手来帮看看这段代码如何提高效率
我是在ACCESS的VBA里编程。数据库就用的ACCESS 2003,VBA的代码也是直接就写在同一MDB里。用的是DAO.
下面的代码是用来一次性计算层次百分比。关于层次百分比的概念我解释在这个帖子里:http://blog.csdn.net/slowgrace/archive/2009/04/16/4084636.aspx。下面这段代码对一个有两万多条记录的节点表进行计算时需时20分钟,如果用注释掉那个则需时16分钟。注释掉的部分和没注释掉的部分的区别在,注释掉的用的是DAO的edit和update方法,没注释掉的用的是update语句。我真没想到直接用update语句还慢。但不管是哪种都太慢了,是吧?请各位前辈高人指点:
下面的代码是用来一次性计算层次百分比。关于层次百分比的概念我解释在这个帖子里:http://blog.csdn.net/slowgrace/archive/2009/04/16/4084636.aspx。下面这段代码对一个有两万多条记录的节点表进行计算时需时20分钟,如果用注释掉那个则需时16分钟。注释掉的部分和没注释掉的部分的区别在,注释掉的用的是DAO的edit和update方法,没注释掉的用的是update语句。我真没想到直接用update语句还慢。但不管是哪种都太慢了,是吧?请各位前辈高人指点:
'算从lngrootid这个根节点开始的所有子节点(含根节点)的金额和百分比
'并把计算结果放在节点表的相应字段里
'返回根节点的值
Public Function CalValuePercent(strNodeTable As String, lngRootId As Long) As Single
On Error GoTo Err_CalValuePercent
Dim rstNode As DAO.Recordset, rstDetail As DAO.Recordset
Dim strSql As String
Dim sngValue As Single
Dim blnNoChild As Boolean
sngValue = 0
'得到每个孩子的值(递归)并累积自己的值(等于所有孩子的值的总和)
strSql = "SELECT lngNodeId FROM " & strNodeTable & " WHERE lngFatherId = " & lngRootId
Set rstNode = CurrentDb.OpenRecordset(strSql)
If rstNode.EOF Then
blnNoChild = True
Else
blnNoChild = False
While Not rstNode.EOF
sngValue = sngValue + CalValuePercent(strNodeTable, rstNode.Fields("lngNodeId")) '递归调用
rstNode.MoveNext
Wend
End If
rstNode.Close
Set rstNode = Nothing
'将自己的值记录到数据库里
If blnNoChild Then
strSql = "SELECT strDetailTable, lngDetailId FROM " & strNodeTable & " WHERE lngNodeId = " & lngRootId
Set rstNode = CurrentDb.OpenRecordset(strSql)
If IsBasicTable3Db(Nz(rstNode.Fields("strDetailTable"))) Then '如果是基础节点,则从基础表抄value过来
strSql = "SELECT sngValue FROM " & rstNode.Fields("strDetailTable") & " WHERE lngId = " & rstNode.Fields("lngDetailId")
Set rstDetail = CurrentDb.OpenRecordset(strSql)
sngValue = Nz(rstDetail.Fields("sngValue"))
rstDetail.Close
Set rstDetail = Nothing
End If
rstNode.Close
Set rstNode = Nothing
End If
strSql = "UPDATE [" & strNodeTable & "] SET [sngValue] = " & sngValue & " WHERE lngNodeId = " & lngRootId
CurrentDb.Execute strSql
' strSql = "SELECT lngNodeId, strDetailTable, lngDetailId, sngValue FROM " & strNodeTable & " WHERE lngNodeId = " & lngRootId
' Set rstNode = CurrentDb.OpenRecordset(strSql)
' If blnNoChild And IsBasicTable3Db(Nz(rstNode.Fields("strDetailTable"))) Then '如果是基础节点,则从基础表抄value过来
' strSql = "SELECT sngValue FROM " & rstNode.Fields("strDetailTable") & " WHERE lngId = " & rstNode.Fields("lngDetailId")
' Set rstDetail = CurrentDb.OpenRecordset(strSql)
' sngValue = Nz(rstDetail.Fields("sngValue"))
' rstDetail.Close
' Set rstDetail = Nothing
' End If
' rstNode.Edit
' rstNode.Fields("sngValue") = sngValue
' rstNode.Update
' rstNode.Close
' Set rstNode = Nothing
'计算每个孩子的百分比
If Not blnNoChild Then
strSql = "UPDATE [" & strNodeTable & "] SET [sngPercent] = " & _
"IIF(" & sngValue & "=0, 0, [sngValue]/" & sngValue & ") " & _
"WHERE [lngFatherId]=" & lngRootId
CurrentDb.Execute strSql
' strSql = "SELECT lngNodeId, sngValue, sngPercent FROM " & strNodeTable & " WHERE lngFatherId = " & lngRootId
' Set rstNode = CurrentDb.OpenRecordset(strSql)
' While Not rstNode.EOF
' rstNode.Edit
' If sngValue = 0 Then
' rstNode.Fields("sngPercent") = 0
' Else
' rstNode.Fields("sngPercent") = rstNode.Fields("sngValue") / sngValue
' End If
' rstNode.Update
' rstNode.MoveNext
' Wend
' rstNode.Close
' Set rstNode = Nothing
End If
CalValuePercent = sngValue
Exit Function
Err_CalValuePercent:
Stop
Debug.Print ERR.Description
Resume
End Function
...全文
相关推荐
Phenlit 麻烦帮我看看这段程序
登陆的时候帐号密码为123 出现错误的文件为xueshengxinxi 那个页面。运行的时候在学籍管理那里可以看到。(这个版本我把数据库xj里面的班级系别改成了班级专业)
Phenlit 麻烦帮我看看这段程序(新)
刚才那个数据库改了下现在用回原来的<br>登陆号跟密码123<br>在学籍管理-》学生基本信息那里出现问题<br>页面为xueshengxinxi.frm
商城模板类-阿姨帮源代码【含图文文档教程+源码导入教程+操作界面截图】
微信小程序设计项目开发的170套源代码资源,这里是其中的阿姨帮模板类源代码,内部含有阿姨帮源码导入使用说明哦!
你能解释一下这段代码的作用吗
是的,它只是检查您是否不使用公共信息作为密码,因为这样很容易破坏它。 真好!
这段js代码得节约你多少时间
1.应用案例: 代码如下: var Mouse = function () { // Look! no that = this! this.position = [0, 0]; if (document.addEventListener) { document.addEventListener(‘mousemove’, ?); //this.move? } else if (document.attachEvent) { document.attachEvent(“onmousemove”, ?); //this.move?怎么放进去 } }; Mouse.prototype.move =


