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 := '创建(获取)货位弹性域发生错误';
ELSE
o_locator_id := l_locator_id;
END IF;

调用API验证库存现用量和可用量的代码:

inv_quantity_tree_pub.query_quantities(p_api_version_number  => 1.0,
x_return_status => l_return_status,
x_msg_count => l_msg_count,
x_msg_data => l_msg_data,
p_organization_id => l_organization_id,
p_inventory_item_id => rec_data.item_id,--item id
p_tree_mode => 2,
p_is_revision_control => FALSE,
p_is_lot_control => l_lot_control_flag,
p_lot_expiration_date => rec_data.transaction_date,
p_is_serial_control => FALSE,
p_grade_code => NULL, -- INVCONV NOT NEEDED NOW
p_revision => NULL,
p_lot_number => NULL,
p_subinventory_code => rec_data.pick_from_subinventory,
p_locator_id => l_locator_id,
x_qoh => l_qoh,
x_rqoh => l_rqoh,
x_qr => l_qr,
x_qs => l_qs,
x_att => l_att,
x_atr => l_atr,
x_sqoh => l_sqoh, -- INVCONV
x_srqoh => l_srqoh, -- INVCONV
x_sqr => l_sqr, -- INVCONV
x_sqs => l_sqs, -- INVCONV
x_satt => l_satt, -- INVCONV
x_satr => l_satr); -- INVCONV
IF nvl(l_atr,0) = 0 THEN
GOTO end_loop;
END IF;

2. 销售订单发放

     调用API进行销售订单发放的代码:

fnd_profile.PUT('MFG_ORGANIZATION_ID',l_organization_id);

           wsh_picking_batches_pkg.insert_row(x_rowid                       => l_row_id,
x_batch_id => l_batch_id,
p_creation_date => g_sysdate,
p_created_by => g_user_id,
p_last_update_date => g_sysdate,
p_last_updated_by => g_user_id,
p_last_update_login => g_login_id,
p_batch_name_prefix => NULL,
x_name => l_name,
p_backorders_only_flag => l_rule_rec.backorders_only_flag,
p_document_set_id => l_rule_rec.document_set_id,
p_existing_rsvs_only_flag => l_rule_rec.existing_rsvs_only_flag,
p_shipment_priority_code => l_rule_rec.shipment_priority_code,
p_ship_method_code => l_rule_rec.ship_method_code,
p_customer_id => l_customer_id,
p_order_header_id => rec_data.order_header_id,
p_ship_set_number => l_rule_rec.ship_set_number,
p_inventory_item_id => NULL,
p_order_type_id => l_order_type_id,
p_from_requested_date => NULL,
p_to_requested_date => NULL,
p_from_scheduled_ship_date => NULL,
p_to_scheduled_ship_date => NULL,
p_ship_to_location_id => l_rule_rec.ship_to_location_id,
p_ship_from_location_id => l_rule_rec.ship_from_location_id/*l_stage_locator_id*/,
p_trip_id => NULL,
p_delivery_id => NULL,
p_include_planned_lines => l_rule_rec.include_planned_lines,
p_pick_grouping_rule_id => l_rule_rec.pick_grouping_rule_id,
p_pick_sequence_rule_id => l_rule_rec.pick_sequence_rule_id,
p_autocreate_delivery_flag => 'Y', --l_rule_rec.autocreate_delivery_flag;
--无论规则是否自动创建交货号,都让系统自动创建(用shipment_number做交货号)
p_attribute_category => NULL,
p_attribute1 => NULL,
p_attribute2 => NULL,
p_attribute3 => NULL,
p_attribute4 => NULL,
p_attribute5 => NULL,
p_attribute6 => NULL,
p_attribute7 => NULL,
p_attribute8 => NULL,
p_attribute9 => NULL,
p_attribute10 => NULL,
p_attribute11 => NULL,
p_attribute12 => NULL,
p_attribute13 => NULL,
p_attribute14 => NULL,
p_attribute15 => NULL,
p_autodetail_pr_flag => l_rule_rec.autodetail_pr_flag,
p_carrier_id => l_rule_rec.carrier_id,
p_trip_stop_id => NULL,
p_default_stage_subinventory => l_rule_rec.default_stage_subinventory,--ERP临时发货区
p_default_stage_locator_id => l_stage_locator_id,
p_pick_from_subinventory => rec_data.pick_from_subinventory,/*l_rule_rec.pick_from_subinventory,* /--ERP提货区
p_pick_from_locator_id => l_locator_id,--l_rule_rec.pick_from_locator_id,
p_auto_pick_confirm_flag => 'N'/*l_rule_rec.auto_pick_confirm_flag*/,
--无论规则是否自动确认挑库,都不让系统自动挑库(可能会修改分配数)
p_delivery_detail_id => NULL,
p_project_id => rec_data.project_id,
p_task_id => rec_data.task_id,
p_organization_id => l_organization_id,
p_ship_confirm_rule_id => l_rule_rec.ship_confirm_rule_id,
p_autopack_flag => l_rule_rec.autopack_flag,
p_autopack_level => l_rule_rec.autopack_level,
p_task_planning_flag => l_rule_rec.task_planning_flag,
p_non_picking_flag => NULL,
p_regionid => l_rule_rec.region_id,
p_zoneid => l_rule_rec.zone_id,
p_categoryid => l_rule_rec.category_id,
p_categorysetid => l_rule_rec.category_set_id,
p_acdelivcriteria => l_rule_rec.ac_delivery_criteria,
p_relsubinventory => l_rule_rec.rel_subinventory,
--如果规则不做限制则可以任意子库中挑库
--nvl(p_subinventory_from,l_rule_rec.rel_subinventory),
--如果在此处修改来源子库会导致发放不成功 不能创建物料搬运单
p_append_flag => l_rule_rec.append_flag,
p_task_priority => l_rule_rec.task_priority,
p_ship_set_smc_flag => NULL,
p_actual_departure_date => NULL,
p_allocation_method => l_rule_rec.allocation_method,
p_crossdock_criteria_id => l_rule_rec.crossdock_criteria_id,
p_delivery_name_lo => NULL,
p_delivery_name_hi => NULL,
p_bol_number_lo => NULL,
p_bol_number_hi => NULL,
p_intmed_ship_to_loc_id => NULL,
p_pooled_ship_to_loc_id => NULL,
p_fob_code => NULL,
p_freight_terms_code => NULL,
p_pickup_date_lo => NULL,
p_pickup_date_hi => NULL,
p_dropoff_date_lo => NULL,
p_dropoff_date_hi => NULL,
p_planned_flag => NULL,
p_selected_batch_id => NULL);
IF l_batch_id IS NULL THEN
l_err_code := g_warning;
l_err_msg := '销售订单发放没有产生批号';
GOTO next_line;
END IF;

