3.2 接收&退货导入api说明
此程序是调用标准API的客户化程序,实现处理处理接收&退货,处理方式有三种,联机,立即,和批,具体信息使用可以参考程序中的注释
- fnd_request.submit_request('PO',
- 'RVCTP', --
- NULL,
- to_char(SYSDATE, 'YYYY/MM/DD HH24:MI:SS'),
- FALSE,
- 'BATCH', --Mode(事务处理模式)
- p_group_id, --group_id(事务处理组标识)
- NULL, --org_id(业务实体名)
- chr(0))
-
-
-
-
-
-
- fnd_request.submit_request('PO', --APPLICATIONI SHORT NAME;
- 'RCVDLPDT', --PROGRAME SHORT NAME;
- '',
- '',
- FALSE,
- 'P_group_id=' || v_group_id,
- 'P_receipt_source_type=Supplier',
- 'P_qty_precision=2',
- 'P_org_id=' || p_organization_id);
- inv_quantity_tree_pub.query_quantities(p_api_version_number => 1.0,
-
- p_init_msg_lst => NULL,
-
- x_return_status => l_return_status,
-
- x_msg_count => l_msg_count,
-
- x_msg_data => l_msg_data,
-
- p_organization_id => rec_header.organization_id, --仓库ID
-
- p_inventory_item_id => rec_line.inventory_item_id, --物料ID
-
- p_tree_mode => 3,
-
- p_is_revision_control => FALSE,
-
- p_is_lot_control => TRUE,
-
- p_is_serial_control => FALSE,
-
- p_revision => NULL,
-
- p_lot_number => rec_loc.lot_number,
-
- p_lot_expiration_date => rec_loc.expiration_date,
-
- p_subinventory_code => rec_header.subinventory_code, --子库code
-
- p_locator_id => NULL, --rec_loc.locator_id,
-
- p_cost_group_id => NULL,
-
- p_onhand_source => inv_quantity_tree_pvt.g_all_subs,
-
- x_qoh => l_qoh, --现有量
-
- x_rqoh => l_atp_qty,
-
- x_qr => l_qr,
-
- x_qs => l_qs,
-
- x_att => l_att,
-
- x_atr => l_atr);
库存管理的核心是对货物本身的管理,是对货物的数量与相关属性的管理,目的是为销售与采购服务,确保合理的库存保有量,处理库存分类帐目与进出流水帐,以单据的形式基本涵盖仓库的各种进出库业务。
库存组织结构
组织是一种业务单位,例如:公司、工厂、仓库、分部和部门等,组织可以根据实际业务不同分成多种层次,例如:法人实体,经营单位,库存组织等。库存组织是建立在经营单位之下的,可以细分为不同的子库存。特别的是项目主组织,是专门为了统一定义库存物品而设立的,可以是一个虚拟的并不存在的组织,对应实际仓库。子库存是从物料库存中分离出来的独特的物理或逻辑库存,如原材料、成品或不良品的独自存货位置,客户虚拟仓等,货位是存储物料的子库存内的实际区域,例如:行、通道、存料箱或货架。组织中的所有物料均保留在子库存中,因此必须至少定义一个子库存。一个OU下可以有多个IO,一个IO下可以设置多个子库,每个子库下可以设置多个货位。
Oracle产品按照不同的组织层次分别进行安全性的控制。总帐按照帐套进行数据屏蔽,而销售/应收/采购/应付是典型的按照经营单位进行管理,库存/物料清单/车间则是按照库存组织分别管理。
库存组织用来屏蔽各类制造数据,Item/BOM/Routing等定义在库存组织上,WIP/MRP等跑在库存组织上;而库存事务处理则以子库存为中心,要么从某个子库存出,要么从某个子库存入;每个子库存可以启用货位,也可以不启用;如果启用了,则事务处理时必须选择货位。在不同的库存内,子库代码可以重复;在不同的子库内,货位代码也可以重复。也就是说,Oracle仅仅是提供了这样的模型,至于如何和实际业务对用,就非常灵活了。比如:库存是个组织的概念,其比较“虚”,可指一个工厂或者独立的办事处、分公司这样的实体;而子库则通常代表一个真正的物理仓库,也可指仓库或者车间的一块区域,还可以是虚拟的;货位可用来代表仓库的某一处空间或者货架,也可指车间的一个块区域。
为了维护整个系item码和信息的统一,在库存组织中有个物料主组织的概念,该组织定义item的属性,并分配给以他为主组织的库存组织使用,相应的item的属性也分为主层控制和组织层控制,主层控制的属性只能在主组织改,组织层控制的属性可以在各个库存组织维护。Oracle强烈建议一个帐套下只有只有一个库存主组织,并且不要在库存主组织作任何事务处理。
库存事务处理
库存事务处理是库存业务的核心,是ERP库存模块数据和相关模块数据处理的源头,包括采购订单接收与返回,WIP发退料与完工入库,子库间转移,杂项事务,销售发货与RMA等。
事务处理是物品进、出库存或在仓库内或者组织间移动,即仓库的日常收发业务处理事务处理会引起物品数量,位置或成本的变化库存事务有多种,有系统提供的,也可由客户根据实际情况需要定义每一种物品交易时系统会产生对应的财务记录可以通过版本号、批号、系列号,货位来对有关项目进行跟踪/控制物品的事务处理可以与相关的项目(Project)进行关联
事务处理反映业务信息,事务处理分配反映会计信息。事务处理分配以库存组织、过账批次为单位,以会计科目为核心汇总所有事务处理类型的会计信息,将借贷发生额导入总帐系统。成本模块的事务处理主要有接收、库存、WIP三大类,系统日记帐报表中的类型反映事务处理的大类。物料事务处理分配和WIP事务处理分配分别反映库存类和WIP类的会计信息,并按类别来源导入总帐系统。
事务处理类型,来源和对应的会计科目如下,其中事务类型=事务来源+事务动作。
库存控制
库存控制包括货位控制,批次控制,序列号控制,版本控制。
货位控制可以使用货位来标识存储库存项目的实际区域。项目数量可以通过货位跟踪。项目也可以限制在特定货位范围内。实行货位控制便于控制储货位置和存储能力。可以为库存中的特定项目启用批次控制,批次号特别适用于有保质期控制的物料。对于批次控制下的项目,可以对转入库存的每次收货指定批号,此后在每次执行物料事务处理时您均可以参考相同的批次。版本控制则实际控制会喜欢到物料版本,以版本号来区分,通过查询可了解各版本的部品材料和半成品的数量,且必须输入版本号才能进行事务处理。
库存盘点
在ERP系统中,仓库数据的准确性直接影响到整个系统计划的运行。库存盘点是保证库存记录准确的必要手段,通过盘点可以查找出错的原因,调整系统与实际库存量的差异,及时维护库存数据的准确性。库存盘点包括实际盘点和周期性盘点,如每个月末进行库存盘点。
ABC分类是周期盘点的前提条件,将库存物料按一定的标准分成相应的等级,用于决定不同的物料在周期盘点时的盘点频率,可以根据库存价值,库存数量,使用频率等作为划分的标准。
周期盘点与实际盘点的区别在于周期盘点有计划性,其根据ABC分类结果,设定的周期盘点频率定期对物料进行盘点对库存控制和准确性要求更高
采购接收是库存与采购连接的一座桥梁,也是应付发票与采购单、库存接收匹配的一根纽带。
采购接收一般有三种方式,一种是供应商送货来直接入库;一种是供应商送货来先接收,接收后再安排入库;还有即是先接收,然后送检,质量检查通过后再入库。采购接收的来源主要包括采购订单接收,组织间转移的接收,销售退货的接收。
接收入库的种类接收入库可以按照数据来源分为2种:
1. 对于po订单以及发放的接收入库;
2. 对于内部请购单生成的sales order(后面的部分简称so)的接收入库;
接收入库还可以按照入库方式分为3种:
1. 直接入库:接收后自动入库;
2. 标准入库:先接收,后入库,分两个步骤;
3. 需要检验的接收入库:先接收,然后检验,最后入库;
标准订单以及一揽子采购协议发放1. 对于标准订单,当订单被approve之后,系统会在mtl_supply这张表中插入该订单相关的记录,系统默认为每一个订单分配行生成一条mtl_supply数据,其supply_type_code值为“PO”,表示物料供应的来源,目前是来自po订单。所以mtl_supply表中,对于标准订单以及一揽子发放,其数据层次是明细到分配行的,即根据distribution_id可以唯一确定一个mtl_supply行:
- SELECT pha.segment1,
- pla.line_num,
- plla.shipment_num,
- pda.distribution_num,
- ms.supply_type_code,
- ms.quantity
- FROM mtl_supply ms,
- po_headers_all pha,
- po_lines_all pla,
- po_line_locations_all plla,
- po_distributions_all pda
- WHERE ms.po_distribution_id = pda.po_distribution_id
- AND ms.supply_type_code = 'PO'
- AND pha.po_header_id = pla.po_header_id
- AND plla.po_header_id = pha.po_header_id
- AND plla.po_line_id = pla.po_line_id
- AND pda.line_location_id = plla.line_location_id
- AND pha.segment1 = '1000100'
以上sql语句将筛选出订单编号为‘1000100’的订单可以接收的distribution行以及可以接收的数量。
注意:在这个时候,rcv_shipmet_headers以及rcv_shipment_lines这两张表中还没有数据,这是po订单与内部请购单接收数据流中的一个较大的差异。
造成这种差异的原因是:
对于po订单,其发运对象是外部供应商,系统无法控制以及检测外部供应商的发运动作,所以只能在做接收的时候,才能生成发运信息,在任何接收之前,系统是不知道任何发运数据的;
而对于内部请购单生成的SalesOrder来说,发运对象是公司内部其它组织或ou,发运信息是在其他组织或OU做SO的发运时就产生了,而不必等到接收的时候才产生相应的发运信息。
由于以上差异,在po订单做接收时,接口中不必提供shipment信息,而在po入库以及内部请购单生成的so接收的时候,则需要提供shipment信息。
2. 接下来,当我们为po订单做接收的时候,系统会生成相应的shipment信息,经过测试,每次接收会生成一个新的shipment头,每个接收行会生成一个新的shipment行。所以,对于po接收,其接收的transactionid与发运行的shipmentline id是一一对应的,在做po入库的时候,可以利用这一点,通过shipmentline找到可以入库的parenttransaction id。另外,对于po接收,其在发运行中的quantityreceived与quantityshipped字段的值总是一样的,因为发运记录是完全参照接收记录生成的。
3. 对于直接入库的订单,接收后将同时在RCV_TRANSACTION中生成接收记录以及入库记录;
对于标准接收则分为接收和入库两个步骤,接收生成接收事务处理记录,并且同时在MTL_SUPPLY中可以找到mtl_supply_type为“RECEIVING”的记录,表示存在可入库记录了,入库来源是“RECEIVING”。入库后再同一张表(RCV_TRANSACTION)中生成入库事务处理记录;虽然接收后在MTL_SUPPLY表中可以查到可入库的信息,但是因为接收后已经在RCV_TRANSACTION中产生了接收事务处理记录,理论上来说,以上两者的数据应当是等价的,但是这时候我们习惯于从RCV_TRANSACTION表中查找可以入库的记录。
对于需要检验的接收入库,在接收后,需要完成检验,对接收记录打上检验通过标记后,才能进行入库动作,最终生成入库事务处理记录。
接口表注意事项不同的入库方式Oracle提供了三种可选的入库方式(在PO订单分配行界面维护):
1. 直接入库:接收后自动入库;
2. 标准入库:接收后,进行入库动作,才完成最终入库;
3. 要求检验的入库:接收后,进行检验,打印检验通过标记后,才能进行入库动作。
对于这三种接收入库,接口表通过不同的控制字段来完成期望的接收入库动作:
- a) 对于直接入库的接收,插接收事务处理的接口行表(rcv_transactions_interface)时的几个关键的状态字段:
- rcv_transactions_interface.transaction_type := 'RECEIVE';
- rcv_transactions_interface.auto_transact_code := 'DELIVER';
- rcv_transactions_interface.destination_type_code := 'INVENTORY';
- b) 对于标准以及需检验的入库的接收,插接收事务处理的接口行表(rcv_transactions_interface)时的几个关键的状态字段:
- rcv_transactions_interface.transaction_type := 'RECEIVE';
- rcv_transactions_interface.auto_transact_code := NULL;
- rcv_transactions_interface.destination_type_code := ' RECEIVING ';
- c) 对于接收甚至检验后的数据做入库时,插接收事务处理的接口行表(rcv_transactions_interface)时的几个关键的状态字段:
- rcv_transactions_interface.transaction_type := 'DELIVER';
- rcv_transactions_interface.auto_transact_code := NULL;
- rcv_transactions_interface.destination_type_code := 'INVENTORY';
可入库数量我们需要判断可入库数量,这是对入库接口数据的一项基本校验,是否有足够的数量可以入库,我们分别给出PO以及IR的可入库数量的算法:
带有批次处理的接收或退货有两种处理模式,一种是我上面的API例子,另外一种参考如下:
对于带批次或序列号的接收入库 对于带批次或序列号的接收入库,对于1行rcv_transactions_interface记录需要额外插两张MTL的接口表。这里有一个比较诡异的地方,就是接收入库时,插rcv_serials_interface,以及rcv_lots_interface这两张表是没用的,而一定要插mtl_transaction_lots_interface以及mtl_serial_numbers_interface这两张MTL表,而且对应的要设置
rcv_transactions_interface.use_mtl_lot := 2;
rcv_transactions_interface.use_mtl_serial := 2;
以下程序在11i下验证通过
- --lot info------------
- IF (rec_line.lot_number IS NOT NULL) THEN
-
- mtl_transaction_lots_interfac.last_update_date := SYSDATE;
- mtl_transaction_lots_interfac.last_updated_by := fnd_global.user_id;
- mtl_transaction_lots_interfac.creation_date := SYSDATE;
- mtl_transaction_lots_interfac.created_by := fnd_global.user_id;
- mtl_transaction_lots_interfac.last_update_login := -1;
- mtl_transaction_lots_interfac.product_code := 'RCV';
- mtl_transaction_lots_interfac.product_transaction_id := rcv_transactions_interface.interface_transaction_id;
- mtl_transaction_lots_interfac.lot_number := rec_line.lot_number;
- mtl_transaction_lots_interfac.transaction_quantity := l_iface_rcv_rec.quantity;
- mtl_transaction_lots_interfac.primary_quantity := l_primary_qty;
-
- SELECT mtl_material_transactions_s.NEXTVAL
- INTO mtl_transaction_lots_interfac.transaction_interface_id
- FROM dual;
-
- l_primary_qty :=1;
-
- INSERT INTO mtl_transaction_lots_interface VALUES mtl_transaction_lots_interfac;
-
- END IF;
-
- --serial info
- IF (serial_number IS NOT NULL) THEN
- mtl_serial_numbers_interface.last_update_date := SYSDATE;
- mtl_serial_numbers_interface.last_updated_by := fnd_global.user_id;
- mtl_serial_numbers_interface.creation_date := SYSDATE;
- mtl_serial_numbers_interface.created_by := fnd_global.user_id;
- mtl_serial_numbers_interface.last_update_login := -1;
- mtl_serial_numbers_interface.product_code := 'RCV';
- mtl_serial_numbers_interface.fm_serial_number :=serial_number;
- mtl_serial_numbers_interface.to_serial_number :=serial_number;
- mtl_serial_numbers_interface.process_flag := 1;
- mtl_serial_numbers_interface.product_transaction_id := l_iface_rcv_rec.interface_transaction_id;
-
- SELECT mtl_material_transactions_s.NEXTVAL
- INTO mtl_serial_numbers_interface.transaction_interface_id
- FROM dual;
-
- INSERT INTO mtl_serial_numbers_interface VALUES mtl_serial_numbers_interface;
- END IF;
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。