Office中国论坛/Access中国论坛

标题: #如何查询余额?# [打印本页]

作者: eio    时间: 2003-5-4 22:50
标题: #如何查询余额?#
如:
1-1    进1000元    余1000元
1-2    支800元     余200元
1-3    进3500元    余3700元
需要用查询完成这个余?
作者: zhengjialon    时间: 2003-5-4 23:40
http://www.office-cn.net/bbs/dispbbs.asp?boardid=9&id=771
作者: eio    时间: 2003-5-5 00:11
就是此贴!谢谢!可是查询的速度很慢!只有100多的测试记录,需要2秒打开?哇哇◎


[此贴子已经被作者于2003-5-4 16:23:31编辑过]


作者: eio    时间: 2003-5-5 00:27
不知大家有否认真的测试过!敬请tom**关注!!!!!!
作者: eio    时间: 2003-5-6 22:30
关心一下吧!大家!
作者: Roadbeg    时间: 2003-5-7 01:51
给你做了个例子,
在使用此例子之前,请先调用模块中 "产生随机记录" 函数以产生 600000 条随机记录.
用以检验函数在记录较多时的效率.

首先,我把判断条件由日期型数据改为 long 型的 id 了,这样速度会快很多.
改用 id 后,使用 lwwvb 版主的函数在 5000 条记录以下时,都不会有慢的感觉,
在浏览第 15000 条记录时,可以明显的感觉出我的函数与  lwwvb 版主的函数之间的速度优势.在浏览第 200000 条记录以后时,大家会有更深的体验.
但使用我的函数,如果在打开查询后基础数据表里的值发生改变,不能自动更新余额,必须调用 resetbalance 函数强制刷新,或重新打开查询(好像 lwwvb版主 的也有此问题)

[attach]342[/attach]
作者: eio    时间: 2003-5-8 03:41
谢谢!
作者: cg1    时间: 2003-5-8 06:15
思路不错,采用差量计算来解决余额计算时间长的问题。

我以毫秒级进行测试,的确速度较快!

但是并不明显,7万条数据,两者相差约2-4毫秒差距,但是有时候仍然会交错,甚至你的方法更慢。(我用 currentproject.connection.execute 来测试的)

你用打开查询的方法来估计,恐怕并不十分准确。

你也说了,你的结果集可以说是静态的,而原来的则是动态的,这就是为什么直接看,你的效果似乎更好的原因




[此贴子已经被作者于2003-5-7 22:24:56编辑过]


作者: Roadbeg    时间: 2003-5-8 16:15
所以我的随机函数是产生 60万条记录.在上10万的记录级数上,差异会很明显.

在记录较少时,比如少于1000 条,我的方法可能会更慢,因为多了很多判断语句.

静态的结果是它的一大问题,所以注定它只能用于检索一些已确认不会随时更改的数据,至少是在查询开始后,基础数据不会再更改.它的一般应用只能是:1.查询上月的余额情况.2.在单机版中可能有更好的应用,因为数据更改都是来自本机的,一般不会出现查询开始后,更改其基础表数据的情况.

另,使用 execute 执行的查询也不能最终体现速度差异,因为 access在打开查询时并没有返回全部结果,在 使用 movelast 之前, recordcount 不能返回正确的结果也就是这个原因.你如果能用两种方法分别返回一个记录集,并对记录进行遍历,也就是说从 first 一直 movenext 到 last.再分别比较两者的时间.这才是最终的时间差异.




[此贴子已经被作者于2003-5-8 9:26:24编辑过]


作者: whowho    时间: 2003-5-8 16:57
最简单的方法:
数据表包括以下字段:日期、进、支、余额,每次增加纪录时,输入日期、进或支后,进行更新查询来更新余额,即余额=余额+进(或-支)。每次打开时,数据表已经有余额了,不需要再经过计算,快!注意:纪录输入后不能回头更改!旧纪录如果入错了,需要另入一条更正纪录来更正,这样也符合财务要求,是吗?

