1、财务核算上对出库的物品有一种方法为移动加权平均,计算方法是
移动加权平均单价= (本次收入前结存商品金额+本次收入商品金额)/(本次收入前结存商品数量+本次收入商品数量 )
2、公式看着简单,但是要求是通过这个公式计算出发出单价,而发出的商品金额还没有计算出来
示例如下:
1、前面所列出的数据是我为了能够追溯本期参与核算所有的单据信息和计算每个发出物料的成本而设置的。其所有的数据来源为当期所有的出入库及调拨业务记录;
2、如下数据是为了说明情况而设置的例证,fserialNo字段是为了体现每个物料的按照日期实际收发顺序而建立的,在插入过程中是按照入库、领料、调拨的顺序插入到核算日志表中
。FType表示出入库业务类型 fmasterid物料ID FQty出入库数量 FPrice 单价 FAmount 金额,Fserial是为了按照日期顺序分析每个物料的出库顺序而建立
3、按照移动平均法的计算原则对出库数据进行核算,得到其出库成本,移动平均方法如下:
移动加权平均单价= (本次收入前结存商品金额+本次收入商品金额)/(本次收入前结存商品数量+本次收入商品数量 )
根据这个方法,对如下数据进行运算得到结果如下(红色字体):
目前的困惑是在得到当前行是出库业务后,获取上一行的累计数量和累计金额?用获取后的上一行累计金额/累计数量,得到本行的单价(即移动平均单价),移动平均单价*本行的数量 得到发出金额
在网上看到一个例子比较符合,但是其只能计算一个物料,不能多个同时进行计算,另外也不能满足真实的例子中存在金额调整业务,即数量是0的情况。
declare @d numeric(18,12)
set @d = 0
update tb set
nowpric = @d*1.0/累计数量余额,
@d = @d + case when FType= '进货' then 数量 else - 数量 end *
case when FType = '进货' then pri else @d*1.0 / (上一次累计数量余额+当前数量) end
4、与这个问题衍生的是如何按照仓库进行发出计算
上面的例子没有给出入库和发出都是那个仓库的,真实的案例情况是会按照每个独立的仓库进行发出核算,因为一个物料存在于1个或者一个以上的仓库中,需要按照仓库进行分类汇总核算。
我的问题是遇到调拨业务,在整个核算数据表中,面对按照仓库进行序列核算的数据,怎么能够判断是调出还是调入,进而先计算调出数据,然后在以调出数据计算调入数据
例如:上例中物料123有调拨业务,在C仓库发出30件到B仓库,而B仓库本月发出50件,怎么能够最简便地判断先计算C仓库,在计算B仓库呢?
我尝试用分析函数 无法获得正确的结果
select ab.FBillDate,
ab.FBillNo,
ab.FEntryID,
ab.fmasterid,
ab.FPrice,
ab.FQty,
ab.FAmount,
ab.fserialNo,
ab.FType,
(case when Ftype in ('STK_IN' , 'bal') then fprice
when Ftype='PRO_OUT' then lag(amount/FACCTGQTY,1,0) over(partition by fmasterid order by FSerialNo)
else 0 end) as fprice
,(case when Ftype in ('STK_IN' , 'bal') then FAmount
when Ftype='PRO_OUT' then lag(amount/FACCTGQTY,1,0) over(partition by fmasterid order by FSerialNo)*FQty
else 0 end) as famount
,FACCTGQTY,amount
from t_hs_test_a ab--,t_hs_test_a aa,
,(select fentryid, sum(case when Ftype in ('STK_IN' , 'bal') then FAMount
when Ftype='PRO_OUT' then FAmount*-1
else FAmount*-1 end) over(partition by fmasterid order by FSerialNo) amount
,sum(case when Ftype in ('STK_IN' , 'bal') then FQty
when Ftype='PRO_OUT' then FQty*-1
else FQty*-1 end) over(partition by fmasterid order by FSerialNo) FACCTGQTY
from t_hs_test_a)ac
where ab.FEntryID=ac.FEntryID