销售订单发放生成的批号作为步骤3的参数

3. 销售订单挑库发放

    调用API进行挑库发放的代码:

wsh_pick_list.online_release(p_batch_id    => l_batch_id,
p_pick_result => l_pick_result,
p_pick_phase => l_pick_phase,
p_pick_skip => l_pick_skip);
--F:Failure
IF nvl(l_pick_result,'F') = 'F' THEN
IF (nvl(l_pick_phase,'START') = 'MOVE_ORDER_LINES') THEN
l_err_code := g_warning;
l_err_msg := '联机挑库发放已部分完成。未完全处理物料搬运单:' || l_batch_id;
ELSE
l_err_code := g_warning;
l_err_msg := '联机挑库发放失败。请在并发模式下发放订单:' || l_batch_id;
END IF;
ELSIF nvl(l_pick_skip,'Y') = 'Y' THEN
l_err_code := g_warning;
l_err_msg := '联机挑库发放已结束但出现警告。请检查“发运例外报表”';
--即使部分挑库成功也不继续处理
ELSIF nvl(l_pick_result,'F') = 'W' THEN
IF nvl(l_pick_phase,'START') = 'MOVE_ORDER_LINES' THEN
l_err_code := g_warning;
l_err_msg := '联机挑库发放已部分完成,但出现警告。';
ELSE
l_err_code := g_warning;
l_err_msg := '联机挑库发放已结束但出现警告。请检查“发运例外报表”';
END IF;
ELSIF nvl(l_pick_result,'F') = 'S' THEN
NULL;
END IF;

4.  处理物料搬运单

     调用API处理物料搬运单的代码:

