成本中心, 以财务来说有多种核算方法, 也需要有明确的数据支持的,
其中包括
1. 悠悠 所需要的 先入先出 法,
2. 煮江品茶 认为比较简单的 平均成本法,
3. 也有比较特殊行业的 先入后出法.
一般含生产的ERP的成本中心都同时支持以上三个方法的.
会根据成本中心定义的 产品, 工艺, 或物料来定义的.
既然 悠悠 想要先入先出, 就建个简单模块满足他心愿吧!
做excel也不是不好, 直观, 但数据完整性不够
做access也不一定很好, 数据处理能力强, 但调度弹性不够,如批次调给不同订单交货, 临时用代用物料 等
先入先出算法
需求表: 营销订单, 需求数量, 已完成数(可有可无,用EXCEL必需 )
供应表: 生成单, 生成数量, 单价, 已用完数(可有可无,用EXCEL必需)
多对多表: 营销订单, 生成单, 供求数量, 单价
set rsNeed = CurrentDB().OpenRecordSet("select 需求表.营销订单, 需求数量-Sum( 供求数量) as 需求余数 from 需求表 inner join 多对多表 on 需求表.营销订单=多对多表.营销订单 group by 需求表.营销订单, 需求表.需求数量 Having Sum( 供求数量)<需求数量 order by 营销订单")
set rsSupply = CurrentDB().OpenRecordSet("select 供应表.生成单, 生成数量-Sum( 供求数量) as 供应余数 from 供应表 inner join 多对多表 on 供应表.生成单=多对多表.生成单 group by 供应表.生成单, 供应表.生成数量 Having Sum( 供求数量)<生成数量 order by 生成单")
nQty = rsNeed!需求余数
do while not rsSupply.EOF
if rsNeed.EOF then
Msgbox "供应已经超过需求!"
Exit Sub
end if
sQty = rsSupply!供应余数
Do While sQty > 0 ' 处理完这批供应数, 离开这个循环, 就处理下一批供应数
addQty = IIF( sQty <= nQty, sQty, nQty)
docmd.runsql "insert into 多对多表 (营销订单,生成单,供求数量,单价) values ('" & rsNeed!营销订单 & "','" & rsSupply!生成单 & "'," & addQty & "," & rsSupply!单价 & ")"
sQty = sQty - addQty
nQty = nQty - addQty
if nQty=0 Then
rsNeed.MoveNext
if rsNeed.EOF then Exit Sub '已完成所有需求
end if
loop
rsSupply.MoveNext
loop
完成后, 需求表 以订单编号 关联 多对多表 若 Sum(多对多表.供求数量) = 需求表.需求数量 时,
就完全供够了的订单, 订单的单只成本就会是 Sum( 多对多表.供求数量 * 多对多表.单价)/需求表.需求数量
成本中心, 以财务来说有多种核算方法, 也需要有明确的数据支持的,
其中包括
1. 悠悠 所需要的 先入先出 法,
2. 煮江品茶 认为比较简单的 平均成本法,
3. 也有比较特殊行业的 先入后出法.
一般含生产的ERP的成本中心都同时支持以上三个方法的.
会根据成本中心定义的 产品, 工艺, 或物料来定义的.
既然 悠悠 想要先入先出, 就建个简单模块满足他心愿吧!
做excel也不是不好, 直观, 但数据完整性不够
做access也不一定很好, 数据处理能力强, 但调度弹性不够,如批次调给不同订单交货, 临时用代用物料 等
先入先出算法
需求表: 营销订单, 需求数量, 已完成数(可有可无,用EXCEL必需 )
供应表: 生成单, 生成数量, 单价, 已用完数(可有可无,用EXCEL必需)
多对多表: 营销订单, 生成单, 供求数量, 单价
set rsNeed = CurrentDB().OpenRecordSet("select 需求表.营销订单, 需求数量-Sum( 供求数量) as 需求余数 from 需求表 inner join 多对多表 on 需求表.营销订单=多对多表.营销订单 group by 需求表.营销订单, 需求表.需求数量 Having Sum( 供求数量)<需求数量 order by 营销订单")
set rsSupply = CurrentDB().OpenRecordSet("select 供应表.生成单, 生成数量-Sum( 供求数量) as 供应余数 from 供应表 inner join 多对多表 on 供应表.生成单=多对多表.生成单 group by 供应表.生成单, 供应表.生成数量 Having Sum( 供求数量)<生成数量 order by 生成单")
nQty = rsNeed!需求余数
do while not rsSupply.EOF
if rsNeed.EOF then
Msgbox "供应已经超过需求!"
Exit Sub
end if
sQty = rsSupply!供应余数
Do While sQty > 0 ' 处理完这批供应数, 离开这个循环, 就处理下一批供应数
addQty = IIF( sQty <= nQty, sQty, nQty)
docmd.runsql "insert into 多对多表 (营销订单,生成单,供求数量,单价) values ('" & rsNeed!营销订单 & "','" & rsSupply!生成单 & "'," & addQty & "," & rsSupply!单价 & ")"
sQty = sQty - addQty
nQty = nQty - addQty
if nQty=0 Then
rsNeed.MoveNext
if rsNeed.EOF then Exit Sub '已完成所有需求
end if
loop
rsSupply.MoveNext
loop
完成后, 需求表 以订单编号 关联 多对多表 若 Sum(多对多表.供求数量) = 需求表.需求数量 时,
就完全供够了的订单, 订单的单只成本就会是 Sum( 多对多表.供求数量 * 多对多表.单价)/需求表.需求数量
如果是真实交代海关核对数, 那就算出来提交就可以了!
都是三四年前盛行的(提交真实数据).
但仍有部份企业是提交假数据的,或者根本真不了的,
因为跟供应商及客户结转数据时,
1. 会有单位转换的问题, (原材料供应可能以公斤做关封, 自己厂会以平方作关封)
2. 耗用比率指标都是预先报的, 与实际数会有大的偏差,
3. 废率亦是预报的, 突然有大批量的报废, 就要调节了,
所以会以多种不同的方式处理的.
真实提交做关封, 也不一定能 核销报关合同的.