to fb():
说的好,财务的现实业务的确如你所说.我去年为一家医院开发的系统就是这么处理的,用负数冲
销,其实,那是逃避修改原始单据带来的麻烦,看看金蝶的财务软件吧,一张原始凭证生成,可以先
不记账,此时可以对它做任何处理,记过帐的凭证,仍可反悔,修改再记账,而此时的明细账是随动
的,一套软件若做的完善,操作员是做不了弊的,这与现实业务稍有区别,现在我的客户,大多数要
求能修改原始单据,那能不能有个好的解决方案呢?

解决方案 »

  1.   

    我明白你的意思你是这样的.
        号        入库数      入库金额        总数   总金额
        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语句,该语句中 列=变量,然后变量=列.从右到左计算.  
      
      

  2.   

    select 物资ID,入库数量,入库金额,出库数量,出库金额,入库数量-出库数量 结存数量,
           入库金额-出库金额 结存金额
    from   库存明细账
      

  3.   

    对不起刚才看错了。
    如果记录号是连续的,可以: 
    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
      

  4.   

    select a.物资ID,a.入库数量,a.入库金额,a.出库数量,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
    我想可以了,再有问题你就微调一下吧。
      

  5.   

    感谢gordon_two()的支持:
    对不起,我可能没说清楚,现在把细节说一下:
    表名:物资明细账.
    字段:记录号(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
    --------------------------------------------------------------------------------
    其记录号不一定连续的,或者说,肯定不连续,那么我要在查询时得到 结存数量,结存金额
    (我上边有结果例子),
    做财务或库存软件的朋友,你是如何解决这个问题的?
      

  6.   

    select a.记录号,a.物资ID,a.入库数量,a.入库金额,a.出库数量,a.出库金额,
           sum(b.入库数量-b.出库数量) as 结存数量,
           sum(b.入库数量-b.出库金额) as 结存金额
       from 库存明细账 a,库存明细账 b
       where a.物资ID=b.物资ID and a.记录号>=b.记录号
       group by a.记录号,a.物资ID
      

  7.   

    to tanghuan():
    你的SQL语句没有错误,问题是我的数据流量相当大,每一种物资每年要有上万条记录,共有2000多
    种物资,这种查询方式,第一年也许没问题,但第二年?第三年?...我想会死机的.
    这种查询方式的效率是很低的.
      

  8.   

    Dephli:你要完成任务且要速度,还是间断记录吧!
      

  9.   

    其实你的问题!重要的是你的表结构有问题!如果你的表结构是这样的
    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;
         
      

  10.   

    哈哈我做过此类软件
    写个结存用的Store Procedure 采用游标技术。。
    回去想想 哈。。我不多说了