Office中国论坛/Access中国论坛

标题: 求教:有没有比这个方法运行速度更快的方法! [打印本页]

作者: 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

End Function


[attach]549[/attach]
作者: 竹笛    时间: 2003-5-27 05:09
上面的函数在调试时我无法运行。
作者: binuochao    时间: 2003-5-27 05:37
我这正常,我的系统是access2000 +win98或win2000高级版!
作者: binuochao    时间: 2003-5-27 05:38
点击窗体上的[预鉴]不行吗!
作者: Trynew    时间: 2003-5-27 08:04
Re:用DAO代替DLookup,测试了一下,速度提高了,也可以试一下在查询里用 加班:iif([1]="加",1,0)+iif([2]="加",1,0)+...+iif([31]="加",1,0),不过录入太烦了,我也没试过:(。


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

End Function




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3