get_move_order_line_id(p_order_line_id      => rec_data.line_id,
o_move_order_line_id => l_mv_line_id,
o_mv_status => l_mv_status,
o_err_code => l_err_code,
o_err_msg => l_err_msg);
IF l_err_code IS NOT NULL THEN
GOTO next_line;
END IF; <<move_order>> l_trolin_tbl := inv_trolin_util.query_rows(p_line_id => l_mv_line_id);
l_mold_tbl := inv_mo_line_detail_util.query_rows(p_line_id => l_mv_line_id); inv_pick_wave_pick_confirm_pub.pick_confirm(p_api_version_number => 1.0,
p_init_msg_list => fnd_api.g_false,
p_commit => fnd_api.g_false,
x_return_status => l_return_status,
x_msg_count => l_msg_count,
x_msg_data => l_msg_data,
p_move_order_type => 3,
p_transaction_mode => 1,
p_trolin_tbl => l_trolin_tbl,
p_mold_tbl => l_mold_tbl,
x_mmtt_tbl => l_mold_tbl,
x_trolin_tbl => l_trolin_tbl);
IF l_return_status != fnd_api.g_ret_sts_success THEN
l_err_code := g_warning;
l_err_msg := '处理物料搬运单失败';
GOTO next_line;
END IF;

5. 得到销售订单的交货号(delivery_id)

    得到交货号的代码:

PROCEDURE get_delivery_line_id(p_order_line_id IN NUMBER,
o_delivery_id OUT NUMBER,
o_err_code OUT number,
o_err_msg OUT VARCHAR2) IS
BEGIN
SELECT wda.delivery_id
INTO o_delivery_id
FROM wsh_delivery_details wdd, wsh_delivery_assignments wda
WHERE wdd.source_line_id = p_order_line_id
AND wdd.delivery_detail_id = wda.delivery_detail_id
AND rownum = 1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
o_err_code := g_warning;
o_err_msg := '无法获取订单行发运号';
WHEN OTHERS THEN
o_err_code := g_error;
o_err_msg := '获取发运行ID时发生意外错误:' || SQLERRM;
END;

--调用过程得到交货号

get_delivery_line_id(p_order_line_id => rec_data.line_id,
o_delivery_id => l_delivery_id,
o_err_code => l_err_code,
o_err_msg => l_err_msg);
IF l_delivery_id IS NULL THEN
l_err_code := g_warning;
l_err_msg := '没有为该订单成功创建发运号';
GOTO next_line;
END IF;

6.  发运确认   

     根据步骤5中返回的delivery_id确认是否进行发运确认,

     如果delivery_id不为空,并且没有返回错误信息。

     调用API进行发运确认的代码:

WSH_NEW_DELIVERY_ACTIONS.Confirm_Delivery(p_del_rows              => l_delivery_id_tab,
p_action_flag => l_action_flag,
p_intransit_flag => l_intransit_flag,
p_close_flag => l_close_trip_flag,
p_stage_del_flag => l_stage_del_flag,
p_report_set_id => l_report_set_id,
p_ship_method => l_trip_ship_method,
p_actual_dep_date => l_actual_dep_date,
p_bol_flag => l_create_bol_flag,
p_mc_bol_flag => l_mc_bill_of_lading_flag,
p_defer_interface_flag => l_defer_interface_flag,
p_send_945_flag => l_send_945_flag,
x_return_status => l_return_status);
IF l_return_status NOT IN (fnd_api.g_ret_sts_success,'') THEN
l_err_code := g_warning;
l_err_msg := '销售订单发放确认失败';
GOTO next_head;
END IF;

结果:通过以上步骤,可以成功的将一个外围系统导入的销售订单进行挑库发放,成功处理此销售订单,并将销售订单行的状态变成“关闭”

