ABAP 生产订单(工单) 创建 、状态变更、 VIN绑定 、 组件增删改

该文章已生成可运行项目,

生产订单创建

不需要提交,bapi执行结束默认提交

"这是根据销售订单创建
ls_orderdata-plant = <fs_alv>-werks."生产工厂
ls_orderdata-order_type = 'ZP01'."订单类型
ls_orderdata-basic_start_date = lv_bdat."开始日期
ls_orderdata-basic_end_date = lv_edat."结束日期
ls_orderdata-quantity = 1."数量

ls_orderdata-sales_order = <fs_alv>-vbeln."订单
ls_orderdata-sales_order_item = '000010'."行项目

CALL FUNCTION 'BAPI_PRODORD_CREATE'
  EXPORTING
    orderdata    = ls_orderdata
  IMPORTING
    return       = ls_return
    order_number = <fs_alv>-aufnr.

"CO01创建物料对应的工单
  ls_orderdata-plant = <fs_itab>-werks."生产工厂
  ls_orderdata-order_type = <fs_itab>-auart."订单类型
  ls_orderdata-basic_start_date = <fs_itab>-gstrp."开始日期
  ls_orderdata-basic_end_date = <fs_itab>-gltrp."结束日期
  ls_orderdata-quantity = <fs_itab>-qty."数量
  <fs_itab>-matnr = |{ <fs_itab>-matnr ALPHA = IN }|.
  ls_orderdata-material_long = <fs_itab>-matnr."
  "select single meins into ls_orderdata-quantity_uom from mara where matnr = <fs_itab>-matnr.

  CALL FUNCTION 'BAPI_PRODORD_CREATE'
    EXPORTING
      orderdata    = ls_orderdata
    IMPORTING
      return       = ls_return
      order_number = <fs_itab>-aufnr.

  IF <fs_itab>-aufnr IS INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ELSE.
    "检查订单是否提交
    DO.
      SELECT SINGLE * INTO @DATA(ls_aufk) FROM aufk WHERE aufnr = @<fs_itab>-aufnr.
      IF sy-subrc = 0.
        EXIT.
      ENDIF.
    ENDDO.
  ENDIF.

订单状态–下达

 "检查订单是否提交
  DO.
    SELECT SINGLE aufnr INTO @DATA(lv_aufnr) FROM aufk WHERE aufnr = @<fs_alv>-aufnr.
    IF sy-subrc = 0.
      EXIT.
    ENDIF.
  ENDDO.
  DATA:gt_bapi_order_key TYPE TABLE OF bapi_order_key,
       gs_bapi_order_key TYPE          bapi_order_key,
       gt_order_return   TYPE TABLE OF bapi_order_return WITH HEADER LINE.

  CLEAR: gs_bapi_order_key, gt_bapi_order_key[], gt_order_return, gt_order_return[].

  gs_bapi_order_key-order_number = <fs_alv>-aufnr.
  APPEND gs_bapi_order_key TO gt_bapi_order_key.

  CALL FUNCTION 'BAPI_PRODORD_RELEASE'
    TABLES
      orders        = gt_bapi_order_key
      detail_return = gt_order_return.
  READ TABLE gt_order_return WITH KEY type = 'E'.
  IF sy-subrc <> 0.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ENDIF.

生产订单添加 / 删除 VIN

通过BAPI创建的时候,vin会因为一些原因导致不能带入到生产订单里;
所以在创建之后,通过ser05 和 objk两个表关联 检查下 vin是否存在;

不存在则需要通过以下代码增加:
主要函数:
SERNR_ADD_TO_PP
SERNR_DEL_FROM_PP

以及
SERIAL_LISTE_POST_PP

生产订单号 记得 补零(问题检查了好久!!)

DATA: lt_sernos TYPE TABLE OF e1rmsno WITH HEADER LINE.

START-OF-SELECTION.

  CLEAR: lt_sernos[], lt_sernos.
  lt_sernos-sernr = 'DEEPWAY0000000006'.
  APPEND lt_sernos.

  CALL FUNCTION 'SERNR_ADD_TO_PP'
    EXPORTING
      material              = 'E2501-002' "物料号
      profile               = 'Z001' "序列号参数文件
      j_vorgang             = 'PMP1'
      ppaufnr               = '001000000197' "生产订单号
      ppposnr               = 1 "行项目 afpo
      ppwerk                = '2001' "工厂
      ppaufart              = 'ZP01' "生产订单类型
      ppautyp               = '10' "生产订单类别
      quantity              = 1 "数量  afpo
      pmrsord               = ''
    TABLES
      sernos                = lt_sernos
    EXCEPTIONS
      serialnumber_errors   = 1
      serialnumber_warnings = 2
      OTHERS                = 3.

  IF sy-subrc =  0.
    CALL FUNCTION 'SERIAL_LISTE_POST_PP'
      EXPORTING
        memory_id_status = 'SN_STATS'.
    IF sy-subrc =  0.
      COMMIT  WORK  AND  WAIT.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ENDIF.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ENDIF .

组件增删改

修改

注意反冲标识和散装物料标识:只能存在一个;
在这里插入图片描述

  DATA:lv_number  TYPE bapi_network_list-network,
       lt_detail  TYPE TABLE OF bapi_network_comp_detail,
       lt_remove  TYPE TABLE OF bapi_network_comp_id,
       ls_remove  TYPE bapi_network_comp_id,
       lt_message TYPE TABLE OF bapi_meth_message,
       ls_message TYPE bapi_meth_message.

  DATA:lv_check   TYPE char1,
       lv_message TYPE char255.

  lv_number = '001000000311'."工单号

