to fb():
说的好,财务的现实业务的确如你所说.我去年为一家医院开发的系统就是这么处理的,用负数冲
销,其实,那是逃避修改原始单据带来的麻烦,看看金蝶的财务软件吧,一张原始凭证生成,可以先
不记账,此时可以对它做任何处理,记过帐的凭证,仍可反悔,修改再记账,而此时的明细账是随动
的,一套软件若做的完善,操作员是做不了弊的,这与现实业务稍有区别,现在我的客户,大多数要
求能修改原始单据,那能不能有个好的解决方案呢?
说的好,财务的现实业务的确如你所说.我去年为一家医院开发的系统就是这么处理的,用负数冲
销,其实,那是逃避修改原始单据带来的麻烦,看看金蝶的财务软件吧,一张原始凭证生成,可以先
不记账,此时可以对它做任何处理,记过帐的凭证,仍可反悔,修改再记账,而此时的明细账是随动
的,一套软件若做的完善,操作员是做不了弊的,这与现实业务稍有区别,现在我的客户,大多数要
求能修改原始单据,那能不能有个好的解决方案呢?
号 入库数 入库金额 总数 总金额
001 2 1000 2 1000
002 4 2000 6 3000
是不是?
有两个方法解决你的问题.
方法1:
在update 后.
select * from xxx order by 号.
循环
update xxx set 总数 = (select sum(入库数) from xxx where 号<=当前指针 所在号
循环结束 这种方法比较笨拙
另外一种方法,是ms sql 特有的.可以把这个过程放在update trigger里面,或者要打印,查询
的时候主动调用.
declare @run_total int
select @run_total=0
update table1 set @run_total=tot=@run_total+value from table1
使用了动态的set语句,该语句中 列=变量,然后变量=列.从右到左计算.
入库金额-出库金额 结存金额
from 库存明细账
如果记录号是连续的,可以:
select a.物资ID,a.入库数量,a.入库金额,a.出库数量,a.出库金额,
a.入库数量-isnull(((select distinct b.出库数量
from 库存明细账 b
where b.物资ID = isnull((select a.物资ID - 1
from 库存明细账),0),0)
from 库存明细账 a
a.入库数量-isnull(((select distinct b.出库数量
from 库存明细账 b
where b.物资ID = isnull((select max(c.物资ID)
from 库存明细账 c
where c.物资ID<a.物资ID),0),0)
from 库存明细账 a
我想可以了,再有问题你就微调一下吧。
对不起,我可能没说清楚,现在把细节说一下:
表名:物资明细账.
字段:记录号(int 识别种子),物资ID char(10),凭证号 char(10),日期 smalldatetime,
入库数量 decimal,入库金额 money,出库数量 decimal,出库金额 money所有的物资明细都将插入这张表,所以,要查某一种物资的明细,其记录号肯定是不连续的,举个例子:
记录号 物资ID 入库数量,入库金额,出库数量,出库金额
1 G0001 100 1000 0 0
2 G0001 0 0 2 20
3 G0001 12 120 0 0
4 G0001 0 0 10 100
5 G0002 100 1000 0 0
6 G0002 0 0 2 20
7 G0001 0 0 2 20
8 G0003 0 0 2 20当需要时只查某一种物资的明细(where 物资ID='''+GoodsID+''' order by 记录号)
1 G0001 100 1000 0 0
2 G0001 0 0 2 20
3 G0001 12 120 0 0
4 G0001 0 0 10 100
7 G0001 0 0 2 20
--------------------------------------------------------------------------------
5 G0002 100 1000 0 0
6 G0002 0 0 2 20
--------------------------------------------------------------------------------
8 G0003 0 0 2 20
--------------------------------------------------------------------------------
其记录号不一定连续的,或者说,肯定不连续,那么我要在查询时得到 结存数量,结存金额
(我上边有结果例子),
做财务或库存软件的朋友,你是如何解决这个问题的?
sum(b.入库数量-b.出库数量) as 结存数量,
sum(b.入库数量-b.出库金额) as 结存金额
from 库存明细账 a,库存明细账 b
where a.物资ID=b.物资ID and a.记录号>=b.记录号
group by a.记录号,a.物资ID
你的SQL语句没有错误,问题是我的数据流量相当大,每一种物资每年要有上万条记录,共有2000多
种物资,这种查询方式,第一年也许没问题,但第二年?第三年?...我想会死机的.
这种查询方式的效率是很低的.
input标!output表!store表!
那样的话!这个问题可以有很多方法解决!
input 表有 记录号 物资ID 入库数量,入库金额
output 表有 记录号 物资ID 出库数量,出库金额
store 有结 物资ID,存数量,结存金额
那样的话!
你的修改操作仅仅修改该种品种的物质库存和金额
我的具体工作是建一个触发器
1.sql server
create trigger kkkk on input for delete,insert,update
as
begin
if (select count(*) from deleted)>0 then
begin
update store
set 存数量=存数量-入库数量,结存金额=结存金额-入库金额 where store.物资ID=deleted.物资ID
end
if (select count(*) from inserted)>0 then
begin
update store
set 存数量=存数量+入库数量,结存金额-入库金额 where store.物资ID=inserted.物资ID
end
end
2.create trigger kkkk
/*说明 这里的mid表示物资ID,store_sum存数量,store_monty表示入库数量*/
after insert or delete or update on input
for each row
declare
temp_flag number(2,0);
temp_iid number(6,0);
begin
temp_iid:=0;
if (:new.mid is not null) then
select count(*) into temp_flag from store where store.mid=:new.mid;
if (temp_flag=0) then
/*如果store里面没有该货物就把它加入到表store
select max(iid) into temp_iid from store;
temp_iid:=temp_iid+1;
insert into store
values(temp_iid,:new.mid,nvl(:new.input_sum,0),nvl(:new.input_money,0));
else
update store
set store_sum=store_sum+nvl(:new.input_sum,0)
store_money=store_money+nvl(:new.input_money,0)
where :new.mid=store.mid;
end if;
end if;
if (:old.mid is not null) then
update store
set store_sum=store_sum-nvl(:old.input_sum,0),
store_money=store_money-nvl(:old.input_money,0)
where :old.mid=store.mid;
end if;
end;
写个结存用的Store Procedure 采用游标技术。。
回去想想 哈。。我不多说了