详解EBS接口开发之库存事务处理采购接收和退货

Posted caixingyun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解EBS接口开发之库存事务处理采购接收和退货相关的知识,希望对你有一定的参考价值。


(一)接收&退货常用标准表简介

1.1   常用标准表

如下表中列出了与采购接收&退货导入相关的表和说明:

表名

说明

其他信息

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

库存现有量

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.2  接口表大体介绍

如下表中列出了与接收&退货导入相关的接口表和说明:

表名

说明

其他信息

rcv_headers_interface

接口头表

 

 

 

rcv_transactions_interface

接口行表

 

 

 

mtl_transaction_lots_interface

库存事务处理接口批次表

 

 

 

rcv_lots_interface

接收/退货批次表

 

 

 

mtl_transaction_lots_temp

批次临时表

 

 

 

po_interface_errors

接口错误信息表

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.3   说明

这里只列出了接收相关的大多数常用表。还有一些不经常用到的没有涉及,具体可以参考oracle网站上的

 

(二)接收&退货导入组成

接收&退货导入主要包括:事务处理头信息,事务处理行信息,事务处理批次信息

 

2.1  接收&退货导入组成

事务处理头信息导入:导入事务处理头信息

事务处理行信息导入:导入事务处理行信息

事务处理批次信息导入:导入事务处理批次信息

(三)接收&退货导入顺序及流程

3.1   接收&退货导入顺序

由于数据的先后关联依赖关系,常见的是同一物料对应不同批次接收,或者同一采购订单分不同批次接收,所以导入比较灵活,具体内容在程序中分析。

 

3.2   接收&退货导入流程

接收&退货导入流程:

第一步:创建需要导入接收&退货的中间表,字段上提供相关信息。

第二步:向中间表中插入需要导入的信息,验证需要插入的数据是否满足信息规则,去除不合规范的数据。

第三步:对在第二部中验证及转化翻译的数据插入到接口中,验证现有量。

第四步:提交并发请求导入应收发票信息(或者调用API实现处理)。

3.2   接收&退货导入说明

两种方法老黄如是说:

*不要使用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;

(四)接收&退货导入API研究

--=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);


 

 

3.2   接收&退货导入api说明
此程序是调用标准API的客户化程序,实现处理处理接收&退货,处理方式有三种,联机,立即,和批,具体信息使用可以参考程序中的注释

 

(五)接收&退货导入并发程序研究

 

4.1   导入的并发请求

 

 

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);

 

(六)接收&退货常用验证

 

6.1  现有量检查

 

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);

 

七)参考实例程序

 

7.接口表一些重要字段

 

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分类结果,设定的周期盘点频率定期对物料进行盘点对库存控制和准确性要求更高

采购接收入库&退货出库

采购接收是库存与采购连接的一座桥梁,也是应付发票与采购单、库存接收匹配的一根纽带。
采购接收一般有三种方式,一种是供应商送货来直接入库;一种是供应商送货来先接收,接收后再安排入库;还有即是先接收,然后送检,质量检查通过后再入库。采购接收的来源主要包括采购订单接收,组织间转移的接收,销售退货的接收。

 

接收入库的种类接收入库可以按照数据来源分为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,发运信息是在其他组织或OUSO的发运时就产生了,而不必等到接收的时候才产生相应的发运信息。

由于以上差异,在po订单做接收时,接口中不必提供shipment信息,而在po入库以及内部请购单生成的so接收的时候,则需要提供shipment信息。

2
  接下来,当我们为po订单做接收的时候,系统会生成相应的shipment信息,经过测试,每次接收会生成一个新的shipment头,每个接收行会生成一个新的shipment行。所以,对于po接收,其接收的transactionid与发运行的shipmentline id是一一对应的,在做po入库的时候,可以利用这一点,通过shipmentline找到可以入库的parenttransaction id。另外,对于po接收,其在发运行中的quantityreceivedquantityshipped字段的值总是一样的,因为发运记录是完全参照接收记录生成的。
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例子,另外一种参考如下:

对于带批次或序列号的接收入库         对于带批次或序列号的接收入库,对于1rcv_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;



 

以上是关于详解EBS接口开发之库存事务处理采购接收和退货的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE EBS 物料事务处理开发接口案例 - 其物料启用了序列和批次

成本更新和算法

ORACLE EBS ASN入库事务处理开发接口案例

第三轮面试

Enterprise Solution 进销存管理软件 C/S架构,支持64位系统 物流,资金流,信息流全面集成

进入EBS AR 事务处理界面报错