详解EBS接口开发之销售订单挑库发放

Oracle EBS销售订单挑库发放详解
本文详细介绍了在Oracle EBS系统中如何进行销售订单的有效性验证、销售订单发放、挑库发放、处理物料搬运单、获取交货号以及发运确认等关键步骤,确保订单的顺利执行和关闭。

1. 对销售订单的有效性验证
    1)检查销售订单的行是否被完全传回客户化表
    2)验证销售订单的关键字段
    3)检查子库存是否启用了货位控制,如果启用了货位控制,没有生成货位,则调用API生成货位
    4)调用API检查子库存中的某一个物料的现用量和可用量
2. 销售订单发放
     调用API进行销售订单发放
     发放成功:        返回一个批号,这个批号作为挑库发放的参数
3.  销售订单挑库发放
     调用API进行挑库发放
     发放前             行状态:准备发放           下一步:挑库发放             判断依据:销售订单发放生成的批号作为挑库发放的参数
     发放成功          行状态:已发放至仓库     下一步:处理物料搬运单    判断依据:返回一个批号,这个批号作为挑库发放的参数
     发放失败          行状态:已延交              下一步:挑库发放             判断依据:未成功返回一个批号
     说明:订单发放是按照整个订单发放的。
4. 处理物料搬运单
    处理成功:         行状态:发运                 下一步:                                  判断依据:返回成功的处理状态
    处理成失败         行状态:                       下一步:处理物料搬运单             判断依据:未返回成功的处理状态
5.  得到销售订单的交货号(delivery_id)
     调用API 查看是否产生发运号
     成功:返回发运号
     失败:未返回发运号
6.  发运确认
     处理成功           订单状态为:关闭
     说明:如果发运确认已经成功,则会自动调用 连接形成停靠站 接口程序
具体实现代码
  1. 对销售订单的有效性验证
      调用API验证货位的代码:
   
 fnd_profile.put('MFG_ORGANIZATION_ID',p_organization_id);
            
     l_locator_type := get_locator_type(p_sub_inv,p_organization_id);        
     IF l_locator_type != 1  THEN
                         
       l_locator  := p_sub_inv || '.' ||
                     p_project || '.' || 
                     p_task;
             
       inv_loc_wms_pub.create_locator(x_return_status            => l_status,
                                      x_msg_count                => l_msg_count,
                                      x_msg_data                 => l_msg_data,
                                      x_inventory_location_id    => l_locator_id,
                                      x_locator_exists           => l_locator_exists,
                                      p_organization_id          => p_organization_id,
                                      p_organization_code        => p_organization_code,
                                      p_concatenated_segments    => l_locator,
                                      p_description              => NULL,
                                      p_inventory_location_type  => l_locator_type,
                                      p_picking_order            => NULL,
                                      p_location_maximum_units   => NULL,
                                      p_subinventory_code        => p_sub_inv,
                                      p_location_weight_uom_code => NULL,
                                      p_max_weight               => NULL,
                                      p_volume_uom_code          => NULL,
                                      p_max_cubic_area           => NULL,
                                      p_x_coordinate             => NULL,
                                      p_y_coordinate             => NULL,
                                      p_z_coordinate             => NULL,
                                      p_physical_location_id     => NULL,
                                      p_pick_uom_code            => NULL,
                                      p_dimension_uom_code       => NULL,
                                      p_length                   => NULL,
                                      p_width                    => NULL,
                                      p_height                   => NULL,
                                      p_status_id                => 1,
                                      p_dropping_order           => NULL);
       IF l_locator_id IS NULL THEN
         o_err_code := g_error;
         o_err_msg  := '创建(获取)货位弹性域发生错误';
 
