功能是算余额.
现在有三个表,xjsk(现金收款),xjfk(现金付款),xjrjz(现金日记帐).现金收款里的"金额"(字段名)插到现金日记由的借方里,现金付款的"金额'插到现金日记帐的贷方里.在现金日记帐里有字段"余额".我需要在每一次现金收款和现金付款里有数据插入时,现金日记帐里的"余额"就进行自动计算.
我现在的想法是(先做现金收款):把现金日记帐的"借方','余额","日期","编号",插到一个临时表里面,并且新建一个自动编号的字段,可以对插入的数据排序后,进行自动编号(order by 日期).
问题一:问这个临时表的创建语句是什么.
问题二:在插入一个字段以后,"余额"如何进行计算.如果是在我只是修改某一个记录的话,那么之后的记录(余额)都要进行刷新,语句又是如何.
回答出来,分不够,另外开贴!
谢谢各位达人的帮助~~ 小M在这里拜谢各位了!!

解决方案 »

  1.   

    还有一种方法:根本就不设余额字段,可以建立一个视图,将余额计算出来,这样无论该什么地方的纪录余额都是正确的。例如:
      select eid,state from istate
    结果:
      eid     state
      1       1
      2       2
      3       3
      4       4
    另外:
    select i.eid,i.state,'余额'=(select sum(state) from istate where eid<=i.eid)
    from istate i
    结果:
      eid     state    余额
      1       1        1
      2       2        3
      3       3        6
      4       4        10把上面的语句建立一个视图即可。
      

  2.   

    select i1.eid,i1.state,sum(i2.state)as sumstate from istate i1 join istate i2
    on i2.eid<=i1.eid
    group by i1.eid,i1.state
      

  3.   

    我也做过关于银行的系统,下面我说说我的想法:
    余额信息,应该是和账户、日期对应的,不知道你是采用什么方式来保存你的余额,
    我认为有两种方式:
    M1、根据每一笔发生额刷新你的余额信息,随时记录实时的余额。
    M2、每日最后计算一次余额,第二天的发生额并不修改余额,需要余额信息的时候根据昨日余额和当前发生额来计算当前余额。
    关于余额的考虑:
    1、余额信息是很常用的数据,修改、查询都很频繁,如果采用试图的方式或者上面说的第一种方式(M1),或给数据库带来比较大的负担。
    2、对昨日余额的查询也会比较频繁,所以可以考虑建立一张余额表,至于时间长度一般采用日,当然你可以自己作调整。
      

  4.   

    我开始是用的触发器去做的。但是我是只在现金收款和现金付款里面写触发器。每对两个表插入一个数据就set 余额=余额+借方. 但是又如何得到上一条的余额呢?并且我若是对以前的数据进行修改的话以后的数据刷新就不好做了啊。
    希望高人再指点。
      

  5.   

    --现金日记帐用查询,类似下面declare @现金收款 table(编号 int identity(1,1),项目 varchar(10)
    ,对象 varchar(10),金额 money,摘要 varchar(50),日期 datetime)
    insert into @现金收款
    select 'A项目','A对象',150,'收货款','2003-01-01'
    union all select 'A项目','B对象',250,'收电费','2003-01-02'
    union all select 'A项目','C对象',650,'收消费','2003-01-02'
    union all select 'B项目','A对象',950,'收械','2003-01-02'
    union all select 'B项目','C对象',1500,'魇','2003-01-03'declare @现金付款 table(编号 int identity(1,1),项目 varchar(10)
    ,对象 varchar(10),金额 money,摘要 varchar(50),日期 datetime)
    insert into @现金付款
    select 'A项目','A对象',1500,'aaa','2003-01-01'
    union all select 'A项目','B对象',25,'bbb','2003-01-02'
    union all select 'A项目','C对象',50,'ccc','2003-01-02'
    union all select 'B项目','A对象',50,'ddd','2003-01-02'
    union all select 'B项目','C对象',100,'eee','2003-01-03'select 项目=isnull(a.项目,b.项目)
    ,对象=isnull(a.对象,b.对象)
    ,借方=isnull(a.金额,0)
    ,贷方=isnull(b.金额,0)
    ,摘要=isnull(a.摘要,b.摘要)
    ,日期=isnull(a.日期,b.日期)
    ,余额=isnull(a.累计金额,0)-isnull(b.累计金额,0)
    from(
    select 项目,对象,金额=sum(金额)
    ,累计金额=(select sum(金额) from @现金收款
    where 项目=a.项目 and 对象=a.对象 and 摘要=a.摘要
    and 日期<=a.日期)
    ,摘要,日期
    from @现金收款 a
    group by  项目,对象,摘要,日期
    )a full join(
    select 项目,对象,金额=sum(金额)
    ,累计金额=(select sum(金额) from @现金付款
    where 项目=a.项目 and 对象=a.对象 and 摘要=a.摘要
    and 日期<=a.日期)
    ,摘要,日期
    from @现金付款 a
    group by  项目,对象,摘要,日期
    )b on a.项目=b.项目 and a.对象=b.对象 and a.日期=b.日期
      

  6.   

    CREATE TRIGGER  triggername ON xjsk
    FOR insert,update
    AS
    insert into xjrjz('编号','借方','余额') 
    --values(identity(int,1,1),)
    select ids=identity(int,1,1),借方,余额=余额+借方 from xjsk
    create trigger triggername2 on xjzf
    for insert,update
    as
    insert into xjrjz('编号','贷方','余额') 
    select ids,借方,余额=余额-贷方 from xjzf
      

  7.   

    我现在是这样做的。
    select identity(int,1,1)as myid,编号,借方,贷方,余额,日期 into #linshi 
    from xjrjz order by 日期
    update #linshi
    set 余额=借方+
    (select top 1 余额 from #linshi a
     where a.myid<#linshi.myid 
     order by a.myid desc)
    update xjrjz 
    set 余额=#linshi.余额 
    from xjrjz, #linshi
    where  xjrjz.编号=#linshi.编号
    drop table #linshi
    但是出来的结果是,如下:
    myid      借方      贷方        余额
    1         321                  null
    2         1000                 null
    3         212                  null
    4         21221                null
    5         0                    2124642.00
    6         3213                 2127534.00
    7         321                  2127420.00
    前面几条记录结果是正确的,但是为什么后面结果是错的呢??
    而且我想把余额在一开始的时候赋为零,用了如下语句:
    select * from xjrjz order by 日期
    set 余额=0     为什么报错?
    另外,我想把贷方的计算也加进来请问达人如何实现?
    请指教
      

  8.   

    冗余太大了吧!
    个人以为 只建立 现金收款,现金付款 (甚至是同一张表)
     现金日记帐 直接用视图 表示,余额什么的全部都实时计算,因为需要生成全部 现金日记帐 的应用理论上不会很多,而且通过在 现金收款,现金付款 表上建立合理的PK效率应该会高
    我倾向与建立:
    日记帐表:编号,项目,对象,借方,贷方,摘要,日期,余额
    create view 现金日记帐
    as 
    select 编号,项目,对象, 借方, 贷方, 金额,摘要,日期,(select sum(case when  借方 is not null then 0-金额 else 金额 from 日记帐表 k where k.编号<=k2.编号) 余额
    from 日记帐表 k2
      

  9.   

    create view 现金日记帐
    as 
    select 编号,项目,对象, 借方, 贷方, 金额,摘要,日期,(select sum(case when  借方 is not null then 0-金额 else 金额 end) from 日记帐表 k where k.项目=k2.项目 and k.对象=k2.对象 and  k.编号<=k2.编号 ) 余额
    from 日记帐表 k2
    至于你现在的计算方法,
    就用 ,(select sum(case when  借方 is not null then 0-金额 else 金额 end) from 日记帐表 k where k.项目=k2.项目 and k.对象=k2.对象 and  k.编号<=k2.编号 ) 这个子查询计算余额就可以了。
      

  10.   

    其实不同建临时表:
    update xjrjz x set x.余额=x.借方+(select 余额 from xjrjz where 日期=(select max(日期) from xjrjz where 日期<x.日期))
      

  11.   

    update #linshi
    set 余额=isnull((select sum(借方) from #linshi where myid<=a.myid),0)
    -isnull((select sum(贷方) from #linshi where myid<=a.myid),0)
    from #linshi a
      

  12.   

    declare @y1 money,@y2 money
    set @y2=0
    update #linshi set @y1=@y2+isnull(借方,0)-isnull(贷方,0)
    ,@y2=@y1,余额=@y1
      

  13.   

    楼太高了,插嘴也引不起明MM的注意,不说,搬凳子坐一边看热闹ing...
      

  14.   

    楼很高了,问个该打的问题:当初为什么设计这么有人品问题的表结构?
    原因如下:
    1、支出和收入不在同一张表,仅靠Datetime 事实上无法区分先后
    比如 数据支出数据 200,时间 2004-01-01 00:00:00.000
    因为 DateTime 时间最大分辨率为 千分只三如果有另一笔记录
    收入  200,时间也是 2004-01-01 00:00:00.000
    那,计算的时候用什么做依据?
    感觉出入明细要精确,只有把收入和支出放在同一张表里 用 Identity  控制前后,需要计算余额的时候 使用 Group BY Sum 来得实惠。
    2、日记帐表几乎是收入+支出表的总和,如此大的冗余 实在很困难,假如要不用事务控制 收入和支出 操作,那因为DateTime 的分辨率问题,后果就可能是毁灭性了;用了事务,一次变成锁定3张表的内容,开销好象忒大了点;
    3、根据你的意思收入和支出的数据是可更改的,如果万一 哪次 忘记了用事务控制 日记帐的数据与其他两张表不符,将做何处理?所以还是觉得只做一张表,余额用视图计算来得保险
      

  15.   

    我开始是用的触发器去做的。但是我是只在现金收款和现金付款里面写触发器。每对两个表插入一个数据就set 余额=余额+借方. 但是又如何得到上一条的余额呢?并且我若是对以前的数据进行修改的话以后的数据刷新就不好做了啊。
    我想 上一条余额是不是时间最大的那一条相应的记录
    如果是这样的话 不防是这样试试 set 余额=余额+借方 where 日期=(select max(日期) where )
      

  16.   

    这个已经试过了,根本就出不来结果。
    我的方法是建一个临时表,插一个字段myid,并select * from xjrjz order by 日期.再对临时表里的余额进行计算。呵呵,很谢谢realgz(realgz)这么关注我的贴子。也谢谢你的帮助。
    我的问题已经被zjcxc(邹建)的语句解决了。
    我知道我的表的设计并不好,因为收款单和付款单的字段是一样的。但是我还是做了两张表,就是因为做现金日记帐的时候好做一些。收款单的金额放在借方,付款单的金额放在贷方。这样我在输入数据的时候,就不用判断他们的方向了。
    我觉得你可能对我的表的意思还没有太清楚。我不是单纯算总和。我是要算每插入一条记录的后,余额的变化,只对每一条记录进行计算。
    建立临时表,在临时表里计算,就没有那么麻烦了。因为我要确定,最后一条记录是什么。
    其实你给我的代码我并没有看得太懂。你的那个金额字段是什么?作用又是什么?余额是怎么赋出来的啊?