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 |