<think>好的,我现在需要解决用户提出的EBS销售订单发放失败,状态显示为已延交的问题。首先,我得理解用户的问题场景。用户在使用EBS系统处理销售订单时,在发放阶段遇到了失败,导致订单状态变为已延交。需要找出可能的原因并提供解决方案。 首先,我应该回顾系统级指令中的引用内容,特别是引用[1]、[2]、[3]提到的相关步骤和API调用。根据引用[1],销售订单的有效性验证是关键步骤,包括检查子存的货位控制、物料可用量等。如果这些验证未通过,可能导致后续发放失败。 用户提到状态是已延交,根据引用[1]中的说明,发放失败后,状态会变为已延交,下一步仍需发放。这可能意味着在调用API进发放时,某些条件未满足,导致处理中断。 接下来,我需要考虑可能的失败原因。根据引用[2]中的代码示例,发放可能失败的原因包括物料搬运单处理问题、存不足、货位配置错误等。例如,如果子存启用了货位控制但未生成货位,或者可用量不足,都会导致API调用失败。 解决方案的第一步应该是检查有效性验证的步骤。用户需要确认销售订单是否完全传回客户化表,关键字段是否正确,子存是否启用了货位控制,是否生成了正确的货位。如果货位未生成,需要调用API生成,如引用[1]提到的。 其次,检查物料可用量。如果物料在子存中的现用量不足以满足订单需求,发放会失败。此时需要调整存或修改订单数量。 然后,查看错误日志和发运例外报表。引用[2]中提到,如果发放出现警告或部分完成,需要检查相关报表以获取具体错误信息。例如,并发模式下可能存在的锁冲突,或者物料搬运单未能正确处理。 另外,引用[3]提到提货区(pick_from_subinventory)的配置可能影响发放。需要确认提货子存是否正确配置,是否与订单要求的子存一致。 如果问题仍然存在,可能需要手动处理或重新运发放。引用[2]中的代码示例显示,当联机发放失败时,建议在并发模式下运,这可能更稳定或提供更详细的错误信息。 最后,系统配置和补丁也是需要考虑的因素。某些情况下,系统参数设置不正确或缺少必要的补丁会导致API为异常,需要与系统管理员确认。 总结步骤,应该包括验证订单有效性、检查存和货位、查看错误日志、调整并发处理、确认子存配置,以及系统检查。用户需要按照这些步骤逐一排查,找到具体原因后采取相应措施。</think>### EBS销售订单发放失败(状态已延交)的解决方案 #### 一、核心问题定位 发放失败导致状态为“已延交”,通常与以下环节相关: 1. **存可用性不足**:子存中物料现用量无法满足订单需求[^1] 2. **货位控制异常**:启用了货位控制但未生成有效货位[^1] 3. **物料搬运单处理失败**:API调用后未成功返回处理批号[^2] 4. **并发冲突**:在线发放模式与后台进程产生资源竞争[^2] #### 二、分步解决方案 **第一步:验证存可用性** 1. 检查子存物料可用量: ```sql SELECT SUBINVENTORY_CODE, INVENTORY_ITEM_ID, ON_HAND_QUANTITY, RESERVABLE_QUANTITY FROM MTL_ONHAND_QUANTITIES WHERE ORGANIZATION_ID = [目标存组织ID] ``` 2. 若可用量不足: - 调整存分配策略 - 执存补充操作 - 修改订单需求数量 **第二步:货位控制验证** 1. 检查子存货位配置: ```sql SELECT SECONDARY_INVENTORY, LOCATOR_CONTROL FROM MTL_SECONDARY_INVENTORIES WHERE ORGANIZATION_ID = [组织ID] ``` 2. 若未生成货位: - 调用`INV_LOCATOR_PUB.CREATE_DEFAULT_LOCATORS`生成默认货位[^1] - 验证货位与物料的关联性: ```sql SELECT LOCATOR_ID, INVENTORY_ITEM_ID FROM MTL_ITEM_LOCATIONS WHERE ORGANIZATION_ID = [组织ID] ``` **第三步:API调用排查** 1. 检查发放API返回参数: ```csharp wsh_pick_list.online_release( p_batch_id => l_batch_id, p_pick_result => l_pick_result, p_pick_phase => l_pick_phase ); ``` - 若`l_pick_result='F'`表示完全失败 - 若`l_pick_result='W'`表示部分成功[^2] 2. 失败处理策略: ```flow st=>start: API调用失败 cond1=>condition: l_pick_phase='MOVE_ORDER_LINES'? op1=>operation: 部分完成需手动处理物料搬运单 op2=>operation: 改用并发模式重新发放 e=>end: 更新状态 st->cond1 cond1(yes)->op1->e cond1(no)->op2->e ``` **第四步:并发模式处理** 1. 通过标准功能提交请求: ``` 路径:订单管理 > 订单发放 > 发放销售订单 ``` 2. 设置关键参数: - 选择`处理方式=并发` - 指定`发放批次ID`[^3] 3. 监控请求日志: ```sql SELECT REQUEST_ID, PHASE_CODE, STATUS_CODE FROM FND_CONCURRENT_REQUESTS WHERE REQUEST_DATE > SYSDATE-1 ``` #### 三、高级调试方法 1. **启用诊断日志**: ```sql EXEC FND_GLOBAL.APPS_INITIALIZE([用户ID],[责任ID],[应用ID]); EXEC MO_GLOBAL.SET_POLICY_CONTEXT('S',[组织ID]); ``` 2. **捕获详细错误堆栈**: ```csharp BEGIN wsh_pick_list.online_release(...); EXCEPTION WHEN OTHERS THEN l_err_msg := SQLERRM; fnd_file.put_line(fnd_file.log, DBMS_UTILITY.FORMAT_ERROR_STACK); END; ``` #### 四、预防性措施 1. 建立预检查脚本: ```sql -- 货位可用性检查 SELECT COUNT(*) FROM MTL_ITEM_LOCATIONS WHERE INVENTORY_LOCATION_ID IN ( SELECT PICK_FROM_LOCATOR_ID FROM WSH_DELIVERY_DETAILS WHERE DELIVERY_DETAIL_ID = [目标ID] ) ``` 2. 配置自动重试机制: ```csharp FOR i IN 1..3 LOOP BEGIN wsh_pick_list.online_release(...); EXIT WHEN l_pick_result = 'S'; EXCEPTION WHEN OTHERS THEN DBMS_LOCK.SLEEP(60); -- 等待资源释放 END; END LOOP; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值