Oracle Applications库存及库龄的计算方法(转)
本文只是从技术角度来讨论库存及库龄的实现方法,这些是本人在工作中的总结,抛出来和大家一起讨论一下。
1. Oracle 库存的算法。
Oracle Applications 提供了计算库存的表 MTL_ONHAND_QUANTITIES_DETAIL,开发人员只要按要求对表进行分组求和即可得到库存的现有量,这个数量就是我们在系统中查询的 数量。但是如果用户要开发人员提供上个月或上个季度的库存就麻烦了。因为表MTL_ONHAND_QUANTITIES_DETAIL不提供追溯库存计算 的方法。那怎么解决这个问题?
我们先来看看表MTL_ONHAND_QUANTITIES_DETAIL和 mtl_material_transactions 表的关系。mtl_material_transactions 是 Oracle Applications 库存的基表,凡是和库存有关的数据都必须存入这个表,如初期的库存导入,采购的接受入库。销售,制造的完工入库。子库转移等。 mtl_material_transactions 的分组求和应该等于MTL_ONHAND_QUANTITIES_DETAIL表的分组求和,但表mtl_material_transactions 的记录一般数据庞大,不会在这个表中求现有量。mtl_material_transactions表中每笔的数据异动都会影响到 MTL_ONHAND_QUANTITIES_DETAIL 的最终结果。我们通过研究发现。mtl_material_transactions 每笔入库的记录都会相应的在MTL_ONHAND_QUANTITIES_DETAI 表中增加此记录。在库存未消失前我们可以通过 mtl_material_transactions表的TRANSACTION_ID字段和表 MTL_ONHAND_QUANTITIES_DETAIL的字段CREATE_TRANSACTION_ID 建立一一对应关系。 而当有出库的记录时,MTL_ONHAND_QUANTITIES_DETAIL不会有对应的一笔出库记录而是按照 Oracle 堆栈的逻辑去扣减原先入库的记录数量。直道扣减到为零。Oracle Applications 会定期清理 MTL_ONHAND_QUANTITIES_DETAIL 表中为零的数。所以如果我们拿MTL_ONHAND_QUANTITIES_DETAIL 去追溯上期库存是错误的。
2.库龄的算法:
根据各个公司不同的业务情况,可能会对Oracle Applications 库存有不同的设定。
A)有批号和序列号控制的物料帐龄计算
如果库存系统中有设定物料接收入库时有批号和序列号控制时,那么库龄的算法相对较容易,可根据上面现有量的算法SQL中增加批号,和序号等信息。再根据这些信息算出物料账龄。
B)有设定原始接收日期先进先出物料帐龄算法。
如果在系统上线时设定了库存系统的profile option:‘INV: 原始接收日期先进先出’
的选项为‘是’,则库存系统在处理物料的出入库时按原始接收日期先进先出顺序来处理交易数量。则MTL_ONHAND_QUANTITIES_DETAIL表中的字段ORIG_DATE_RECEIVED 就会记录原始的接收日期,一直到它的库存消失为止。
算法如A)的算法大同小异。
C)假设FIFO的原理物料帐龄算法
如果库存系统不能满足上面的A),B)条件,那么我们如何计算物料的账龄?这里根据我们公司的账龄算法,给出一个解决方法。首先是假设物料是按FIFO的 原理来出入库的。然后我们还要假设一个原始的物料账龄,在这个基础上再按FIFO的原理运算出新的账龄。如果是刚上线的系统,则初期导入的库存为原始的物 料账龄,可认为导入时刻的物料库存账龄为零。如果是系统已经用了好多年了,那怎样计算物料的账龄呢?这里我们有一个近似的算法。可以用本文开始介绍的库存 追溯的计算方法,求出一年或二年前的库存数据,再默认此时的物料账龄为零。再以此数据为基础,按物料的FIFO原理计算到现在的物料账龄。一般我们认为物 料如果超过180天还在库存,就认为是呆料了,所以一年或二年的时间就可以了。我们实现的方法如下:
a) 用追溯的算法计算出一年或二年前的物料库存。
默认此时的物料账龄为零。具体的算法参考前面的SQL。这里要看公司对这个账龄的分类要求,是按仓位,还是要到货位,不同的公司有不同的要求。我们这里是以仓位为基本分类。
b) 根据前期的初始账龄。来推算现在的物料账龄。
2.1 创建一个表存放初始账龄的表。
初始的帐龄记录放入此表,以后的帐龄计算根据此表的数据来演算。
2.2 物料帐龄滚动计算。
截取初始账龄时间到现在某个时间为止的时间段内mtl_material_transactions表中的所有类型的记录(除成本更新)。对这段记录要按 交易时间的先后循序每一条,每一条的计算。按入库和出库情况进行分类。对新入库的要记录到表BITC_ITEM_INV_ATUO_AGE 中,原始的入库时间为这笔记录的交易时间。如果是出库的要找到这个物料最早的账龄日期的那笔库存。如果此笔库存不过扣减,则找到这个料下一笔账龄库存数。 直到满足这笔记录出库为止。这样不停的计算直到最后一笔。且每计算一笔记录,我们要在mtl_material_transactions表中标记为此笔 记录已运算过,下次不要重复计算。保证数据的准确性。如果运行到现在就是我们要的物料账龄表了,我们可以制定一个程序在后台定时运算。这样就能及时地得到 所要的物料账龄表。
具体的实现方法如下:
1. 截取初始账龄时间到现在某个时间为止的时间段内mtl_material_transactions表中的所有类型的记录(除成本更新),
2. 对此段记录的排序要特别处理。要按TRANSACTION_ID 和 PRIMARY_QUANTITY 排序。记住单位的不一致的要转化成一致。对子库存转移和挑库类型以及组织间转移的类型TRANSACTION_ID 要做一下特殊处理要,让此类型的数据的正数的记录排在负数记录的前面。因为Oracle 处理这些类型时,是先做一笔负数的扣减,从来源仓位扣去要转出的库存。然后再做一笔正数的到目的仓位的库存。为了记录帐龄表中的库存来源日期。我们要让正 数的到目的仓位先入库存。再让负数从来源仓出库。
3. 要对出入库的记录要分类处理。不同的类型有不同的处理算法。
3.1 对入库类型为:1:PO接收 2:工单完工入库,3:杂入,4:工单退回
要按新入库的记录放入初始账龄的表。
3.2 对出库类型和库存转移类型转出的部分。是要按帐龄的先后顺序扣减。
3.3 库存转移类型入库的部分要记录此笔记的原始入库时间,及将来原仓位的原始入库时间带过来。
1. Oracle 库存的算法。
Oracle Applications 提供了计算库存的表 MTL_ONHAND_QUANTITIES_DETAIL,开发人员只要按要求对表进行分组求和即可得到库存的现有量,这个数量就是我们在系统中查询的 数量。但是如果用户要开发人员提供上个月或上个季度的库存就麻烦了。因为表MTL_ONHAND_QUANTITIES_DETAIL不提供追溯库存计算 的方法。那怎么解决这个问题?
我们先来看看表MTL_ONHAND_QUANTITIES_DETAIL和 mtl_material_transactions 表的关系。mtl_material_transactions 是 Oracle Applications 库存的基表,凡是和库存有关的数据都必须存入这个表,如初期的库存导入,采购的接受入库。销售,制造的完工入库。子库转移等。 mtl_material_transactions 的分组求和应该等于MTL_ONHAND_QUANTITIES_DETAIL表的分组求和,但表mtl_material_transactions 的记录一般数据庞大,不会在这个表中求现有量。mtl_material_transactions表中每笔的数据异动都会影响到 MTL_ONHAND_QUANTITIES_DETAIL 的最终结果。我们通过研究发现。mtl_material_transactions 每笔入库的记录都会相应的在MTL_ONHAND_QUANTITIES_DETAI 表中增加此记录。在库存未消失前我们可以通过 mtl_material_transactions表的TRANSACTION_ID字段和表 MTL_ONHAND_QUANTITIES_DETAIL的字段CREATE_TRANSACTION_ID 建立一一对应关系。 而当有出库的记录时,MTL_ONHAND_QUANTITIES_DETAIL不会有对应的一笔出库记录而是按照 Oracle 堆栈的逻辑去扣减原先入库的记录数量。直道扣减到为零。Oracle Applications 会定期清理 MTL_ONHAND_QUANTITIES_DETAIL 表中为零的数。所以如果我们拿MTL_ONHAND_QUANTITIES_DETAIL 去追溯上期库存是错误的。
2.库龄的算法:
根据各个公司不同的业务情况,可能会对Oracle Applications 库存有不同的设定。
A)有批号和序列号控制的物料帐龄计算
如果库存系统中有设定物料接收入库时有批号和序列号控制时,那么库龄的算法相对较容易,可根据上面现有量的算法SQL中增加批号,和序号等信息。再根据这些信息算出物料账龄。
B)有设定原始接收日期先进先出物料帐龄算法。
如果在系统上线时设定了库存系统的profile option:‘INV: 原始接收日期先进先出’
的选项为‘是’,则库存系统在处理物料的出入库时按原始接收日期先进先出顺序来处理交易数量。则MTL_ONHAND_QUANTITIES_DETAIL表中的字段ORIG_DATE_RECEIVED 就会记录原始的接收日期,一直到它的库存消失为止。
算法如A)的算法大同小异。
C)假设FIFO的原理物料帐龄算法
如果库存系统不能满足上面的A),B)条件,那么我们如何计算物料的账龄?这里根据我们公司的账龄算法,给出一个解决方法。首先是假设物料是按FIFO的 原理来出入库的。然后我们还要假设一个原始的物料账龄,在这个基础上再按FIFO的原理运算出新的账龄。如果是刚上线的系统,则初期导入的库存为原始的物 料账龄,可认为导入时刻的物料库存账龄为零。如果是系统已经用了好多年了,那怎样计算物料的账龄呢?这里我们有一个近似的算法。可以用本文开始介绍的库存 追溯的计算方法,求出一年或二年前的库存数据,再默认此时的物料账龄为零。再以此数据为基础,按物料的FIFO原理计算到现在的物料账龄。一般我们认为物 料如果超过180天还在库存,就认为是呆料了,所以一年或二年的时间就可以了。我们实现的方法如下:
a) 用追溯的算法计算出一年或二年前的物料库存。
默认此时的物料账龄为零。具体的算法参考前面的SQL。这里要看公司对这个账龄的分类要求,是按仓位,还是要到货位,不同的公司有不同的要求。我们这里是以仓位为基本分类。
b) 根据前期的初始账龄。来推算现在的物料账龄。
2.1 创建一个表存放初始账龄的表。
初始的帐龄记录放入此表,以后的帐龄计算根据此表的数据来演算。
2.2 物料帐龄滚动计算。
截取初始账龄时间到现在某个时间为止的时间段内mtl_material_transactions表中的所有类型的记录(除成本更新)。对这段记录要按 交易时间的先后循序每一条,每一条的计算。按入库和出库情况进行分类。对新入库的要记录到表BITC_ITEM_INV_ATUO_AGE 中,原始的入库时间为这笔记录的交易时间。如果是出库的要找到这个物料最早的账龄日期的那笔库存。如果此笔库存不过扣减,则找到这个料下一笔账龄库存数。 直到满足这笔记录出库为止。这样不停的计算直到最后一笔。且每计算一笔记录,我们要在mtl_material_transactions表中标记为此笔 记录已运算过,下次不要重复计算。保证数据的准确性。如果运行到现在就是我们要的物料账龄表了,我们可以制定一个程序在后台定时运算。这样就能及时地得到 所要的物料账龄表。
具体的实现方法如下:
1. 截取初始账龄时间到现在某个时间为止的时间段内mtl_material_transactions表中的所有类型的记录(除成本更新),
2. 对此段记录的排序要特别处理。要按TRANSACTION_ID 和 PRIMARY_QUANTITY 排序。记住单位的不一致的要转化成一致。对子库存转移和挑库类型以及组织间转移的类型TRANSACTION_ID 要做一下特殊处理要,让此类型的数据的正数的记录排在负数记录的前面。因为Oracle 处理这些类型时,是先做一笔负数的扣减,从来源仓位扣去要转出的库存。然后再做一笔正数的到目的仓位的库存。为了记录帐龄表中的库存来源日期。我们要让正 数的到目的仓位先入库存。再让负数从来源仓出库。
3. 要对出入库的记录要分类处理。不同的类型有不同的处理算法。
3.1 对入库类型为:1:PO接收 2:工单完工入库,3:杂入,4:工单退回
要按新入库的记录放入初始账龄的表。
3.2 对出库类型和库存转移类型转出的部分。是要按帐龄的先后顺序扣减。
3.3 库存转移类型入库的部分要记录此笔记的原始入库时间,及将来原仓位的原始入库时间带过来。
成长
/ | \
学习 总结 分享
QQ交流群:122230156