添加 & 刪除生產工單組件


我們都非常熟悉生產訂單的創建以及對現有操作和組件的修改。 但是,如果我們需要刪除現有組件並將組件添加到給定的production order中,該怎麼辦?

一般我們通過CO02事務,然後到組件概覽並進行操作來進行組件的添加或刪除。 但是如果我們需要從程序級別來做呢?

以下代碼片段可用於創建生產訂單、刪除現有組件和添加新組件,然後發佈生產訂單。

創建生產訂單:

可以使用 BAPI_PRODORD_CREATE 創建生產訂單。 它可以如下面的代碼片段所示使用。

*** Production Order Creation

DATA: ls_orderdata TYPE bapi_pp_order_create,

ls_return TYPE bapiret2,

lv_order_number TYPE bapi_order_key-order_number,

lv_order_type TYPE bapi_order_copy-order_type.

* Assign data to BAPI Header to create Production order

ls_orderdata-material = '000000000000000001'.

ls_orderdata-plant = '0001'.

ls_orderdata-order_type = 'PP01'.

ls_orderdata-basic_start_date = sy-datum.

ls_orderdata-basic_start_time = sy-uzeit.

ls_orderdata-basic_end_date = sy-datum.

ls_orderdata-basic_end_time = sy-uzeit.

ls_orderdata-quantity = 1.

CALL FUNCTION 'UNIT_OF_MEASURE_ISO_TO_SAP'

EXPORTING

iso_code = 'PCE'

IMPORTING

sap_code = ls_orderdata-quantity_uom

EXCEPTIONS

not_found = 1

OTHERS = 2.

IF sy-subrc <> 0.

* Implement suitable error handling here

ENDIF.

IF NOT ls_orderdata IS INITIAL.

* BAPI Create Production Order

CALL FUNCTION 'BAPI_PRODORD_CREATE'

EXPORTING

orderdata = ls_orderdata

IMPORTING

return = ls_return

order_number = lv_order_number

order_type = lv_order_type.

IF ( ls_return-type = 'S' OR

ls_return-type = 'I' OR

ls_return-type = 'W' ) OR

ls_return IS INITIAL.

* Commit data

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

ELSE.

* Data Rollback

CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

ENDIF.

ENDIF.

工單組件刪除:

創建生產訂單後,從訂單物料的 BOM 中獲取組件。 如果我們要刪除特定組件或所有組件,則可以使用 CO_XT_COMPONENT_DELETE 功能模塊來完成,如下面的代碼片段所示。 上述功能模塊之後是其他兩個功能模塊,用於提交更改並初始化處理過程中所需的所有其他表,它們是 CO_XT_ORDER_PREPARE_COMMIT 和 CO_XT_ORDER_INITIALIZE.

*** Deleting Components from Production Order

DATA: lt_resbkeys TYPE coxt_t_resbdel,

lt_return TYPE STANDARD TABLE OF bapiret2,

lv_error TYPE flag.

* Fetch existing components of given Production Order

SELECT rsnum, rspos INTO TABLE @DATA(lt_resb)

FROM resb

WHERE aufnr = @lv_order_number. " Previously created order

IF sy-subrc EQ 0.

lt_resbkeys = CORRESPONDING #( lt_resb ).

ENDIF.

IF NOT lt_resbkeys[] IS INITIAL.

* BAPI to delete the components of Production Order

CALL FUNCTION 'CO_XT_COMPONENTS_DELETE'

EXPORTING

it_resbkeys_to_delete = lt_resbkeys

IMPORTING

e_error_occurred = lv_error

TABLES

ct_bapireturn = lt_return

EXCEPTIONS

delete_failed = 1

OTHERS = 2.

IF lv_error = space.

CALL FUNCTION 'CO_XT_ORDER_PREPARE_COMMIT'

IMPORTING

es_bapireturn = ls_return

e_error_occurred = lv_error.

IF ( ls_return-type = 'S' OR

ls_return-type = 'W' OR

ls_return-type = 'I' ) OR

ls_return IS INITIAL.

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

CALL FUNCTION 'CO_XT_ORDER_INITIALIZE'.

ELSE.

CLEAR: lv_error,

ls_return.

CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

ENDIF.

ELSE.

CLEAR lv_error.

CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

ENDIF.

ENDIF.

向工單添加組件:

如果我們需要向生產訂單添加組件,可以使用 CO_XT_COMPONENT_ADD 功能模塊來完成。 它可以像下面的代碼片段所示那樣使用。 上述功能模塊之後是其他兩個功能模塊,用於提交更改並初始化處理期間所需的所有其他表,它們是 CO_XT_ORDER_PREPARE_COMMIT 和 CO_XT_ORDER_INITIALIZE。

但是通過使用上述功能模塊,我們有一個小問題: 添加的組件中將缺少項目編號。 這是由於 I_POSNO(功能模塊 I 中的參數)和 RESB-POSNR 的類型不兼容.

clip_image001

所以爲了解決這個問題,我們將通過在DB更新之前將其分配給內部表來修改POSNR,以更正組件中的空白項目編號.

*** Adding components to Production Order

DATA: ls_storage_location TYPE coxt_s_storage_location,

ls_storage_locationx TYPE coxt_s_storage_locationx,

ls_requ_quan TYPE coxt_s_quantity,

lv_operation TYPE co_aplzl,

lv_batch TYPE coxt_batch,

lv_batchx TYPE coxt_batchx,

lv_postp TYPE postp,

lv_sequence TYPE plnfolge,

lv_material TYPE matnr,

