Office中国论坛/Access中国论坛

标题: “抛物线被截面积”——浅谈查询进度条的实现 [打印本页]

作者: roych    时间: 2011-12-31 16:10
标题: “抛物线被截面积”——浅谈查询进度条的实现
本帖最后由 roych 于 2012-1-3 20:22 编辑

       记得读书时,第一次接触微积分的时候,老师给我们出了一道题目,就是如何求抛物线和坐标轴的截面积。一时间我们面面相觑,有如狗咬刺猬——无从下口。这曲线面积的确无法直接求出来。大家只好口呆目瞪地听老师讲了,“我们按等分坐标轴做垂线,连接与抛物线的交点,得到等高的梯形,然后计算这些梯形的面积之和。当坐标轴被无限地分割后,那么这些梯形的面积之和就越来越接近抛物线的面积了。这就是今天要讲的微积分。”
       后来才知道,在十七世纪的德国,同样也有一个跟我们一样困惑不已的人,不同的是,他最后完美地解决了这个问题。我们的老师沿用的正是他的方法。他的名字叫做莱布尼茨。

       这些似乎和主题无关。然而,不得不提的是,正所谓“工夫在诗外”,我们应当把一些学到的思维方式应用到Access当中,相信能很好地解决一些问题了,正如这些日子热议的查询进度条问题。在执行过程中,查询其实是作为一个整体来运行的,因此往往只能获取运行前后时间,一般来说,细节是不太可能直接显示的,正如前面所提的抛物线截面积一样,至少是不能直接用公式(微积分公式除外)计算的。
      
       但是我们知道,从某个方面上讲,查询不过是一个记录集,而记录集的基本单位是一条记录。换句话说,每一条记录就是我们的一个“梯形”,这一个个“梯形”构成了我们的“抛物线”(记录集)。接下来问题就显而易见了:通过计算这些“梯形”的面积(执行记录的条数),来求“抛物线”面积(执行记录的比例)。这显然不算太难了。

       尽管论坛里有不少关于进度条的实例,不过受此前MM的影响,就以老汉的精华帖《杏花村——进度条》中的实例来一次狗尾续貂吧。希望大家能够从中得到一定的启发。
      为了便于观察数据的进度,实例中的目标是追加10万条记录,特此声明一下(详见附件中的进度条3)。大家可以据此举一反三,试试更新查询或者删除查询等例子。
      [attach]47872[/attach]

      应MM的要求,加上了带子窗体的进度条。
作者: tmtony    时间: 2011-12-31 16:51
一说到抛物线,我立马就晕。数字最差了:)
作者: andymark    时间: 2011-12-31 16:57
学习一下
作者: fnsmydyang    时间: 2011-12-31 17:15
学习了,谢谢分享{:soso_e181:}
作者: ycxchen    时间: 2011-12-31 17:16
roych伟大!
作者: 鱼儿游游    时间: 2011-12-31 18:53
本人功力不够,看不到效果。
作者: 简    时间: 2011-12-31 20:32
谢谢roych版主,老汉不在,你就是最可爱的人了~~~

进度条3正是我想要的效果,我当时一直不知道该如何插入杏花村里的那段代码,现在我晓得了,谢谢你了~~~

顺祝新年快乐,工作顺利!
作者: yanwei82123300    时间: 2011-12-31 21:15
学习一下
作者: roych    时间: 2012-1-1 00:16
鱼儿游游 发表于 2011-12-31 18:53
本人功力不够,看不到效果。

需要在“选项\视图\显示”中勾选状态栏的。之前下载老汉的实例时,我也没看到效果,后来才知道的~~~
作者: t小宝    时间: 2012-1-1 01:03
学习一下,看到抛物线我也晕
作者: asklove    时间: 2012-1-1 09:10
学习一下
作者: 简    时间: 2012-1-2 22:05
我用你的例子,遇到一个问题,即用StatusBarText设置状态栏文字,但在状态栏上却不起作用,状态栏上老是显示正在计算……,没办法,我只好用DoCmd.Echo来显示状态栏文字,但这样有个问题就是,栏态栏上的文字有点闪。

请问这是什么原因呢,DoCmd.Echo和StatusBarText哪个稳定,效率高呢?

我的代码如下:

Dim i As Long
Dim j As String
Dim str As String
Dim k As Long

Dim rst As Object

    Set rst = Me.sub1.Form.Recordset
    rst.MoveFirst
    k = rst.RecordCount
   
'为避免出现状态栏上的正在计算…… 以及屏幕闪动,所以添加DoCmd.Echo    DoCmd.Echo False
    DoCmd.Hourglass True

    For i = 1 To k
   
        j = Format(Round(i / k, 2) * 100, "@@@%")
        
        rst.Edit

        If i Mod (k / 50) = 0 Then
            str = str & "■"
            DoCmd.Echo False, j & " " & str   '没办法,才用DoCmd.Echo
'            Me.cmdA.StatusBarText = j & " " & str    'statusbartext不起作用
        End If
        
        rst!单价= Format((rst!成本价 * 0.92), "0")

        rst.Update
        rst.MoveNext
        
    Next

    rst.MoveFirst
    Set rst = Nothing

    MsgBox "处理完毕!"

    DoCmd.Echo True
    DoCmd.Hourglass False


作者: roych    时间: 2012-1-2 23:41
简 发表于 2012-1-2 22:05
我用你的例子,遇到一个问题,即用StatusBarText设置状态栏文字,但在状态栏上却不起作用,状态栏上老是显示 ...

你的代码似乎漏掉了MoveLast了。建议上传附件看看,此外,如有必要可以考虑优化下查询。——当然这些都需要看附件才能确定的。
作者: 简    时间: 2012-1-3 13:12
roych 发表于 2012-1-2 23:41
你的代码似乎漏掉了MoveLast了。建议上传附件看看,此外,如有必要可以考虑优化下查询。——当然这些都需 ...

我觉得似乎跟moveLast没有多大关系,我把附件传上来了,请看看,附件上我是用echo来实现的,用StatusBarText没有实现出想要的效果,不晓得问题出在哪里。

[attach]47906[/attach]
作者: roych    时间: 2012-1-3 20:27
本帖最后由 roych 于 2012-1-3 20:28 编辑
简 发表于 2012-1-3 13:12
我觉得似乎跟moveLast没有多大关系,我把附件传上来了,请看看,附件上我是用echo来实现的,用StatusBarT ...


大体看了下,应该是DAO的MoveNext方法所致。因此把DAO转换为ADO之后就可以了。
即利用RecordSource属性提取数据源语句,用ADO打开,详细看更新后的附件。

PS:StatusText跟Echo属性,孰优孰劣我还真没测试过。就这个例子而言,似乎不相伯仲。
作者: Charline    时间: 2015-9-3 16:13
谢谢谢谢谢谢谢谢!!!
作者: p51219    时间: 2015-12-3 23:24
000000
作者: p51219    时间: 2015-12-3 23:25
0000
作者: p51219    时间: 2015-12-3 23:25
0000
作者: wuwu200222    时间: 2022-4-24 16:14
学习




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