- At the beginning let's clear Function Group memory using FM 'CP_CC_S_REFRESH_DATA'. Just for the safety reasons :-)
- Then let's load BOM header data to FG memory. If you want to do mass transaction then you would probably want to fill selection table i_cpsc_bom_sel with more than one BOM number, it will be then faster than calling FM 'CP_CC_S_LOAD_COMPLEX_BY_BOM' separately many times.
- But header data is not enough, we should do same thing for BOM items using FM 'CP_CC_S_LOAD_COMPLEX_BY_ITM', as Items belongs to different work area in CEWB.
- Once we loaded data to memory we can start copying, firstly we need to call 'CP_CC_S_BOM_PROVIDE_BY_MBM' to get source header data and then use its export parameters in FM 'CS_CL_S_MAT_BOM_CREATE_BY_COPY', which is doing copy of a header data.
- Once it's done we have to get source items from memory using 'CS_CL_P_ITM_PROVIDE', and then use it for copying items to our target BOM in 'CS_CL_S_ITM_CREATE_BY_COPY'.
- At the end, when everything is fine, use FM 'CP_CC_S_SAVE' to save your changes and commit your work.
Work done!
report zabcopybom.
data: c_bom_class_data      like bom_class_data,
      e_ecm_data_error_type type cpcc_message_type.
selection-screen begin of block b01 with frame title text-b01.
parameters: p_matnr type mara-matnr obligatory,
            p_werks type marc-werks obligatory,
            p_stlal type mast-stlal obligatory,
            p_stlan type mast-stlan obligatory.
selection-screen end of block b01.
selection-screen begin of block b02 with frame title text-b02.
parameters: p_matto type mara-matnr obligatory,
            p_werto type marc-werks obligatory,
            p_stlto type mast-stlal obligatory,
            p_stnto type mast-stlan.
selection-screen end of block b02.
start-of-selection.
  perform copy_bom.
form copy_bom.
  "! refresh FG data to be sure we get correct data only
  call function 'CP_CC_S_REFRESH_DATA'
    exceptions
      workarea_not_set = 1
      others           = 2.
  if sy-subrc <> 0.
    "! no problem if there was error as this means nothing was to refresh
  endif.
  data i_cpsc_bom_sel type cpsc_bom_sel_type.
  data: source_stlnr type stko-stlnr.
  select single stlnr into @source_stlnr from mast
  where matnr eq @p_matnr
  and   werks eq @p_werks
  and   stlal eq @p_stlal.
  check sy-subrc eq 0.
  i_cpsc_bom_sel-stlnr = value #( ( low = source_stlnr sign = 'I' option = 'EQ'  ) ).
  i_cpsc_bom_sel-stlty = value #( ( low = 'M' sign = 'I' option = 'EQ'  ) ).
  i_cpsc_bom_sel-stlal = value #( ( low = p_stlal sign = 'I' option = 'EQ'  ) ).
  i_cpsc_bom_sel-stlan = value #( ( low = p_stlan sign = 'I' option = 'EQ'  ) ).
    "! Load BOM Header to memory
  call function 'CP_CC_S_LOAD_COMPLEX_BY_BOM'
    exporting
      i_class                        = 'P'
      i_work_area                    = 'SAP_BOM'
      i_classes_in_workarea          = value classes_in_workarea( bom_inarea = abap_true 
                                                                  itm_inarea = abap_true 
                                                                  sui_inarea = abap_true )
      i_cpsc_bom_sel                 = i_cpsc_bom_sel
      i_date_from                    = sy-datum
      i_date_to                      = sy-datum
    exceptions
      workarea_not_found             = 1
      class_wrong_type               = 2
      workarea_wrong_type            = 3
      class_in_workarea_inconsistent = 4
      workarea_not_specified         = 5
      bom_not_found                  = 6
      no_selection_criteria          = 7
      invalid_selection_period       = 8
      key_date_required_for_ecm      = 9
      others                         = 10.
  check sy-subrc eq 0.
    "! Load BOM Items to memory
  call function 'CP_CC_S_LOAD_COMPLEX_BY_ITM'
    exporting
      i_class                        = 'P'
      i_work_area                    = 'SAP_ITEM'
      i_classes_in_workarea          = value classes_in_workarea( bom_inarea = abap_true 
                                                                  itm_inarea = abap_true 
                                                                  sui_inarea = abap_true )
      i_cpsc_bom_sel                 = i_cpsc_bom_sel
      i_date_from                    = sy-datum
      i_date_to                      = sy-datum
    exceptions
      workarea_not_found             = 1
      class_wrong_type               = 2
      workarea_wrong_type            = 3
      class_in_workarea_inconsistent = 4
      workarea_not_specified         = 5
      itm_not_found                  = 6
      no_selection_criteria          = 7
      invalid_selection_period       = 8
      key_date_required_for_ecm      = 9
      others                         = 10.
  check sy-subrc eq 0.
  data e_bom_class_data type standard table of bom_class_data .
    "! Get BOM Header data
  call function 'CP_CC_S_BOM_PROVIDE_BY_MBM'
    exporting
      i_date_from      = sy-datum
      i_date_to        = sy-datum
      i_material       = p_matnr
      i_plant          = p_werks
      i_stlan          = p_stlan
      i_stlnr          = source_stlnr
      i_stlal          = p_stlal
    tables
      e_bom_class_data = e_bom_class_data
    exceptions
      wrong_key        = 1
      others           = 2.
  check sy-subrc eq 0 and line_exists( e_bom_class_data[ 1 ] ).
  c_bom_class_data-stlal = p_stlto.
  c_bom_class_data-stlan = p_stnto.
    "! Create copy of BOM header
  call function 'CS_CL_S_MAT_BOM_CREATE_BY_COPY'
    exporting
