标题: 求教:有没有比这个方法运行速度更快的方法! [打印本页] 作者: binuochao 时间: 2003-5-27 03:51 标题: 求教:有没有比这个方法运行速度更快的方法! 我制作了一个考勤表输入,为统计每种出勤情况,我做了如下函数:并在查询中使用此函数,但运行时很慢。(每个日期[即1-31号]为一个字段。)有谁有更好的方法。不改变表结构思路的方法!
Function KSum(DD As String, ID As Integer) As Integer
Dim h, J As Integer
J = 0
For h = 1 To 31
On Error GoTo ER
' MsgBox (DLookup("[" & CStr(h) & "]", "考勤表SUB", "[ID]=" & ID))
kk = IIf(DLookup("[" & CStr(h) & "]", "考勤表SUB", "[ID]=" & ID) = DD, 1, 0)
J = J + kk
Next h
KSum = J
Exit Function
ER:
If Err() = 94 Then
kk = 0
Else
MsgBox (Err())
End If
Resume Next
Function KSum(DD As String, ID As Integer) As Integer
Dim h, J As Integer
Dim rst As DAO.Recordset
Set rst = CurrentDb().OpenRecordset("select * from 考勤表SUB")
rst.FindFirst "[ID]=" & ID
J = 0
For h = 1 To 31
On Error GoTo ER
' MsgBox (DLookup("[" & CStr(h) & "]", "考勤表SUB", "[ID]=" & ID))
kk = IIf(rst("" & h & "") = DD, 1, 0)
J = J + kk
Next h
KSum = J
Exit Function
ER:
If Err() = 94 Then
kk = 0
Else
MsgBox (Err())
End If
Resume Next
End Function 作者: binuochao 时间: 2003-5-27 17:55
DAO的方法我刚才测试了,效果非常好,比原先速度提高了13倍多。(使用时要先引用一下ADO!)至于在查询中用IIF()的方法,我试过了,跟用我的函数,大至上没什么明显的区别!(因为我对DAO、sol查询语名一点都不懂)。
不知道各位还有没有其它方法。不过,在速度上是一方面。在思路上又是另一方面,思路可是程序的生命!请大伙发挥一下你的的思路吧!作者: Trynew 时间: 2003-5-28 06:03
Function KSum(ParamArray Ary()) As Integer
Dim i As Integer
For i = 1 To UBound(Ary)
KSum = KSum + IIf(Ary(i) = Ary(0), 1, 0)
Next
End Function
查询里 加班:Ksum("加",[1],[2],[3].......[20])+Ksum("加",[21],[22],[23].......[31])
这种方法速度最快,因为只用到本记录的字段作参数,其实和在查询里直接用IIF计算是一样的,你试的时候可能是没把所有的计算字段更换,还用到你的函数,所以没什么明显的区别。
[attach]569[/attach] 作者: binuochao 时间: 2003-5-29 05:22
班主可真行。其实我所用的与直接用IIF()写没区别:KNum()+KNum() 的方法 不过速度很慢。用数组的方法没有想到过!再次谢谢!又多长的见识!
Function KNum(JR As String, Dh As String) As Integer
If JR = Dh Then
KNum = 1
Else
KNum = 0
End If