Office中国论坛/Access中国论坛

标题: [求助]使用ADO速度还是慢 [打印本页]

作者: gdfsslec    时间: 2007-4-9 22:46
标题: [求助]使用ADO速度还是慢
[attach]23887[/attach]
在上面的例子中,自定义函数的计算速度很慢(需要这个函数,原来的有循环计算的,为了避免问题复杂化,这里简化了)。

OPEN这句对速度影响最大,其次是DCOUNT。

有什么办法可以解决呢?请高手指导!

谢谢先!
作者: wwwwa    时间: 2007-4-9 23:02

    'If DCount("*", "查询结果") = 0 Then->

If rs.EOF Or rs.BOF Then
作者: gdfsslec    时间: 2007-4-10 00:10
谢谢wwwwa大师!速度比DCOUNT要快的多!

第一个影响最关键的有办法吗?

请继续指教!
作者: gdfsslec    时间: 2007-4-11 03:39
请高手指点一二,比如其他方向
作者: andymark    时间: 2007-4-11 04:00
把具体要求说一下,实现查询也许有更好的方法
作者: gdfsslec    时间: 2007-4-11 06:16
谢谢ANDYMARK大师先!

我要计算最长超期天数,方法是先计算出超期金额(这个容易实现),然后根据该客户的放帐天数,计算起始应付日期,接着倒算达到超期金额的最后一笔出货,找到这一天,就计算出最长的超期天数了。倒算是用循环语句实现的,无法在查询中用合计函数形成可用表达式,因此使用了自定义函数。开始用了DLOOKUP和DSUM等,更慢。现在是用ADO调用查询,然后在查询记录集中使用循环测算,但是速度还是慢。主要是反复打开这个查询造成的,不知道对不?

改变数据结构可以搞掂,但对使用者会带来一点麻烦。

不知道是否表达清楚了。
作者: andymark    时间: 2007-4-11 06:26
直接用查询应能实现的, 为方便理解,把结果贴上来
作者: gdfsslec    时间: 2007-4-11 06:55
If cq > 0.01 Then
                inta = 0
                inidq = Now() - Me.»õµ½¸¶¿îÌìÊý
                rs.Open "²éѯ½á¹û", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
                rs.MoveFirst
                inida = rs("·¢ÉúÈÕÆÚ")
                rs.MoveLast
                Do Until rs.Fields("·&cent;&Eacute;ú&Egrave;&Otilde;&AElig;&Uacute;") < inidq
                    inid = rs("·&cent;&Eacute;ú&Egrave;&Otilde;&AElig;&Uacute;")
                    If inid = inida Then
                        MsgBox FormatDateTime(inid, vbLongDate) & "&Ouml;&reg;&Ccedil;°&Atilde;&raquo;&Oacute;&ETH;&sup3;&ouml;&raquo;&otilde;&frac14;&Ccedil;&Acirc;&frac14;"
                    Exit Do
                    End If
                    rs.MovePrevious
                Loop
                Do Until inta >= (cq - 0.01) * 10000
                    inta = inta + rs("&sup3;&ouml;&raquo;&otilde;&frac12;&eth;&para;&icirc;")
                    inid = rs("·&cent;&Eacute;ú&Egrave;&Otilde;&AElig;&Uacute;")
                    If inid = inida Then
                        MsgBox FormatDateTime(inid, vbLongDate) & "&Ouml;&reg;&Ccedil;°&Atilde;&raquo;&Oacute;&ETH;&sup3;&ouml;&raquo;&otilde;&frac14;&Ccedil;&Acirc;&frac14;"
                    Exit Do
                    End If
                    rs.MovePrevious
                Loop
                strsqlcq = "select * from &sup2;é&Ntilde;&macr;&frac12;á&sup1;&ucirc; where ·&cent;&Eacute;ú&Egrave;&Otilde;&AElig;&Uacute;<= #" & inidq & "# and ·&cent;&Eacute;ú&Egrave;&Otilde;&AElig;&Uacute;>= #" & inid & "# and &sup3;&ouml;&raquo;&otilde;&frac12;&eth;&para;&icirc;<>0"
                Me.&sup3;&not;&AElig;&Uacute;&sup2;é&Ntilde;&macr;×&Oacute;&acute;°&Igrave;&aring;.Form.RecordSource = strsqlcq
                Me.&sup3;&not;&AElig;&Uacute;&sup2;é&Ntilde;&macr;×&Oacute;&acute;°&Igrave;&aring;.Requery
                MsgBox FormatDateTime(inid, vbLongDate) & "&Ouml;&reg;&Ccedil;°&Atilde;&raquo;&Oacute;&ETH;&sup3;&ouml;&raquo;&otilde;&frac14;&Ccedil;&Acirc;&frac14;"
            Else
                strWhere = ""
                strWhere = strWhere & "([&iquest;&Iacute;&raquo;§&Atilde;&ucirc;&sup3;&AElig;] like '" & "&sup3;&otilde;&Ecirc;&frac14;×&Oacute;&acute;°&Igrave;&aring;&sup2;&raquo;&Iuml;&Ocirc;&Ecirc;&frac34;&Egrave;&Icirc;&ordm;&Icirc;&Auml;&Uacute;&Egrave;&Yacute;" & "')"
                Me.&sup3;&not;&AElig;&Uacute;&sup2;é&Ntilde;&macr;×&Oacute;&acute;°&Igrave;&aring;.Form.Filter = strWhere
                Me.&sup3;&not;&AElig;&Uacute;&sup2;é&Ntilde;&macr;×&Oacute;&acute;°&Igrave;&aring;.Form.FilterOn = True
            End If


作者: gdfsslec    时间: 2007-4-11 06:57
不知道为什么会乱码[em06]

您说的结果是这个吗?这样的循环一共有8个。
作者: andymark    时间: 2007-4-11 07:07
不是,是查询后的最终结果
作者: zxzx2733    时间: 2007-4-11 08:56
在VBA中复时的输入法与在网页中粘贴时的输入法相同就不会出现乱码
作者: yori2007    时间: 2008-1-26 11:12





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