*     I_ECN_S                = ' '
      i_key_date_s           = sy-datum
      i_stlty                = e_bom_class_data[ 1 ]-stlty
      i_stlnr                = e_bom_class_data[ 1 ]-stlnr
      i_stlal                = e_bom_class_data[ 1 ]-stlal
      i_stkoz                = e_bom_class_data[ 1 ]-stkoz
      i_matnr_new            = p_matto
      i_werks_new            = p_werto
      i_stlan_new            = c_bom_class_data-stlan
      i_stlnr_new            = c_bom_class_data-stlnr
      i_stlal_new            = c_bom_class_data-stlal
      i_flg_bom_check        = abap_false
    changing
      c_bom_class_data       = c_bom_class_data
    exceptions
      mbm_not_consistent     = 1
      bom_not_consistent     = 2
      no_authority           = 3
      bom_not_locked         = 4
      no_valid_material      = 5
      no_valid_plant         = 6
      no_valid_usage         = 7
      alternative_overflow   = 8
      ident_already_exists   = 9
      multiple_bom           = 10
      variant_bom            = 11
      bom_in_plant_not_found = 12
      ecm_data_not_suitable  = 13
      input_incomplete       = 14
      no_valid_bom           = 15
      others                 = 16.
  if sy-subrc = 0.
    "! GET source items
    data: e_itm_class_data type standard table of itm_class_data.
    call function 'CS_CL_P_ITM_PROVIDE'
      exporting
        i_date_from      = sy-datum
        i_date_to        = sy-datum
        i_stlty          = e_bom_class_data[ 1 ]-stlty
        i_stlnr          = e_bom_class_data[ 1 ]-stlnr
        i_stlal          = e_bom_class_data[ 1 ]-stlal
        i_werks          = p_werks
      tables
        e_itm_class_data = e_itm_class_data
      exceptions
        wrong_key        = 1
        others           = 2.
    if sy-subrc eq 0.
      data: i_itm_class_data_new type itm_class_data.
      data: i_alternatives_new type cscl_alt_tb_type.
      loop at e_itm_class_data assigning field-symbol(<itm>).
    "! Copy Item        
        call function 'CS_CL_S_ITM_CREATE_BY_COPY'
          exporting
*           i_ecn_s                  = i_ecn_s
            i_key_date_s             = sy-datum
            i_stlty                  = e_bom_class_data[ 1 ]-stlty
            i_stlnr                  = e_bom_class_data[ 1 ]-stlnr
            i_stlal                  = e_bom_class_data[ 1 ]-stlal
            i_stvkn                  = <itm>-stvkn
            i_stlkn                  = <itm>-stlkn
            i_stpoz                  = <itm>-stpoz
            i_itm_class_data_new     = i_itm_class_data_new
            i_stlty_new              = c_bom_class_data-stlty
            i_stlnr_new              = c_bom_class_data-stlnr
            i_alternatives_new       = value cscl_alt_tb_type( ( stlal = p_stlto ) )
            i_flg_itm_check          = abap_false
          exceptions
            new_item_not_consistent  = 1
            no_authority             = 2
            no_valid_item            = 3
            new_item_not_locked      = 4
            new_ident_already_exists = 5
            wrong_new_ident_type     = 6
            no_valid_new_bom         = 7
            input_incomplete         = 8
            ecm_data_not_suitable    = 9
            others                   = 10.
        if sy-subrc ne 0.
          return.
        endif.
      endloop.
          "! Save data
      call function 'CP_CC_S_SAVE'
        exceptions
          error_at_save = 1
          others        = 2.
      if sy-subrc = 0.
        commit work.
      else.
        rollback work.
      endif.
    endif.
  endif.
endform.



