ID   借     贷   余额
1    20         20    
2    10         10
3           15  15
4    20         35我要改动或者删除其中一条借贷时候
保证相应的每条余额是正确的
是update后改动数据库余额
还是全从数据库里面取出来再计算余额?
或者有别的好办法?

解决方案 »

  1.   

    create table balance (
      id int identity(1,1) not null
     ,account char(32) not null -- 帐户
     ,item varchar(32) not null -- 科目
     ,direct tinyint not null -- 0:借, 1:贷
     ,amount numeric(10,2)
     ,timest datetime not null
    )
    go
    create view vw_balance as
    select
      account, item, id
     ,[借] = case direct when 0 then amount end
     ,[贷] = case direct when 1 then amount end
     ,[余额] = (select sum(amount * (case direct when 0 then 1 when 1 then -1 end)) 
                from banlance b where b.account=a.account and b.item=a.item and b.id<a.id)
    from banlance a
    order by id
    go
      

  2.   


    数据要是这样就合理了
    ID   借     贷   余额 
    1    20         20     
    2    10         30 
    3          15   15 
    4    20         35 --
    楼主说的两种都能实现,
    1 更新数据库余额这个操作和改动或者删除其中条借贷一起处理(一个存储过程)
    2 用触发器来实现,for update,delete在我看来就放在一个存储过程里实现就OK了
      

  3.   

    类似于这种借贷和余额关系的,根据实际业务情况,一般都是根据财务期间来计算的,
    根据每个财务期间,在财务期间结算的时候,自动将上期的余额结转到下期的起初余额里面.
    所以说计算量不是很大.
    那么,像楼主那样的,做一个表存储这几个字段即可(财务期间,会计科目,起初余额,本期借方,本期贷方,本期余额 等等),
    而 当期的余额 = 期初余额 + 本期借方 - 本期贷方 就可以实现.
    在应用程序中计算或者按照面前说的在SQL中实现都可以.
    如果你的系统未来可能会变化数据库的话(这个除非是做产品,否则的话,变化应该不大),那么在应用程序里面实现,反之,在SQL中实现比较好.