1)调用 CSAI_BOM_CREATE 创建BOM,这个函数可以指定alternative BOM。
2)调用CSAP_MAT_BOM_READ读取BOM信息。
3)调用CSAP_MAT_BOM_MAINTAIN更改BOM Subitem。这个函数有个问题,会清空BOM抬头(MAST表)里的Lot size From / Lot size to,需要通过下面的语句来避免该问题。
EXPORT data_reset_sign = abap_true TO MEMORY ID 'data_reset_sign'.
------------------------------------------------------------------------------------------------------------------
FORM create_bom.
DATA:
lt_messages TYPE STANDARD TABLE OF messages,
ls_ecsin TYPE csin,
ls_estkob TYPE stkob,
ls_estzub TYPE stzub,
ls_emastb TYPE mastb,
lt_stpob TYPE STANDARD TABLE OF stpob,
ls_stpob TYPE stpob,
lt_stpo_read TYPE STANDARD TABLE OF stpo_api02,
ls_stpo_read TYPE stpo_api02,
lt_stko_read TYPE STANDARD TABLE OF stko_api02,
ls_stko_read TYPE stko_api02,
lt_stpu_read TYPE STANDARD TABLE OF stpu_api01,
lt_stpo_change TYPE STANDARD TABLE OF stpo_api03,
ls_stpo_change TYPE stpo_api03,
lt_stpu_change TYPE STANDARD TABLE OF stpu_api01,
ls_stpu_change TYPE stpu_api01,
ls_stko_change TYPE stko_api01,
lv_material TYPE csap_mbom-matnr,
lv_plant TYPE csap_mbom-werks,
lv_bom_usage TYPE csap_mbom-stlan,
lv_bom_category TYPE stlty,
lv_alternative TYPE csap_mbom-stlal,
lv_valid_from TYPE csap_mbom-datuv,
lv_astlnr TYPE stzub-stlnr,
lv_warning TYPE capiflag-flwarning,
lv_commit_and_wait TYPE capiflag-comm_wait,
lv_change_no TYPE csap_mbom-aennr,
lv_ale TYPE csdata-xfeld,
lv_bom_create TYPE csdata-xfeld,
lv_new_item TYPE csdata-xfeld,
lv_complete TYPE csdata-xfeld.
LOOP AT gt_bom ASSIGNING FIELD-SYMBOL(<lfs_bom>)
WHERE stlnr IS INITIAL.
lv_material = <lfs_bom>-bicsk-matnr.
lv_plant = <lfs_bom>-bicsk-werks.
lv_bom_usage = <lfs_bom>-bicsk-stlan.
lv_bom_category = gc_stlty_material.
lv_alternative = <lfs_bom>-bicsk-stlal.
lv_valid_from = <lfs_bom>-bicsk-datuv.
lv_change_no = <lfs_bom>-bicsk-aennr.
CLEAR ls_ecsin.
ls_ecsin-datuv = p_datuv.
ls_ecsin-matnr = lv_material.
ls_ecsin-stlal = lv_alternative.
ls_ecsin-stlan = lv_bom_usage.
ls_ecsin-werks = lv_plant.
ls_ecsin-stlty = lv_bom_category.
ls_ecsin-aennr = lv_change_no.
CLEAR ls_estkob.
ls_estkob-stlty = lv_bom_category.
ls_estkob-stlal = lv_alternative.
ls_estkob-datuv = p_datuv.
ls_estkob-stktx = <lfs_bom>-bicsk-stktx.
ls_estkob-bmein = <lfs_bom>-bicsk-bmein.
ls_estkob-bmeng = <lfs_bom>-bicsk-bmeng.
CLEAR ls_estzub.
ls_estzub-stlty = lv_bom_category.
ls_estzub-stlan = lv_bom_usage.
ls_estzub-ztext = <lfs_bom>-bicsk-ztext.
ls_estzub-altst = abap_true.
CLEAR ls_emastb.
ls_emastb-matnr = lv_material.
ls_emastb-werks = lv_plant.
ls_emastb-stlan = lv_bom_usage.
ls_emastb-stlal = lv_alternative.
ls_emastb-losvn = 1.
ls_emastb-losbs = 99999999.
CLEAR lt_stpob.
LOOP AT <lfs_bom>-bicsp INTO DATA(ls_bicsp).
CLEAR ls_stpob.
MOVE-CORRESPONDING ls_bicsp TO ls_stpob.
* IF <lfs_output>-ausch <> 0.
* ls_stpo-comp_scrap = <lfs_output>-ausch.
* ENDIF.
*
* IF <lfs_output>-sanka <> 'P'.
* ls_stpo-rel_cost = <lfs_output>-sanka.
* ELSE.
* CLEAR:ls_stpo-rel_cost.
* ENDIF.
*
* ls_stpob-sanka = ls_stpo-rel_cost.
* ls_stpob-ausch = ls_stpo-comp_scrap.
APPEND ls_stpob TO lt_stpob.
ENDLOOP.
CALL FUNCTION 'CALO_INIT_API'
EXPORTING
data_reset_sign = ''
EXCEPTIONS
log_object_not_found = 1
log_sub_object_not_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
CLEAR lt_messages.
ENDIF.
lv_commit_and_wait = abap_true.
lv_ale = abap_true.
CALL FUNCTION 'CSAI_BOM_CREATE'
EXPORTING
ecsin = ls_ecsin
estkob = ls_estkob
estzub = ls_estzub
emastb = ls_emastb
fl_commit_and_wait = lv_commit_and_wait
fl_ale = lv_ale
IMPORTING
fl_warning = lv_warning
astlnr = lv_astlnr
TABLES
t_stpob = lt_stpob
EXCEPTIONS
error = 1
OTHERS = 2.
IF sy-subrc <> 0.
CLEAR lv_astlnr.
ENDIF.
IF lv_astlnr IS INITIAL.
CALL FUNCTION 'CALO_LOG_READ_MESSAGES'
TABLES
messages_and_parameters = lt_messages
EXCEPTIONS
warning = 1
error = 2
OTHERS = 3.
IF sy-subrc <> 0.
CLEAR lt_messages.
ENDIF.
PERFORM display_message TABLES lt_messages.
* BOM creation failed
MESSAGE s014(zprd002) DISPLAY LIKE 'E'.
gv_error = abap_true.
CONTINUE.
ENDIF.
<lfs_bom>-stlnr = lv_astlnr.
CALL FUNCTION 'CALO_INIT_API'
EXPORTING
data_reset_sign = ''
EXCEPTIONS
log_object_not_found = 1
log_sub_object_not_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
CLEAR lt_messages.
ENDIF.
CALL FUNCTION 'CSAP_MAT_BOM_READ'
EXPORTING
material = lv_material
plant = lv_plant
bom_usage = lv_bom_usage
alternative = lv_alternative
valid_from = lv_valid_from
change_no = lv_change_no
TABLES
t_stpo = lt_stpo_read
t_stko = lt_stko_read
t_stpu = lt_stpu_read
EXCEPTIONS
error = 1
OTHERS = 2.
IF sy-subrc <> 0.
CLEAR: lt_stpo_read, lt_stko_read, lt_stpu_read.
CALL FUNCTION 'CALO_LOG_READ_MESSAGES'
TABLES
messages_and_parameters = lt_messages
EXCEPTIONS
warning = 1
error = 2
OTHERS = 3.
IF sy-subrc <> 0.
CLEAR lt_messages.
ENDIF.
PERFORM display_message TABLES lt_messages.
* BOM read failed
MESSAGE s015(zprd002) DISPLAY LIKE 'E'.
gv_error = abap_true.
CONTINUE.
ENDIF.
SORT lt_stko_read BY bom_no DESCENDING.
SORT lt_stpo_read BY bom_no item_no.
READ TABLE lt_stko_read INTO ls_stko_read INDEX 1.
IF sy-subrc = 0.
MOVE-CORRESPONDING ls_stko_read TO ls_stko_change.
ENDIF.
CLEAR: lt_stpo_change, lt_stpu_change.
LOOP AT <lfs_bom>-bicsp INTO ls_bicsp.
READ TABLE lt_stpo_read INTO ls_stpo_read
WITH KEY bom_no = ls_stko_read-bom_no
item_no = ls_bicsp-posnr
BINARY SEARCH.
IF sy-subrc <> 0.
CLEAR ls_stpo_read.
ENDIF.
LOOP AT <lfs_bom>-bicsu INTO DATA(ls_bicsu)
WHERE xline = ls_bicsp-xline.
CLEAR ls_stpu_change.
ls_stpu_change-pointer = ls_stpo_read-item_node.
ls_stpu_change-stlkn = ls_stpo_read-item_node. "BOM item node number
ls_stpu_change-stpoz = ls_stpo_read-item_count.
ls_stpu_change-uposz = ls_bicsu-uposz. "Subitem Number
ls_stpu_change-upmng = ls_bicsu-upmng. "Sub-item quantity
ls_stpu_change-ebort = ls_bicsu-ebort. "Installation point
ls_stpu_change-uptxt = ls_bicsu-uptxt. "BOM sub-item text
ls_stpu_change-vbkz = 'I'. "Insert
ls_stpu_change-selkz = abap_true.
APPEND ls_stpu_change TO lt_stpu_change.
ENDLOOP.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
CLEAR ls_stpo_change.
MOVE-CORRESPONDING ls_stpo_read TO ls_stpo_change.
ls_stpo_change-identifier = ls_stpo_read-item_node.
APPEND ls_stpo_change TO lt_stpo_change.
ENDLOOP.
IF lt_stpo_change IS INITIAL.
CONTINUE.
ENDIF.
lv_bom_create = abap_false.
lv_new_item = abap_false.
lv_complete = abap_false.
CLEAR ls_stko_read.
CALL FUNCTION 'CALO_INIT_API'
EXPORTING
data_reset_sign = ''
EXCEPTIONS
log_object_not_found = 1
log_sub_object_not_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
CLEAR lt_messages.
ENDIF.
EXPORT data_reset_sign = abap_true TO MEMORY ID 'data_reset_sign'.
CALL FUNCTION 'CSAP_MAT_BOM_MAINTAIN'
EXPORTING
material = lv_material
plant = lv_plant
bom_usage = lv_bom_usage
alternative = lv_alternative
valid_from = lv_valid_from
change_no = lv_change_no
i_stko = ls_stko_change
fl_commit_and_wait = lv_commit_and_wait
fl_bom_create = lv_bom_create
fl_new_item = lv_new_item
fl_complete = lv_complete
IMPORTING
fl_warning = lv_warning
o_stko = ls_stko_read
TABLES
t_stpo = lt_stpo_change
t_stpu = lt_stpu_change
EXCEPTIONS
error = 1
OTHERS = 2.
IF sy-subrc <> 0.
CLEAR: ls_stko_read.
CALL FUNCTION 'CALO_LOG_READ_MESSAGES'
TABLES
messages_and_parameters = lt_messages
EXCEPTIONS
warning = 1
error = 2
OTHERS = 3.
IF sy-subrc <> 0.
CLEAR lt_messages.
ENDIF.
PERFORM display_message TABLES lt_messages.
* BOM subitem maintain failed
MESSAGE s016(zprd002) DISPLAY LIKE 'E'.
gv_error = abap_true.
CONTINUE.
ENDIF.
gv_bom_created = abap_true.
* BOM created
MESSAGE s013(zprd002).
ENDLOOP.
ENDFORM.