*--------------获取工单组件明细-------------------------------*
  CALL FUNCTION 'BAPI_NETWORK_COMP_GETDETAIL'
    EXPORTING
      number              = lv_number
    TABLES
      e_components_detail = lt_detail.
*--------------获取工单组件明细-------------------------------*


*--------------工单组件删除-------------------------------*
  "此处使用查询BAPI得到的组件列表,赋值给移除内表
  DATA: lt_components_change        TYPE TABLE OF bapi_network_comp_change,
        ls_components_change        TYPE bapi_network_comp_change,
        lt_components_change_update TYPE TABLE OF bapi_network_comp_cng_upd,
        ls_components_change_update TYPE bapi_network_comp_cng_upd,
        ls_return                   TYPE bapiret2.
  LOOP AT lt_detail INTO DATA(ls_detail).
    CLEAR ls_components_change.
    ls_components_change-component = ls_detail-component."BAPI获取到的组件唯一标识
    ls_components_change-stge_loc = 'A001'."库存地点
    APPEND ls_components_change TO lt_components_change.

    CLEAR:ls_components_change_update.
    ls_components_change_update-component = ls_detail-component.
    ls_components_change_update-stge_loc = 'X'."库存地点
    APPEND ls_components_change_update TO lt_components_change_update.
  ENDLOOP.

  CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
  CALL FUNCTION 'BAPI_NETWORK_COMP_CHANGE'
    EXPORTING
      number                     = lv_number
    IMPORTING
      return                     = ls_return
    TABLES
      i_components_change        = lt_components_change
      i_components_change_update = lt_components_change_update
      e_message_table            = lt_message.

  LOOP AT lt_message INTO ls_message WHERE message_type CA 'AEX'.
    lv_check = 'E'.
    lv_message = lv_message && ls_message-message_text.
  ENDLOOP.

  IF lv_check = 'E'.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = abap_true.
  ENDIF.

组件删除新增

tips: 删除组件的时候,在工单创建状态删除,可以删除掉组件,
如果是下达状态,则会保留这些组件,且不一定会有删除标记(虽然是删除状态)

  DATA:lv_number  TYPE bapi_network_list-network,
       lt_detail  TYPE TABLE OF bapi_network_comp_detail,
       lt_remove  TYPE TABLE OF bapi_network_comp_id,
       ls_remove  TYPE bapi_network_comp_id,
       lt_message TYPE TABLE OF bapi_meth_message,
       ls_message TYPE bapi_meth_message.

  DATA:lv_check   TYPE char1,
       lv_message TYPE char255.

  lv_number = '001000000311'."工单号

*--------------获取工单组件明细-------------------------------*
  CALL FUNCTION 'BAPI_NETWORK_COMP_GETDETAIL'
    EXPORTING
      number              = lv_number
    TABLES
      e_components_detail = lt_detail.
*--------------获取工单组件明细-------------------------------*


*--------------工单组件删除-------------------------------*
  "此处使用查询BAPI得到的组件列表,赋值给移除内表
  LOOP AT lt_detail INTO DATA(ls_detail).
    CLEAR ls_remove.
    ls_remove-component = ls_detail-component.
    APPEND ls_remove TO lt_remove.
  ENDLOOP.

  CALL FUNCTION 'BAPI_NETWORK_COMP_REMOVE'
    EXPORTING
      number              = lv_number
    TABLES
      i_components_remove = lt_remove
      e_message_table     = lt_message.

  LOOP AT lt_message INTO ls_message WHERE message_type CA 'AEX'.
    lv_check = 'E'.
    lv_message = lv_message && ls_message-message_text.
  ENDLOOP.

  IF lv_check = 'E'.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = abap_true.
  ENDIF.
*--------------工单组件删除-------------------------------*

*--------------工单组件新增-------------------------------*
  DATA:lt_components TYPE TABLE OF bapi_network_comp_add,
       ls_components TYPE bapi_network_comp_add.

  CLEAR: lv_check, lt_message.
  ls_components-item_number = '0010'."项目编号
  ls_components-activity = '0010'."必输 作业
  ls_components-material = 'X121050000059'."物料
  ls_components-plant = '1006'."工厂

  SELECT SINGLE meins INTO ls_components-base_uom FROM mara WHERE matnr = ls_components-material.
  SELECT SINGLE beskz INTO ls_components-type_of_pur_resv FROM marc WHERE matnr = ls_components-material AND werks = '1006'.
*  ls_components-type_of_pur_resv = 'F'."beskz."必输 采购类型
  ls_components-entry_quantity = 1."数量
*  ls_components-base_uom = 'EA'."单位
*ls_components-batch = ''."批次
  ls_components-item_cat = 'L'."项目类别

  ls_components-backflush = 'X'."反冲
  APPEND ls_components TO lt_components.

  CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
  CALL FUNCTION 'BAPI_NETWORK_COMP_ADD'
    EXPORTING
      number           = lv_number
    TABLES
      i_components_add = lt_components
      e_message_table  = lt_message.

  LOOP AT lt_message INTO ls_message WHERE message_type CA 'AEX'.
    lv_check = 'E'.
    lv_message = lv_message && ls_message-message_text.
  ENDLOOP.

  IF lv_check = 'E'.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = abap_true.
  ENDIF.

*--------------工单组件新增-------------------------------*

注意点:新增组件—移动类型281的问题

通过BAPI: BAPI_NETWORK_COMP_ADD
新增的组件,在预留表RESB中移动类型为281, 但实际上应该是261
在这里插入图片描述

原因:
通过断点调试发现,该BAPI会调用下面的函数,获取移动类型
函数:CO_TA_TCOKO_READ

这里给的默认值为CN

解决:
通过隐式增强,替换CN 为 CO ( 通过前台断点发现给的就是CO)

在这里插入图片描述

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值