存货核算中的先进先出

SET  QUOTED_IDENTIFIER  ON  
GO
SET  ANSI_NULLS  ON  
GO

ALTER     proc  CaculateProfit_FIFO



as
    
/*

drop table #tbl
drop table #tbl2

*/
    

declare       @期初时间   datetime ,
        
@期初数量   int ,
        
@期初单价   decimal ( 12 , 4 )
        
        
set   @期初时间 = ' 2001-01-31 23:59:59 '
        
set   @期初数量 = 20
        
set   @期初单价 = 200.00


create   table  #tbl(IODate   datetime   default ( getdate ()),
            InputNum 
int ,
            InputUnitPrice 
decimal ( 12 , 4 ),
            
            OutputNum 
int ,
            CostUnitPrice 
decimal ( 12 , 4 ),
            SalesUnitPrice 
decimal ( 12 , 4 ),
            Profit 
decimal ( 12 , 4 ))


select  IODate,
    inputNum,
    inputPrice,
    outputNum,
    SalesPrice
    
into  #tbl2
        
from  dbo.InvertoryAccouter
        
order   by  IODate  asc




insert   into  #tbl
    (IODate,InputNum,InputUnitPrice,
    OutputNum,SalesUnitPrice)

select    @期初时间 ,
    
@期初数量 ,
    
@期初单价 ,
    
null ,
    
null
    
    
union   all
select   *  
    
from  #tbl2
    

    


declare   @日期   datetime ,
    
@入库数量   int ,
    
@入库单价   decimal ( 12 , 4 ),
    
@出库数量   int ,
    
@成本单价   decimal ( 12 , 4 ),
    
@销售单价   decimal ( 12 , 4 ),
    
@利润      decimal ( 12 , 4 )


declare   @当前被减项日期   datetime ,
    
@当前被减项数量   int ,
    
@当前被减项剩余数量   int ,
    
@当前被减项单价   decimal ( 12 , 4 )

    
set   @当前被减项日期 = @期初时间
    
set   @当前被减项数量 = @期初数量
    
set   @当前被减项剩余数量 = @期初数量
    
set   @当前被减项单价 =   @期初单价

declare   @当前累加成本   decimal ( 12 , 4 )


declare   @总利润   decimal ( 12 , 4 )
    
set   @总利润 = 0
    
DECLARE  FIFO_cursor  cursor
For   select  IODate,InputNum,
        InputUnitPrice,OutputNum,
        CostUnitPrice,SalesUnitPrice,Profit 
            
from  #tbl

    
OPEN  FIFO_cursor
    
FETCH   NEXT   from  FIFO_cursor
        
INTO   @日期 , @入库数量 ,
            
@入库单价 , @出库数量 ,
            
@成本单价 , @销售单价 , @利润

        
WHILE   @@FETCH_STATUS = 0
            
Begin
                        
                
--  @当前累加成本 重新清零
                 set   @当前累加成本 = 0
    
                
--     成本单价 = 成本/数量
                 if   @出库数量 > 0  
                    
Begin
                        
if   @当前被减项剩余数量 < @出库数量
                            
Begin
                                
while ( @当前被减项剩余数量 < @出库数量 )
                                    
begin
                                        
-- 先统计当前项的累加成本准备和下个选项减出来的成本相加
                                         select   @当前累加成本 = @当前被减项剩余数量 * @当前被减项单价
                                        
                                        
-- 移动到下一条入库纪录
                                         select   top   1  
                                         
@当前被减项日期   =  IODate,
                                         
@当前被减项数量 = inputNum,
                                         
@当前被减项剩余数量 = @当前被减项剩余数量 + inputNum,
                                         
@当前被减项单价   =  inputPrice
                                            
from  dbo.InvertoryAccouter
                                                
where  IODate > @当前被减项日期
                                                    
and  inputNum  is   not   null
                                                    
and  inputPrice  is   not   null
                                                
order   by  IODate  asc
                                        
-- select @当前被减项剩余数量= @当前被减项剩余数量-@出库数量
                                                            
                                    
end
                                
-- 一直循环累加直至发现现在的 @当前被减项剩余数量 已经大于 @出库数量
                                 select   @当前被减项剩余数量 = @当前被减项剩余数量 - @出库数量
            
                                
select   @当前累加成本   =   @当前累加成本 +
                                            (
@当前被减项数量 - @当前被减项剩余数量 ) * @当前被减项单价
                                
                                
-- 计算出 出库的 成本单价
                                 select   @成本单价   =   @当前累加成本 / @出库数量
                                
                                
-- print (@销售单价-@成本单价)*@出库数量
                                
                                
select   @总利润   =   @总利润   +  ( @销售单价 - @成本单价 ) * @出库数量
                                
-- print @总利润
                             End
                        
                        
                        
else
                            
-- 如果 @出库数量<@当前被减项剩余数量
                             Begin
                                
                                
select   @当前被减项剩余数量 = @当前被减项剩余数量 - @出库数量
                                
/*
                                select @当前累加成本 = @当前被减项单价*@出库数量
                                --计算出 出库的 成本单价
                                select @成本单价 = @当前累加成本/@出库数量
                                
*/
                                
select   @成本单价   =   @当前被减项单价
        
                                
-- print (@销售单价-@成本单价)*@出库数量    
                                
                                
select   @总利润   =   @总利润   +  ( @销售单价 - @成本单价 ) * @出库数量     
                                
-- print @总利润        
                             End
                        
                        
                    
End  
                    
                
                
-- print @日期
                
                
                
FETCH   NEXT   from  FIFO_cursor
                    
INTO   @日期 , @入库数量 ,
                        
@入库单价 , @出库数量 ,
                        
@成本单价 , @销售单价 , @利润
            
End
            
    
    
CLOSE  FIFO_cursor
DEALLOCATE  FIFO_cursor        

select    @总利润



GO
SET  QUOTED_IDENTIFIER  OFF  
GO
SET  ANSI_NULLS  ON  
GO

转载于:https://www.cnblogs.com/Bruce_H21/archive/2007/08/02/839993.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
各位好!在各位朋友的帮助下,“存货核算系统”正式修改完成。在此我要特别感谢xinreng老师的大力帮助,他对我这个系统起了至关重要的作用。对他的无私奉献精神,以及他的会计专业水平和ACCESS的技能,我无法用语言表达,令我终身难忘。这个系统侧重于财务人员对存货核算。具有以下特点:1、可以用作会计商品进销存明细帐,销售明细帐。2、成本计价方法采用加权平均法。考虑到加权平均法是按月计算,不能即时得出其正确成本价,本系统解决了这个问题,在成本价查询、出库成本查询、销售利润查询、进销存查询均设置了“未结帐”这个选项,只要你选择了“未结帐”就能求出到这个时点的准确成本价。3、具备“月末结帐”和“取消结帐”的功能,相信会计朋友对此不会陌生。月结后的记录是不能编辑的,只可查看。4、具备“盘点”功能。在数量上可以进行盘点,盘点差异一律在“盘点出库”处理,这样巧妙地利用了出库成本价自动结转功能,到了月末结帐,系统会自动计算出盘盈盘亏。成本价也可以进行调整,具体看帮助了。系统还存在以下几个重要问题没有解决好:一是不能分年度,无法进行上下年结转。二是入出库单“放弃”功能键没法解决,也没有禁止滚轮。三是数量盘点和成本价调整不能做到自动生成出、入库单。四是进销存查询没有明细记录。欢迎大家使用更欢迎大家提意见!在winXP+office2003能正常使用。操作员的密码为:111  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值