如下表中列出了与采购接收&退货导入相关的表和说明:
表名 |
说明 |
其他信息 |
||
RCV_TRANSACTIONS |
采购接收事务表 |
事务类型,订单分配行相关信息 |
|
|
rcv_shipment_headers |
采购接收头表 |
接收单号,供应商,订单号 |
|
对应视图 |
rcv_shipment_lines |
采购接收行表 |
物料信息,接收组织信息,接收子库,接收数量 |
|
对应视图 |
mtl_supply |
可以接收入库的记录 |
|
|
对应视图 |
RCV_ACCOUNTING_EVENTS |
接收科目事件表 |
|
|
对应视图 |
RCV_RECEIVING_SUB_LEDGER |
接收会计科目表 |
|
|
对应视图 |
mtl_system_items_b |
物料信息表 |
是否启用批次控制 |
|
对应视图 |
mtl_lot_numbers |
批次信息表 |
|
|
|
mtl_material_transactions |
物料事务处理 |
子库,事务类型,数量,事务处理时间 |
|
|
mtl_onhand_quantities |
库存现有量 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如下表中列出了与接收&退货导入相关的接口表和说明:
表名 |
说明 |
其他信息 |
||
rcv_headers_interface |
接口头表 |
|
|
|
rcv_transactions_interface |
接口行表 |
|
|
|
mtl_transaction_lots_interface |
库存事务处理接口批次表 |
|
|
|
rcv_lots_interface |
接收/退货批次表 |
|
|
|
mtl_transaction_lots_temp |
批次临时表 |
|
|
|
po_interface_errors |
接口错误信息表 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
这里只列出了接收相关的大多数常用表。还有一些不经常用到的没有涉及,具体可以参考oracle网站上的
接收&退货导入主要包括:事务处理头信息,事务处理行信息,事务处理批次信息
事务处理头信息导入:导入事务处理头信息
事务处理行信息导入:导入事务处理行信息
事务处理批次信息导入:导入事务处理批次信息
由于数据的先后关联依赖关系,常见的是同一物料对应不同批次接收,或者同一采购订单分不同批次接收,所以导入比较灵活,具体内容在程序中分析。
接收&退货导入流程:
第一步:创建需要导入接收&退货的中间表,字段上提供相关信息。
第二步:向中间表中插入需要导入的信息,验证需要插入的数据是否满足信息规则,去除不合规范的数据。
第三步:对在第二部中验证及转化翻译的数据插入到接口中,验证现有量。
第四步:提交并发请求导入应收发票信息(或者调用API实现处理)。
两种方法老黄如是说:
*不要使用xxx_temp接口表,如mtl_material_transactions_temp;用它们会绕过系统id验证,直接进入数据表
关于批次或者序列控制,表字段需注意:
仅启用批次
mtl_transactions_interface.transaction_interface_id= mtl_transaction_lots_interface.transaction_interface_id
仅启用序列
mtl_transactions_interface.transaction_interface_id= mtl_serial_numbers_interface.transaction_interface_id
同时启用批次、序列
mtl_transactions_interface.transaction_interface_id= mtl_transaction_lots_interface.transaction_interface_id
mtl_transaction_lots_interface.serial_transaction_temp_id= mtl_serial_numbers_interface.transaction_interface_id
mtl_transactions_interface
select mti.error_code,mti.error_explanation
from mtl_transactions_interface mti;
--=ONLINE(联机), --=BATCH(批),需要手工提交一个请求,不建议使用 --=IMMEDIATE(立即),建议使用这种方式 --added by cxy@2013-11-15 end l_return_code := fnd_transaction.synchronous(timeout => l_timeout, outcome => l_outcome, message => l_message, application => 'PO', program => 'RCVTPO', arg_1 => 'ONLINE', --联机 arg_2 => p_group_id);
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);
1.事务处理头 SELECT po.rcv_interface_groups_s.nextval INTO l_group_id FROM dual; g_group_id(x_group_num) := l_group_id; x_group_num := x_group_num + 1; SELECT rcv_headers_interface_s.nextval INTO l_rcv_headers_interface.header_interface_id FROM dual; --l_rcv_headers_interface.header_interface_id := NULL; l_rcv_headers_interface.group_id := l_group_id; --Required l_rcv_headers_interface.processing_status_code := 'PENDING'; --Required l_rcv_headers_interface.receipt_source_code := 'VENDOR'; --Required l_rcv_headers_interface.transaction_type := 'NEW'; l_rcv_headers_interface.auto_transact_code := 'DELIVER'; --'RECEIVE'; ---conditionally l_rcv_headers_interface.receipt_num := 'RCV-' || --v_vendor_name l_group_id; ---conditionally --l_rcv_headers_interface.vendor_name := v_vendor_name; --Required -- l_rcv_headers_interface.vendor_num := v_vendor_num; --Required l_rcv_headers_interface.vendor_id := v_vendor_id; --Required -- l_rcv_headers_interface.vendor_site_code := v_vendor_site_code; l_rcv_headers_interface.vendor_site_id := v_vendor_site_id; l_rcv_headers_interface.ship_to_organization_code := NULL; ---conditionally l_rcv_headers_interface.ship_to_organization_id := rec_header.organization_id; ---conditionally l_rcv_headers_interface.expected_receipt_date := rec_header.txn_date; --接收日期 -- l_rcv_headers_interface.employee_name := v_agent_name; ---conditionally -- l_rcv_headers_interface.employee_id := v_agent_id; l_rcv_headers_interface.validation_flag := 'Y'; --Required -- l_rcv_headers_interface.currency_code := 'CN'; l_rcv_headers_interface.transaction_date := SYSDATE; l_rcv_headers_interface.org_id := NULL; l_rcv_headers_interface.last_update_date := SYSDATE; --Required l_rcv_headers_interface.last_updated_by := g_user_id; --Required l_rcv_headers_interface.last_update_login := g_login_id; l_rcv_headers_interface.creation_date := SYSDATE; --Required l_rcv_headers_interface.created_by := g_user_id; --Required 2.事务处理行 SELECT rcv_transactions_interface_s.nextval INTO l_rcv_transactions_interface.interface_transaction_id FROM dual; -- l_rcv_transactions_interface.interface_transaction_id := NULL; l_rcv_transactions_interface.last_update_date := SYSDATE; --Required l_rcv_transactions_interface.last_updated_by := g_user_id; --Required l_rcv_transactions_interface.creation_date := SYSDATE; --Required l_rcv_transactions_interface.created_by := g_user_id; --Required l_rcv_transactions_interface.last_update_login := g_login_id; l_rcv_transactions_interface.request_id := NULL; l_rcv_transactions_interface.program_application_id := g_prog_appl_id; l_rcv_transactions_interface.program_id := g_conc_program_id; l_rcv_transactions_interface.program_update_date := SYSDATE; l_rcv_transactions_interface.validation_flag := 'Y'; --Required l_rcv_transactions_interface.header_interface_id := l_rcv_headers_interface.header_interface_id; l_rcv_transactions_interface.shipment_header_id := NULL; l_rcv_transactions_interface.group_id := l_group_id; --Required--- l_rcv_transactions_interface.processing_status_code := 'PENDING'; --Required --Required l_rcv_transactions_interface.transaction_status_code := 'PENDING'; --Required l_rcv_transactions_interface.processing_mode_code := 'ONLINE'; --Required l_rcv_transactions_interface.receipt_source_code := 'VENDOR'; --Required l_rcv_transactions_interface.vendor_id := v_vendor_id; --Required l_rcv_transactions_interface.vendor_site_id := v_vendor_site_id; --Required l_rcv_transactions_interface.source_document_code := 'PO'; --Required l_rcv_transactions_interface.po_header_id := v_po_header_id; --115001; --v_po_header_id; --Required or duc num l_rcv_transactions_interface.po_line_id := v_po_line_id; --112001; --41001; ---conditionally;one time item l_rcv_transactions_interface.po_line_location_id := v_line_location_id; --109002; l_rcv_transactions_interface.po_distribution_id := v_po_distribution_id; --103002; l_rcv_transactions_interface.transaction_type := 'RECEIVE'; --Required --接收或退货至(供应商or接收) l_rcv_transactions_interface.auto_transact_code := 'DELIVER'; --Required l_rcv_transactions_interface.destination_type_code := 'INVENTORY'; l_rcv_transactions_interface.category_id := v_category_id; --1123; ---conditionally l_rcv_transactions_interface.item_id := rec_line.inventory_item_id; ---conditionally l_rcv_transactions_interface.item_description := NULL; --v_item_desc; --Required l_rcv_transactions_interface.transaction_date := SYSDATE; --Required l_rcv_transactions_interface.quantity := rec_line.quantity; --Required l_rcv_transactions_interface.uom_code := rec_line.transaction_uom; l_rcv_transactions_interface.unit_of_measure := rec_line.transaction_uom; --Required l_rcv_transactions_interface.primary_quantity := rec_line.quantity; l_rcv_transactions_interface.primary_unit_of_measure := rec_line.transaction_uom; l_rcv_transactions_interface.inspection_status_code := NULL; --'NOT INSPECTED'; l_rcv_transactions_interface.expected_receipt_date := rec_header.txn_date; ---conditionally l_rcv_transactions_interface.destination_context := 'INVENTORY'; l_rcv_transactions_interface.source_doc_quantity := NULL; l_rcv_transactions_interface.source_doc_unit_of_measure := NULL; l_rcv_transactions_interface.use_mtl_lot := get_lot_control_code(rec_line.organization_id, rec_line.inventory_item_id); --批次控制 l_rcv_transactions_interface.use_mtl_serial := get_serial_control_code(rec_line.organization_id, rec_line.inventory_item_id); l_rcv_transactions_interface.org_id := rec_header.org_id; -- l_rcv_transactions_interface.routing_header_id := 3; l_rcv_transactions_interface.routing_step_id := 1; l_rcv_transactions_interface.currency_code := 'CNY'; l_rcv_transactions_interface.currency_conversion_type := NULL; l_rcv_transactions_interface.currency_conversion_rate := NULL; l_rcv_transactions_interface.currency_conversion_date := NULL; l_rcv_transactions_interface.po_unit_price := NULL; l_rcv_transactions_interface.to_organization_id := rec_line.organization_id; ---conditionally l_rcv_transactions_interface.subinventory := rec_header.subinventory_code; ---conditionally l_rcv_transactions_interface.ship_to_location_id := v_ship_to_location_id; --142; ---conditionally l_rcv_transactions_interface.interface_source_code := 'RCV'; 3.批次信息 l_rcv_lots_interface.interface_transaction_id := l_rcv_transactions_interface.interface_transaction_id; l_rcv_lots_interface.last_update_date := SYSDATE; l_rcv_lots_interface.last_updated_by := fnd_global.user_id; l_rcv_lots_interface.creation_date := SYSDATE; l_rcv_lots_interface.created_by := fnd_global.user_id; l_rcv_lots_interface.last_update_login := fnd_global.login_id; l_rcv_lots_interface.request_id := NULL; l_rcv_lots_interface.program_application_id := NULL; l_rcv_lots_interface.program_id := NULL; l_rcv_lots_interface.program_update_date := NULL; l_rcv_lots_interface.lot_num := rec_lot.lot_number; l_rcv_lots_interface.quantity := rec_lot.transaction_quantity; l_rcv_lots_interface.transaction_date := SYSDATE; l_rcv_lots_interface.expiration_date := rec_lot.lot_expiration_date; l_rcv_lots_interface.primary_quantity := rec_lot.transaction_quantity; l_rcv_lots_interface.item_id := rec_line.inventory_item_id; l_rcv_lots_interface.shipment_line_id := NULL; l_rcv_lots_interface.sublot_num := NULL; l_rcv_lots_interface.secondary_quantity := NULL; l_rcv_lots_interface.qc_grade := NULL; l_rcv_lots_interface.reason_code := NULL; l_rcv_lots_interface.parent_lot_number := NULL; 4.批次临时信息 l_iface_txn_lot_temp_rec.transaction_temp_id := l_rcv_transactions_interface.interface_transaction_id; l_iface_txn_lot_temp_rec.last_update_date := SYSDATE; l_iface_txn_lot_temp_rec.last_updated_by := fnd_global.user_id; l_iface_txn_lot_temp_rec.creation_date := SYSDATE; l_iface_txn_lot_temp_rec.created_by := fnd_global.user_id; l_iface_txn_lot_temp_rec.last_update_login := fnd_global.login_id; l_iface_txn_lot_temp_rec.lot_number := rec_lot.lot_number; l_iface_txn_lot_temp_rec.transaction_quantity := rec_lot.transaction_quantity; l_iface_txn_lot_temp_rec.primary_quantity := rec_lot.transaction_quantity; l_iface_txn_lot_temp_rec.group_header_id := l_group_id; l_iface_txn_lot_temp_rec.lot_expiration_date := rec_lot.lot_expiration_date; l_iface_txn_lot_temp_rec.product_code := 'RCV'; l_iface_txn_lot_temp_rec.product_transaction_id := l_rcv_transactions_interface.interface_transaction_id; l_iface_txn_lot_temp_rec.origination_type := 3; 7.2调用API处理 cux_rcv_online_pub.process_rcv_online(p_api_version => 1.0, p_init_msg_list => 'T', p_commit => 'T', x_return_status => l_return_status, x_msg_count => l_msg_count, x_msg_data => l_msg_data, p_group_id => g_group_id(i));
库存管理的核心是对货物本身的管理,是对货物的数量与相关属性的管理,目的是为销售与采购服务,确保合理的库存保有量,处理库存分类帐目与进出流水帐,以单据的形式基本涵盖仓库的各种进出库业务。
库存组织结构
组织是一种业务单位,例如:公司、工厂、仓库、分部和部门等,组织可以根据实际业务不同分成多种层次,例如:法人实体,经营单位,库存组织等。库存组织是建立在经营单位之下的,可以细分为不同的子库存。特别的是项目主组织,是专门为了统一定义库存物品而设立的,可以是一个虚拟的并不存在的组织,对应实际仓库。子库存是从物料库存中分离出来的独特的物理或逻辑库存,如原材料、成品或不良品的独自存货位置,客户虚拟仓等,货位是存储物料的子库存内的实际区域,例如:行、通道、存料箱或货架。组织中的所有物料均保留在子库存中,因此必须至少定义一个子库存。一个OU下可以有多个IO,一个IO下可以设置多个子库,每个子库下可以设置多个货位。
Oracle产品按照不同的组织层次分别进行安全性的控制。总帐按照帐套进行数据屏蔽,而销售/应收/采购/应付是典型的按照经营单位进行管理,库存/物料清单/车间则是按照库存组织分别管理。
库存组织用来屏蔽各类制造数据,Item/BOM/Routing等定义在库存组织上,WIP/MRP等跑在库存组织上;而库存事务处理则以子库存为中心,要么从某个子库存出,要么从某个子库存入;每个子库存可以启用货位,也可以不启用;如果启用了,则事务处理时必须选择货位。在不同的库存内,子库代码可以重复;在不同的子库内,货位代码也可以重复。也就是说,Oracle仅仅是提供了这样的模型,至于如何和实际业务对用,就非常灵活了。比如:库存是个组织的概念,其比较“虚”,可指一个工厂或者独立的办事处、分公司这样的实体;而子库则通常代表一个真正的物理仓库,也可指仓库或者车间的一块区域,还可以是虚拟的;货位可用来代表仓库的某一处空间或者货架,也可指车间的一个块区域。
为了维护整个系item码和信息的统一,在库存组织中有个物料主组织的概念,该组织定义item的属性,并分配给以他为主组织的库存组织使用,相应的item的属性也分为主层控制和组织层控制,主层控制的属性只能在主组织改,组织层控制的属性可以在各个库存组织维护。Oracle强烈建议一个帐套下只有只有一个库存主组织,并且不要在库存主组织作任何事务处理。
库存事务处理
库存事务处理是库存业务的核心,是ERP库存模块数据和相关模块数据处理的源头,包括采购订单接收与返回,WIP发退料与完工入库,子库间转移,杂项事务,销售发货与RMA等。
事务处理是物品进、出库存或在仓库内或者组织间移动,即仓库的日常收发业务处理事务处理会引起物品数量,位置或成本的变化库存事务有多种,有系统提供的,也可由客户根据实际情况需要定义每一种物品交易时系统会产生对应的财务记录可以通过版本号、批号、系列号,货位来对有关项目进行跟踪/控制物品的事务处理可以与相关的项目(Project)进行关联
事务处理反映业务信息,事务处理分配反映会计信息。事务处理分配以库存组织、过账批次为单位,以会计科目为核心汇总所有事务处理类型的会计信息,将借贷发生额导入总帐系统。成本模块的事务处理主要有接收、库存、WIP三大类,系统日记帐报表中的类型反映事务处理的大类。物料事务处理分配和WIP事务处理分配分别反映库存类和WIP类的会计信息,并按类别来源导入总帐系统。
事务处理类型,来源和对应的会计科目如下,其中事务类型=事务来源+事务动作。
库存控制
库存控制包括货位控制,批次控制,序列号控制,版本控制。
货位控制可以使用货位来标识存储库存项目的实际区域。项目数量可以通过货位跟踪。项目也可以限制在特定货位范围内。实行货位控制便于控制储货位置和存储能力。可以为库存中的特定项目启用批次控制,批次号特别适用于有保质期控制的物料。对于批次控制下的项目,可以对转入库存的每次收货指定批号,此后在每次执行物料事务处理时您均可以参考相同的批次。版本控制则实际控制会喜欢到物料版本,以版本号来区分,通过查询可了解各版本的部品材料和半成品的数量,且必须输入版本号才能进行事务处理。
库存盘点
在ERP系统中,仓库数据的准确性直接影响到整个系统计划的运行。库存盘点是保证库存记录准确的必要手段,通过盘点可以查找出错的原因,调整系统与实际库存量的差异,及时维护库存数据的准确性。库存盘点包括实际盘点和周期性盘点,如每个月末进行库存盘点。
ABC分类是周期盘点的前提条件,将库存物料按一定的标准分成相应的等级,用于决定不同的物料在周期盘点时的盘点频率,可以根据库存价值,库存数量,使用频率等作为划分的标准。
周期盘点与实际盘点的区别在于周期盘点有计划性,其根据ABC分类结果,设定的周期盘点频率定期对物料进行盘点对库存控制和准确性要求更高
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'
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';
--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;