作者: Roadbeg    时间: 2003-5-8 17:04
以下是引用whowho在2003-5-8 8:57:25的发言:
最简单的方法:
数据表包括以下字段:日期、进、支、余额,每次增加纪录时,输入日期、进或支后,进行更新查询来更新余额,即余额=余额+进(或-支)。每次打开时,数据表已经有余额了,不需要再经过计算,快!注意:纪录输入后不能回头更改!旧纪录如果入错了,需要另入一条更正纪录来更正,这样也符合财务要求,是吗?


你所说的是计算式余额,而在此讨论的是查询式余额.它们有各自的优点,不能说计算式就一定优于查询式,也不是说查询式就一定可以代替计算式.

其实计算式余额也可以做到记录错误回头更改的,比如我的计算式库存就可以修改错误数据.

作者: Trynew    时间: 2003-5-8 18:35
Roadbeg 的这个方法在浏览一万几千条记录时效果就很明显了。
只是60万条记录求余额的情况我还想象不出会在那里发生,(如果是我的存折记录就发达了:),我应用中最多就几百条。


作者: 小溪    时间: 2003-10-8 23:31
标题: [求助]
[quote]以下是引用whowho在2003-5-8 8:57:25的发言:
最简单的方法:
数据表包括以下字段:日期、进、支、余额,每次增加纪录时,输入日期、进或支后,进行更新查询来更新余额,即余额=余额+进(或-支)。每次打开时,数据表已经有余额了,不需要再经过计算,快!注意:纪录输入后不能回头更改!旧纪录如果入错了,需要另入一条更正纪录来更正,这样也符合财务要求,是吗?


不怕你见笑,我是天下第一菜鸟,能否告诉我如何做输入记录后马上更新余额的更新查询?
[em07]




[此贴子已经被作者于2003-10-8 15:52:57编辑过]


作者: ADAM    时间: 2003-10-9 18:02
其實用個函數也可實現的.如下:
(以下函數是從本站上學習的)
Public Function F(S As String, D As DATE)
Dim A As Double
Dim B As Double
On Error GoTo ERR_F
A = Nz(DSum("[進]", "DATA2", "[日期]<=#" & D & "#"))
B = Nz(DSum("([支]", "DATA2", "[日期]<=#" & D & "#"))

F = A - B

EXIT_F:
Exit Function

ERR_F:
F = 0
End Function

作者: 小溪    时间: 2003-10-9 19:50
如果日期字段中记录不唯一,可能计算会出错。
作者: 盗到稻    时间: 2003-10-10 00:11
可参考一下
Public Sub 分类帐补余额_贷方余额()
    '本宏为贷方余额者,若生成贷方余额,则以负号表示.
Dim varBalance As Double, strLedger As String
Dim rs1 As Recordset
Set rs1 = New ADODB.Recordset
    '指定rs1的联接数据库为目前打开的数据库
rs1.ActiveConnection = CurrentProject.Connection
    On Error GoTo 错误式
    strLedger = InputBox("请输入你要补余额的分类帐表的名称", "基础理论")
        '使用open方法打开刚生成的表 [? ?分类帐]
    rs1.Open strLedger, , adOpenKeyset, adLockOptimistic, adCmdTable
        '先设余额等于零
    varBalance = 0
        '使用Do Loop循环在表记录集合中逐笔往下计算本日余额
    Do Until rs1.EOF
        'rs1.Cancelupdate
        rs1("余额") = rs1!贷方金额 - rs1!借方金额 + varBalance
        rs1.Update
        varBalance = rs1!余额
        rs1.MoveNext
    Loop
    MsgBox "余额字段已替你补好了,你不必自己计算"
    DoCmd.SelectObject acTable, strLedger, True
    DoCmd.OpenTable strLedger, acViewNormal, acEdit
    DoCmd.GoToControl "余额"


[此贴子已经被作者于2003-10-9 16:11:12编辑过]


作者: dhqian-qp    时间: 2006-3-4 21:52
thks!
作者: binzhouxc721521    时间: 2006-3-5 07:31
access在财务中的应用,这本书里就有这样的例子,可以去找一下。
作者: 王维a780    时间: 2006-5-22 08:24
sdghjg
作者: yqxxjymc    时间: 2009-10-20 15:56
Roadbeg 的方法在浏览几万条记录时效果很明显




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