应用:Inventory
职责:Inventory
基础业务学习
库存模块的核心是如实记录入库和出库的品种和数量,反应库存的当前价值。正如GL是ERP的账务处理核心,所有模块的会计分录,最后都要过到GL;同样,INV是ERP的物料处理核心,所有模块的物料事务处理都要在INV中体现。采购接收入库和退货、销售发运出库和RMA退回、WIP组件发料和退回、WIP装配件完工和退回、工厂内的仓库库间物品调拨、工厂间的物品调拨、低值易耗品杂项领料、盘点产生的盈亏、项目合同领料、成本更新导致的库存价值变动、内部请购/内部销售产生的物品转移,这些事务虽然操作界面分散在各个模块中,但最终都要及时在库存中做记录,以反映企业最新的存货数量和价值状况。那么这么多种业务在库存系统中如何区分呢?Oracle的设计思路是:用“事务处理型”来区分。
事务处理类型
事务处理类型(Type):乃“事务处理来源”、“事务处理动作”的组合;除了在库存直接做事务处理或者通过开发Interface导入数据外,各标准模块该用哪个“类型”,Oracle实际上是写死的,——“来源”和“动作”当然也固定下来了。
SELECT mtp.transaction_type_id,
mtp.transaction_type_name,
mtp.transaction_source_type_id,
mtp.transaction_action_id
FROM inv.mtl_transaction_types mtp
WHERE mtp.user_defined_flag = 'N'
ORDER BY 2;
事务处理来源(Source):类似总账的Journal Source,系统的各标准模块,都有各自的Source代码,由此得以区分各模块数据,如Source“Job or Schedule”代表WIP的库存事务。
SELECT tst.transaction_source_type_id, tst.transaction_source_type_name
FROM inv.mtl_txn_source_types tst
WHERE tst.user_defined_flag = 'N';
事务处理动作(Action):Source仅区分出来源模块,并未标志到底发生了什么动作——入库还是出库。为此Oracle引入了“事务处理动作”,并且对出入库进行了更加细致的划分,这个实际上才是系统内部区分库存事务的关键代码,如Action“Assembly completion”代表WIP完工入库。Action不允许自定义!
SELECT lov.lookup_code, lov.meaning
FROM mfg_lookups lov
WHERE lookup_type = 'MTL_TRANSACTION_ACTION'
ORDER BY 1;
此外,为更好的进行追溯和查询,库存系统还把相关模块的单据ID保留在inv.mtl_material_transactions.transaction_source_id字段上。
核心逻辑:库存组织用来屏蔽各类制造数据,Item/BOM/Routing等定义在库存组织上,WIP/MRP等跑在库存组织上;而库存事务处理则以子库为中心,要么从某个子库出,要么从某个子库入;每个子库可以启用货位,也可以不启用,如果启用了,则事务处理时还必须选择货位。在不同的库存内,子库代码可以重复;在不同的子库内,货位代码也可以重复。
也就是说,Oracle仅仅是提供了这样的一个模型,至于如何和实际业务对应,就非常灵活了。比如:库存是个组织的概念,其比较“虚”,可指一个工厂或者独立的办事处、分公司这样的实体;而子库则通常代表一个真正的物理仓库,也可指仓库或车间的一块区域,还可以是虚拟的;货位可用来代表仓库的某一处空间或者货架,也可指车间的一个块区域。
仍然站在库存立场看,Oracle的核心逻辑是这样的:
1、 反向:各个库存组织出、入库所产生的会计分录,根据这个“关系链”,传到相应的SOB,即仅仅是财务关系。
2、 正向:SO和PO接收入库、发货时,除Drop Ship外,必须选本OU下的库存组织。
批次控制
批次控制:入库、出库均需通过“批次/序列”指定批次,以此可跟踪每批物料流转信息和现有量,达到批次追踪的目的。
入库时可以指定一个新批次,或者一个已存在的批次,来表示数量合并,这个比较好理解;出库实际也是这样,系统并未限制在出库时必须选择已存在的批次,如果允许负库存,我们也可以指定一个新批次。
库存杂项、子库转移、组织间转移、采购或RMA接收入库/退货时、WIP投料/退料或者完工/退回时、SO保留/挑库或者出库、甚至盘点,因为都包含“入库、出库”动作,所以也需要指定批次,规则同上。
是否启用批次控制,是在Item属性上设置,改变的前提是该Item无现有量。至于批次号的产生方式、唯一性控制层次,均可设为按组织或按Item。
遗憾的是WIP投料和产出的批次是断开的,不通过开发,标准功能无法追踪。比如投入物料A,其中01批10个、02批20个,最后产出物料B共30个,这样就没法区分到底哪
些B是由01生产的,哪些B是由02批生产的,除非WIP每次生产一个B。
N: INV/Onhand, Availability/Lots可用来查看所有批次信息:批次号、保质期、是否有效、每个批次经历的事务处理、Onhand。
保质期控制方式在Item属性上定义:无、固定天数、输入批次时输入。过期的批次,不能保留,MRP计划、最大最小和重订货点库存计划也不考虑其数量,但其他地方照样可以用。
批次失效后,仅仅影响入库操作时,“批次”Lov不显示该批次。
WIP自动投料时(Backflush),会根据WIP参数上设置的方法自动选择批次。
序列号控制
与批次不同,有多少个单位的Item,就需要多少个序列号,两者是一一对应关系;序列号控制的另一层含义则是,事务处理量必须是主单位的整数倍。可在三个时点产生序列号:
1、 SO发货时:仅在SO Ship Confirm时,通过“批次/序列”界面输入序列号,其他任何事务处理都不需要指定序列号。特殊情况是,做RMA接收需要指定和原始发货一致的序列号。
2、 INV收货时:在PO Receipt或其他途径入库时,通过“批次/序列”界面输入序列号,之后做任何出库事务处理都需要指定序列号,而且必须选择已有的序列号。注:批次只能在入库时指定,但序列号可以在接收时就指定。
3、 预先生成:首先物料属性或者组织参数一定要指定前缀和起始编号,其次要用“生成序列号”请求为该物料预先生成一定数量的序列号;入库时,通过“批次/序列”界面输入序列号,之后做任何出库事务处理都需要指定序列号,而且必须选择已有的序列号。
4、 无控制:任何时候都不需要指定序列号。
序列号的控制方式,是在Item属性上设置。如果要改变,除非是从1变为4或2变成3,其它情况要求该Item无现有量。至于批次号的产生方式、唯一性控制层次,均可设为按组织或按Item。
N: INV/Onhand, Availability/Serial Numbers可用来查看所有序列号信息:序列号、状态、接收日期/发运日期、供应商、批次、每个序列号经历的事务处理、Onhand。
状态有:生成但未使用(Defined but not used)、在库存中(Resides in stores)、已发出(Issued out of inventory)、在途(Resides in intransit)。此外,因为序列号和Item是一一对应的,所以有序列号的物料也叫Serialized Item。
货位控制
货位控制:入库、出库均需在输入子库后再指定货位。货位的产生有两种方式:
1、 做库存相关事务处理(含SO保留,不含PO接收,下同)时指定,即动态录入。
2、 必须先设置好子库-货位的关系,做库存事务处理时只能选择子库下已有的货位。
单位、单位转换
每个物料都设有主单位,如“千克”,但是实际做出入库操作、做PO和SO,可能采用其它单位,比如大宗采购用“吨”更为合适,这个叫事务处理单位。
不过系统最终计算,都是先转成主单位后进行,比如销售成本计算如下:
销售数量 * 事务单位与主单位的转换率 * 每主单位的成本
实际上,Oracle的物料事务相关表中,基本都有3个字段:事务数量、事务单位、主数量。
货位控制通常在子库参数上设置,这里的优先级比Item属性上的高。
库存成本分录
库存事务处理的会计分录,本质都是出库、入库的分录,所以借贷的一方总是库存5大科目,另一方——对方科目,则视具体Action而定。参见“CST: Item Cost”章节的“成本分录”。