详解EBS接口开发之销售订单挑库发放的更多相关文章

  1. 详解EBS接口开发之销售订单导入

     步骤 1. 创建一个订单导入来源.       - 导航到 OM -> 设置 -> 订单 -> 导入来源       - 输入一个新的订单导入来源名称和描述 - 选择启用来激活 ...

  2. 详解EBS接口开发之库存事务处理采购接收--补充

    除了可以用  详解EBS接口开发之库存事务处理采购接收的方法还可以用一下方法,不同之处在于带有批次和序列控制的时候实现方式不同 The script will load records into ...

  3. 详解EBS接口开发之采购申请导入

    更多内容可以参考我的博客  详解EBS接口开发之采购订单导入 http://blog.csdn.net/cai_xingyun/article/details/17114697 /*+++++++ ...

  4. 详解EBS接口开发之库存事务处理批次更新

    库存事务处理批次有时候出现导入错误需要更新可使用次程序更新,批次导入可参考博客 详解EBS接口开发之库存事务处理-物料批次导入 http://blog.csdn.net/cai_xingyun/art ...

  5. 供应商API补充(详解EBS接口开发之供应商导入)(转)

    原文地址  供应商导入的API补充(详解EBS接口开发之供应商导入) --供应商 --创建 AP_VENDOR_PUB_PKG.Create_Vendor ( p_api_version IN NUM ...

  6. EBS销售订单挑库发放处理程序

    来自:http://blog.csdn.net/cunxiyuan108/article/details/6014769 在EBS实施中,经常遇到从外部传进来一个被登记的销售订单,需要通过程序进行销售 ...

  7. 详解EBS接口开发之应收款处理

    参考实例参考:杜春阳 R12应收模块收款API研究 (一)应收款常用标准表简介 1.1   常用标准表 如下表中列出了与应收款处理相关的表和说明: 表名 说明 其他信息 AR_BATCHES_ALL ...

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

    (一)接收&退货常用标准表简介 1.1   常用标准表 如下表中列出了与采购接收&退货导入相关的表和说明: 表名 说明 其他信息 RCV_TRANSACTIONS 采购接收事务表 事务 ...

  9. 详解EBS接口开发之应收INVOICE导入

    (一)应收INVOICE常用标准表简介 1.1   常用标准表 如下表中列出了与应收INVOICE导入相关的表和说明: 表名 说明 其他信息 RA_BATCH_SOURCES_ALL AR事务处理来源 ...

随机推荐

  1. hdu 4568 Hunter 最短路+dp

    Hunter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  2. 【tyvj】刷题记录(1001~1099)(64/99)

    1001:排序完按照题意做即可. #include<cstdio> #include<iostream> #include<cmath> #include<a ...

  3. 【USACO】电子游戏 有条件的背包

    题目描述 翰的奶牛玩游戏成瘾!本来约翰是想把她们拖去电击治疗的,但是他发现奶牛们在玩游戏后生产 了更多的牛奶,也就支持它们了. 但是,奶牛在选择游戏平台上的分歧很大:有些奶牛想买 Xbox 360 来 ...

  4. java9学习之模块化

    截止到目前JDK的版本已经更新到10了,虽然java9的生命周期才半年,但是我认为这个版本带来的变革是不可磨灭的,它是第一次深层次的针对架构以及依赖上的革新.下面我们就来学习一下. 一.模块化项目构建 ...

  5. python flask 基础入门

    1. Flask 中的Hello World! 在使用pycharm创建一个Flask项目后,将会默认创建一个flask的app,这里来讲下每行代码表示的意义,代码入下 from flask impo ...

  6. salt基本使用之二(2)

    1.Event和Reactor Event是saltstack里面的对每个事件的一个记录,相比job更加底层. 一,查看Event事件 可以在master下再开一个终端执行以下命令可以查看Event事 ...

  7. PySC2是DeepMind的“星际争霸II学习环境”(SC2LE)的Python组件

    PySC2是DeepMind的"星际争霸II学习环境"(SC2LE)的Python组件. 它暴露了暴雪娱乐公司的星际争霸II机器学习API作为Python RL环境. 这是Deep ...

  8. Windows下设置 ssh key,配置GitHub ssh key

    1.新建一个目录,利用git工具打开 Git Bash Here 2.执行如下命令 ssh-keygen -t rsa -C "email@email.com" 其中邮箱为GitH ...

  9. easing--缓动函数--贝塞尔函数--圆盘转动抽奖应用

    http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.1.3.js http://www.robertpenner.com/easing/penn ...

  10. Python小代码_2_格式化输出

    Python小代码_2_格式化输出 name = input("name:") age = input("age:") job = input("jo ...