lv_positionno TYPE positionno,

lv_numc TYPE numc4.

TYPES: BEGIN OF ty_resb_bt.

INCLUDE TYPE resbb.

TYPES: indold TYPE syst_tabix.

TYPES: no_req_upd TYPE syst_datar.

TYPES: END OF ty_resb_bt.

TYPES tt_resb_bt TYPE TABLE OF ty_resb_bt.

FIELD-SYMBOLS: <ft_resb_bt> TYPE tt_resb_bt,

<fs_resb_bt> TYPE ty_resb_bt.

ls_storage_location-werks = '0001'.

ls_storage_locationx-werks = 'X'.

ls_storage_location-lgort = 'LGOT'.

ls_storage_locationx-lgort = 'X'.

lv_batch = '0000000001'.

lv_batchx = 'X'.

ls_requ_quan-quantity = 1.

CALL FUNCTION 'UNIT_OF_MEASURE_ISO_TO_SAP'

EXPORTING

iso_code = 'PCE'

IMPORTING

sap_code = ls_requ_quan-uom

EXCEPTIONS

not_found = 1

OTHERS = 2.

IF sy-subrc <> 0.

* Implement suitable error handling here

ENDIF.

lv_positionno = '0010'.

lv_postp = 'L'.

lv_material = '000000000000000002'.

SELECT SINGLE aufnr, aufpl INTO @DATA(ls_afko)

FROM afko

WHERE aufnr = @lv_order_number.

IF sy-subrc EQ 0.

* Fetch operation to which it has to be assigned

SELECT SINGLE aufpl, aplzl, plnfl INTO @DATA(ls_afvc)

FROM afvc

WHERE aufpl = @ls_afko-aufpl.

IF sy-subrc EQ 0.

lv_operation = ls_afvc-aplzl.

lv_sequence = ls_afvc-plnfl.

ENDIF.

ENDIF.

* BAPI to add components to Production Order

CALL FUNCTION 'CO_XT_COMPONENT_ADD'

EXPORTING

is_order_key = lv_order_number

i_material = lv_material

is_requ_quan = ls_requ_quan

i_operation = lv_operation

i_sequence = lv_sequence

is_storage_location = ls_storage_location

is_storage_locationx = ls_storage_locationx

i_batch = lv_batch

i_batchx = lv_batchx

i_postp = lv_postp

i_posno = lv_positionno

IMPORTING

es_bapireturn = ls_return

e_error_occurred = lv_error.

IF lv_error = space.

CLEAR: lv_numc,

ls_return.

* Modify POSNR via ASSIGN before DB update to correct the blank

* item number in Components due to incompatible types of I_POSNO

* (type CIF_R3RES-POSITIONNO) and RESB-POSNR

ASSIGN ('(SAPLCOBC)RESB_BT[]') TO <ft_resb_bt>.

LOOP AT <ft_resb_bt> ASSIGNING <fs_resb_bt>.

lv_numc = sy-tabix * 10.

<fs_resb_bt>-posnr = lv_numc.

CLEAR lv_numc.

ENDLOOP.

* Commit transaction

CALL FUNCTION 'CO_XT_ORDER_PREPARE_COMMIT'

IMPORTING

es_bapireturn = ls_return

e_error_occurred = lv_error.

IF ( ls_return-type = 'S' OR

ls_return-type = 'W' OR

ls_return-type = 'I' ) OR

ls_return IS INITIAL.

* Commit data

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

CALL FUNCTION 'CO_XT_ORDER_INITIALIZE'.

ELSE.

CLEAR: lv_error,

ls_return.

* Data Rollback

CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

ENDIF.

ELSE.

CLEAR: lv_error,

ls_return.

* Data Rollback

CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

ENDIF.

Release生產工單:

創建訂單後,可以通過以下代碼片段Release它。.

*** Release Created Production Order

DATA: lt_order TYPE STANDARD TABLE OF bapi_order_key,

ls_order TYPE bapi_order_key.

SELECT SINGLE a~aufnr, a~objnr, b~stat INTO @DATA(ls_aufk)

FROM aufk AS a

INNER JOIN jest AS b

ON a~objnr = b~objnr

WHERE a~aufnr = @lv_order_number

AND b~stat = 'I0002'

AND b~inact = @space.

IF sy-subrc NE 0.

ls_order-order_number = lv_order_number.

* If production order is not released then append the order to table

* LT_ORDER to release the order

APPEND ls_order TO lt_order.

CLEAR ls_order.

ENDIF.

IF NOT lt_order[] IS INITIAL.

CLEAR ls_return.

* Release Production order

CALL FUNCTION 'BAPI_PRODORD_RELEASE'

IMPORTING

return = ls_return

TABLES

orders = lt_order.

IF ( ls_return-type = 'S' OR

ls_return-type = 'W' OR

ls_return-type = 'I' ) OR

ls_return IS INITIAL.

CLEAR ls_return.

* Commit Data

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

ELSE.

* Data Rollback

CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

CLEAR ls_return.

ENDIF.

ENDIF.

對於更改現有組件,我們可以使用 CO_XT_COMPONENT_CHANGE 功能模塊和其他兩個功能模塊來提交更改並初始化處理過程中所需的所有其他表,即 CO_XT_ORDER_PREPARE_COMMIT 和 CO_XT_ORDER_INITIALIZE。

注意:CO_XT_COMPONENT_CHANGE / CO_XT_COMPONENT_ADD 這些都是 SAP 未發佈的常規功能模塊,使用時需要謹慎。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章