Office中国论坛/Access中国论坛

标题: 如何用存储过程实现累计? [打印本页]

作者: access2sql    时间: 2002-10-28 20:33
标题: 如何用存储过程实现累计?
'如何用存储过程实现累计?用存储过程如何实现下列的程序所能做到的功能
'表的名称:tbleA  有2个字段,收入 纪录平时每一笔的收入金额,收入累计 用来做每天的累计收入
sub lei_ji()
dim a as long
dim rs as dao.recordset
set rs = currentdb.openrecordset("tableA")
rs.movefirst
do untile rs.eof
a=rs("收入")+a
rs.edit
rs("收入累计")=a
rs.update
rs.movenext
loop
end sub
作者: HG    时间: 2002-10-28 21:03
不明白,你為什麼樣這作。
作者: access2sql    时间: 2002-10-29 00:11
需要累计功能

日期       收入金额    累计金额
2002-01-01    200,000     200,000
2002-01-25    400,000     600,000
2002-08-05   5,000,000    5,600,000

hg 老大,你如何实现这样的功能?最好是用查询(存储过程或者试图)动态的生成 累计金额这个字段

我不是很懂,才看了3天的帮助,想开始实践,可惜一开始就碰到这个难题,我原来使用 MDB 的,没这个问题
[此贴子已经被作者于2002-10-28 16:11:06编辑过]


作者: HG    时间: 2002-10-29 01:39
你是以什麼為單位,是以每一天為單位還是以每一筆為單位。
這樣累計有什麼用,您若告訴我,我就一定幫你寮現這個功能。
這都是好奇心在作怪。
作者: access2sql    时间: 2002-10-29 01:48
每条记录是以日为单位的。

用处很多,首先,上述查询生成后我要将生成后的数据用一条TransferDatabase导出为txt格式文件上交公司(公司规定要这样)
其次,收入累计 - 支出累计 = 余额
我要计算余额用,因为是可用资金报表,所以必须显示将来每天的余额,我曾经考虑过作成报表,但领导说报表翻页不如直接拉查询的滚动条方便
再次,我的库存数据库使用到了上述的方法,也要解决累计问题
作者: HG    时间: 2002-10-29 02:01
原來如因,以日為單位,你可以這樣
select year(日期) as 年,month(日期) as 月,day(日期) as 日,sum(收入金額)as day_sum
from 收入表
where year(日期)=year(getdate) and month(日期)=month(getdate) and day(日期) in(1-31)
group by  year(日期),month(日期),day(日期)
-----------------------------------------------------------------------------------
這裡(1-31)你可以寫成(1,2,3直到31即可)
我想您的余額也是以日作為單位的吧。
如果你不是以日為單位,而是以每一筆為單位,則要用觸發器來實現。


[此贴子已经被HG于2002-10-28 18:01:23编辑过]


作者: access2sql    时间: 2002-10-29 02:13
奥 ,非常感谢,生成公司要的报表的问题您已经帮我解决了,不过下面看来还要请教关于触发器的设计


[此贴子已经被作者于2002-10-28 18:12:55编辑过]


作者: HG    时间: 2002-10-29 02:14
關於觸發器,在論壇上有大量的教程,可以查找一下,寫的很祥細的。
作者: access2sql    时间: 2002-10-29 02:15
好的,我先去找找看
作者: access2sql    时间: 2002-10-29 02:18
再问一句,所谓用触发器解决,是否就是在添加或者更新数据的时候按每笔为单位SUM收入和支出?
作者: HG    时间: 2002-10-29 02:21
觸發操作是發生在你對表的操作時,發生的動作時,被計算機捕捉到時引發的操作,足可以滿足你的須求。先查詢以下本壇的資料,再思考啦。
作者: access2sql    时间: 2002-10-29 04:20
上述语句运行失败,其操作的结果只是分别汇总当天数据,一天只有一个汇总值,而且到第二天即无法累计
数据源及正确结果如下:
日期       收入金额    累计金额
2002-01-01    200,000     200,000
2002-01-01    400,000     600,000
2002-01-01    500,000    1,100,000
2002-01-02    600,000    1,700,000
2002-01-02    700,000    2,400,000
2002-08-05   5,000,000    7,400,000



您的过程运行结果如下:
日期               累计金额
2002-01-01            1,100,000
2002-01-02            1,300,000
2002-08-05            5,000,000


这么说吧,就和
select day(日期) as 日,sum(收入金額)as day_sum
from 收入表
group by day(日期)

的结果完全一致

[此贴子已经被作者于2002-10-28 20:19:58编辑过]


作者: HG    时间: 2002-10-29 16:41
還是不明白,你為什麼要這樣累計,有什麼作用,一般很少人這樣累計的。我可以說下思路。
先用觸發器來實現每筆累計,然後再用集合函數實現每天累計,不行嗎?關鍵是我想不也這樣作的理由。
作者: access2sql    时间: 2002-10-29 18:31
我上述说的理由还不够吗?理由很简单,客户要求实现用查询来显示每天的现金及银行存款余额,之所以要用查询显示是因为他可以用ctrl+c拷贝到其他地方再编辑或再处理
作者: HG    时间: 2002-10-29 19:22
先用觸發器來實現每筆累計,然後再用集合函數實現每天累計.
你只有這樣作了,別無途。記住要給用戶有UNDO的功能。
增加記錄,累計值增加,減少記錄,累記值減少,修改記錄,累記值會具情況變化。
作者: goodidea    时间: 2002-10-29 19:37
这样做符合用户习惯,看起来跟传统的账本一样。
作者: HG    时间: 2002-10-29 19:57
呵呵,原來如此,看來用觸發器是最好的選 擇啦。
作者: access2sql    时间: 2002-10-30 01:04
触发器看来无法达到要求,因为如果我有2张表,在每一笔输入后计算到这笔业务为止的累计值是不可行的

[此贴子已经被作者于2002-10-29 17:04:04编辑过]


作者: access2sql    时间: 2002-10-30 01:18
[upload=htm]http://www.office-cn.net/vvb/uploadimages/200210291712349216.htm[/img]
很简单,只要用存储过程实现上述表格即可。
要求也只有2个,第一,由于网络的问题,上述过程必须适应 56K的传输
第二,所有生成后的数据必须是临时的,也就是说一旦生成,看过以后就不要了,不要有数据留在数据库里

我可以用ADODB.RECORDSET + 临时表 实现上述功能,但速度太慢了
我的数据库是 C/S 结构  ACCESS XP + SQL 2000 + INTERNET

其实要实现的所有功能我都能编程用  VBA 实现,缺点非常明显——太慢!我必须要转为服务器端,而 ADP 转为服务器端只有一个办法,用存储过程


[此贴子已经被作者于2002-10-29 17:18:28编辑过]


作者: HG    时间: 2002-10-30 01:44
笨,觸發器,在觸發時,並沒有數據入即寫入基表,而是把數據寫在一個虛表上,你可以從虛表中讀取數據,然後累加,如果觸發失敗,再減去剛才累加的值(即復原)這樣都是一個人對某一種語言使用的熟練成度所致的。不是嗎?




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