行  FTran  FQty  FPrice  FAmount
1   1      10    10      100
2   1      15    8       120
3   5      8     8.8     70.4
4   5      10    8.8     88
可以看出行1已经出完了,行2还剩下数量FQty=7,单价FPrice=8,金额FAmount=7*8=56为什么入库(100+120)不等于出库(70.4+88)加上剩余(56)???

解决方案 »

  1.   

    你可以用游标来循环实现的
    ---------------------------
    因为我不知道你的表中有没有可以标识唯一行的,
    若有的话,你可以直接用一个UPDATE语句来实现
      

  2.   

    我觉得逻辑有问题嘛,
    @首先,出入是否是平衡的?
    3、4出库是按照1、2入库均价来出的,是否可以理解出库价格是库存均价?
    那么剩余7×8.8=61.6
    5要30没法马上出库,等6来了50就可以出了,这时价格计算让人糊涂
    FPrice=[(7*8)+(30-7)*10]/(7+23)=9.53  
    如果出入平衡,为什么不是
    (7×8.8+50×10)÷57=9.85
    ◎如果要考虑货物批次的话,3出的货1来提供,3的FPrice为什么不是10,2的就应该是(2×10+8×8)÷10=8.4
    ◎再如果说,当出货缺货时才考虑货物批次的问题,
    怎么知道5出货中的7是2进的呢,为什么不是1进的,价格为什么不是
    FPrice=[(7*10)+(30-7)*10]/(7+23)=10
    ◎如果说出货价格是出货的入价的均价最低价,这样5的出货价格可以解释,那么3出货就应该选2的入货,出价为8了,4就应该用2和1的均价(7×8+3×10)÷10=8.6了
    ◎不管怎么说,我觉得这个帐不平衡
      

  3.   

    create table rk     --入库
    (
    D_code  char(11)  default '',     --入库单号
    rq      char(10)  default '',     --入库日期
    flag    char(2)   default '否',     --标志    但出库数量达到后就回写为 ‘是’,入库时是'否'
    FQty    dec(14,2) default '',     --数量
    fprice  dec(14,2) default '',     --单价
    famount dec(14,2) default ''      --金额
    )
    create table ck     --出库
    (
    D_code  char(11)  default '',     --入库单号
    --flag  char(2)   default '',   --标志
    FQty    dec(14,2) default '',     --数量
    fprice  dec(14,2) default '',     --单价
    famount dec(14,2) default ''      --金额
    )
    /*以下存储过程针对出库*/SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS OFF
    GOCREATE PROCEDURE  PROC_CK
      @D_CODE CHAR(11),
      @FQty   dec(14,2)AS --- DECLARE @ERRCODE  INTEGER SET @ERRCODE = 10000 DECLARE @RETURN INTEGER
    SET @RETURN = 0---DECLARE @TRAN_POINT INTSET @TRAN_POINT = @@TRANCOUNTIF @TRAN_POINT = 0       BEGIN TRAN TRAN_CK
    ELSE 
          SAVE TRAN TRAN_CK
    declare @shl dec(14,2),
    declare @dj  dec(14,2)select @shl= sum(fqty),@dj=(sum(famount)/sum(FQty)) from rk where flag ='否'if @@error  <> 0   begin 
          set @return= 2
          goto err_lab
       endif @FQty>@shlbegin   inset into ck values(@D_code,@FQty,0,0) end 
     
    if @@error <> 0 begin 
      set @return =3
      goto err_lab
     endif @fqty = @shl begin   insert into ck values(@D_code,@FQty,@shl,@shl*@dj)  update ck set flag='是' where flag='否'    --回写标志 endif @@error <>0  begin 
         set @return = 4
         goto err_lab
      end/*  循环从第一条开始,直到让fqty 消耗为0if @FQty < @shl begin
      
      declare @sl dec(14,2)
    select @sl=fdty from rk where flag='否'  order by rq */--IF @TRAN_POINT =0
       COMMIT TRAN TRAN_CK
    GOTO RETURN_LAB
    ERR_LAB:
     
     IF @RETRUN<100 SET @RETURN = @ERRCODE + @ERRCODEROLLBACK TRAN TRAN_CKRETURN_LAB:RETURN @RETURNGOSET QUOTED_IDENTIFIER OFFGOSET ANSI_NULLS ON
    GO ---
    不好意思,还有当出库数据 小于入库的数量时,进行计算的循环没有写。
    没时间了,我要搬家! 明天有空补上
      

  4.   

    to zhang_yzy(六子儿) 
    是过一段时间再计算出来得
      

  5.   

    出库单价是以现有库存的单价的加权平均么,好像也不对啊
    5中的出价FPrice=[(7*8)+(30-7)*10]/(7+23)=9.53 显然不是存货的加权平均吧
      

  6.   

    to  kylike(直到有一天,我几乎可以回答这里所有的问题) 
    可能是我表达不好
    我的意思就是要根据移动平均法算出出库的单价???
    难道你们没看清楚吗?移动平均法啊,
      

  7.   

    有谁能举个例子来说明移动平均法吗?
    到现在还没有解决出来,闷ing
      

  8.   

    create table rk     --入库
    (
    D_code  char(11)  default '',     --入库单号
    rq      char(10)  default '',     --入库日期
    flag    char(2)   default '否',     --标志    但出库数量达到后就回写为 ‘是’,入库时是'否'
    FQty    dec(14,2) default '',     --数量
    fprice  dec(14,2) default '',     --单价
    famount dec(14,2) default ''      --金额
    )
    create table ck     --出库
    (
    D_code  char(11)  default '',     --入库单号
    --flag  char(2)   default '',   --标志
    FQty    dec(14,2) default '',     --数量
    fprice  dec(14,2) default '',     --单价
    famount dec(14,2) default ''      --金额
    )
    /*以下存储过程针对出库*/SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS OFF
    GOCREATE PROCEDURE  PROC_CK
      @D_CODE CHAR(11),
      @FQty   dec(14,2)AS --- DECLARE @ERRCODE  INTEGER SET @ERRCODE = 10000 DECLARE @RETURN INTEGER
    SET @RETURN = 0---DECLARE @TRAN_POINT INTSET @TRAN_POINT = @@TRANCOUNTIF @TRAN_POINT = 0       BEGIN TRAN TRAN_CK
    ELSE 
          SAVE TRAN TRAN_CK
    declare @shl dec(14,2),
    declare @dj  dec(14,2)select @shl= sum(fqty),@dj=(sum(famount)/sum(FQty)) from rk where flag ='否'if @@error  <> 0   begin 
          set @return= 2
          goto err_lab
       endif @FQty>@shlbegin   inset into ck values(@D_code,@FQty,0,0) end 
     
    if @@error <> 0 begin 
      set @return =3
      goto err_lab
     endif @fqty = @shl begin   insert into ck values(@D_code,@FQty,@shl,@shl*@dj)  update ck set flag='是' where flag='否'    --回写标志 endif @@error <>0  begin 
         set @return = 4
         goto err_lab
      end/*  循环从第一条开始,直到让fqty 消耗为0if @FQty < @shl begin
      
      declare @sl dec(14,2)
    select @sl=fdty from rk where flag='否'  order by rq */--IF @TRAN_POINT =0
       COMMIT TRAN TRAN_CK
    GOTO RETURN_LAB
    ERR_LAB:
     
     IF @RETRUN<100 SET @RETURN = @ERRCODE + @ERRCODEROLLBACK TRAN TRAN_CKRETURN_LAB:RETURN @RETURNGOSET QUOTED_IDENTIFIER OFFGOSET ANSI_NULLS ON
    GO ---
    不好意思,还有当出库数据 小于入库的数量时,进行计算的循环没有写。
    没时间了,我要搬家! 明天有空补上