To continue previous two posts about re-exploding and deleting subcontracting BOM of purchase requisition item, let me describe you how to do the same thing with subcontracting BOM of purchase order line.
The main part is again to use FM ME_COMPONENTS_MAINTAIN and ME_COMPONENTS_UPDATE_PREPARE , but this time there is no easy way to fill MDPA and MDLB structures which are needed here.
So I had to use CL_PO_HEADER_HANDLE_MM and IF_PURCHASE_ORDER_MM to fetch all data from purchase order and to move them to MDPA and MDLB structures. Once it was ready the rest was peanuts and I could get rid of using this two buttons :-)

report zabexpldelpobom.

parametersp_ebeln type ekpo-ebeln,
            p_ebelp type ekpo-ebelp default '00010'.

parametersp_expl radiobutton group gr1 default 'X',
            p_del radiobutton group gr1.

class lcl_subcontracting definition.
  public section.
    constantsaction_delete  type value 'D',
               action_explode type value 'M'.

    class-methodsexplode_po_bom importing value(i_order)         type ebeln
                                            value(i_position)      type ebelp
                                            value(i_show_messagestype abap_bool default abap_false
                                  returning value(r_re_exploded)   type abap_bool.

    class-methodsdelete_po_bom importing value(i_order)         type ebeln
                                           value(i_position)      type ebelp
                                           value(i_show_messagestype abap_bool default abap_false
                                 returning value(r_deleted)       type abap_bool.

    class-methodscall_components_update importing value(i_order)         type ebeln
                                                    value(i_position)      type ebelp
                                                    value(i_show_messagestype abap_bool default abap_false
                                                    value(i_action_type)   type c
                                          returning value(r_messages)      type mepo_t_messages_bapi ,

          value(i_order)    type ebeln
          value(i_positiontype ebelp
          value(e_mdpa)     type mdpa
          value(e_mdlb)     type mdlb.


  if p_expl eq abap_true.

        i_order         p_ebeln
        i_position      p_ebelp
        i_show_messages abap_true  ).

  elseif p_del eq abap_true.

         i_order         p_ebeln
         i_position      p_ebelp
         i_show_messages abap_true  ).

class lcl_subcontracting implementation.

  method call_components_update.
    cl_message_handler_mm=>get_handler(  importing
                                     ex_handler data(message_handler)

    call function 'ME_COMPONENTS_REFRESH'.
    dataekpo     type                   ekpo,
          mdpa     type                   mdpa,
          mdlb     type                   mdlb,
          mdlb_tab type standard table of mdlb.

    select single into corresponding fields of ekpo
    from ekpo
    where ebeln eq i_order
    and   ebelp eq i_position.

    prepare_po_mdpaexporting i_order i_order i_position i_position
                     importing e_mdpa mdpa e_mdlb mdlb ).

    check mdpa is not initial and mdlb is not initial.

    append mdlb to mdlb_tab.

    call function 'ME_COMPONENTS_MAINTAIN'
        i_ebeln    i_order
        i_ebelp    i_position
        i_fcall    abap_true
        i_mdpa     mdpa
        i_mdpa_old mdpa
        i_txz01    ekpo-txz01
        i_vorga    i_action_type.

        i_number i_order
        t_mdlb   mdlb_tab.

    r_messages message_handler->get_list_for_bapi).

    commit work.
    if i_show_messages eq abap_true.
      message_handler->showim_amodal abap_true ).


  method prepare_po_mdpa.
    dataheader       type        mepoheader,
          item         type        mepoitem,
          schedule     type        meposchedule,
          eban         type        eban,
          mt06e        type        mt06e,
          float        type        f,
          t001w        type        t001w,
          accounting   type        mepoaccounting,
          order_handle type ref to cl_po_header_handle_mm,
          order        type ref to if_purchase_order_mm.

    order_handle new cl_po_header_handle_mm(  im_po_number i_order ).
    order_handle->po_initialize(  ).
        im_tcode     'ME23N'
        im_trtyp     'A'    " Transaction Type
        im_aktyp     'A'    " Activity Category
        im_po_number i_order    " Document Number
        ex_result    data(po_was_read)
    check po_was_read eq abap_true.

    order ?= order_handle.

    header order->get_data).
    loop at items assigning field-symbol(<item>).
      item <item>-item->get_data).
      if item-ebelp eq i_position.
        clear item.

    check item is not initial and item-sobkz eq 'L'.
    data(schedule_lines=  <item>-item->get_schedules).
    loop at schedule_lines assigning field-symbol(<schline>).
      schedule <schline>-schedule->get_data).

    check item-attyp ne cl_mmpur_constants=>attyp_01.   "no generic article

* populate mdpa structure
    e_mdlb-ebeln i_order.
    e_mdlb-ebelp i_position.
    e_mdlb-kzbws item-kzbws.
    e_mdpa-matnr item-matnr.
    e_mdpa-pwwrk item-werks.
    e_mdpa-lgort item-lgort.
    e_mdpa-paart header-bsart.
    e_mdpa-beskz 'F'.
    e_mdpa-sobes cl_mmpur_constants=>pstyp_3.
    e_mdpa-gsmng schedule-menge.
    e_mdpa-flief header-lifnr.
    if item-meins ne item-lmein and not item-lmein is initial.
      e_mdpa-gsmng float schedule-menge * item-umrez / item-umren.

    e_mdpa-lagme item-lmein.
    if e_mdpa-lagme is initial and e_mdpa-matnr is initial.
      e_mdpa-lagme item-meins.
    if schedule-eindt is initial.
      e_mdpa-psttr header-bedat.
*-- reference to requisition-----------------------------------------*
      if schedule-banfn ne space.
        call function 'MEREQS_EBAN_LOOKUP'
            im_banfn schedule-banfn
            im_bnfpo schedule-bnfpo
            ex_eban  eban
            failure  1.
*-- if requisition is created from prod. order                ----*
*-- or from planned order and delivery date has not changed,  ----*
*-- take over release date from the requisition               ----*
      if schedule-banfn ne space and
         eban-estkz cl_mmpur_constants=>estkz_f or
           eban-estkz cl_mmpur_constants=>estkz_u )
         and eban-lfdat eq schedule-eindt.
        e_mdpa-psttr eban-frgdt.

        call function 'MEX_READ_T001W'
            im_werks  item-werks
            ex_t001w  t001w
            not_found 1
            others    2.

        if sy-subrc <> 0.

        call function 'ME_COMP_REQUIREMENT_DATE'
            im_plant            item-werks
            im_factory_calendar t001w-fabkl
            im_delivery_date    schedule-eindt
            im_planned_del_time item-plifz
            ex_requirement_date e_mdpa-psttr.
        if sy-subrc <> 0.                                   "#EC *
    e_mdpa-pedtr schedule-eindt.
    e_mdpa-knttp item-knttp.
    e_mdpa-sobkz item-sobkz.
    e_mdpa-kzvbr item-kzvbr.
    e_mdpa-kzbws item-kzbws.
    e_mdpa-revlv item-revlv.
    e_mdpa-sernr schedule-sernr.
    e_mdpa-rsnum schedule-rsnum.
    e_mdpa-cuobj item-cuobj.

*    e_mdpa-verid = order_handle->verid.

* read material data
    if not item-werks is initial.
      call function 'ME_READ_MT06E'
          i_matnr item-matnr
          i_werks item-werks
          e_mt06e mt06e
          others  1.

    e_mdpa-altsl mt06e-altsl.

    if item-knttp ne space and item-kzvbr ne 'U'.
* get accounting data
      if linesaccounts eq 1.
        assign accounts[ to field-symbol(<acc>).
        if sy-subrc is initial and not <acc> is initial.
          accounting <acc>-accounting->get_data).
        e_mdpa-aufpl_ord accounting-aufpl_ord.
        e_mdpa-aplzl_ord accounting-aplzl_ord.
* Account assignment data for make to order
        if e_mdpa-sobkz eq cl_mmpur_constants=>sobkz_e or
           e_mdpa-sobkz eq cl_mmpur_constants=>sobkz_q.
          e_mdpa-kdauf accounting-vbeln.
          e_mdpa-kdpos accounting-vbelp.
          e_mdpa-kdein accounting-veten.
          e_mdpa-pspel accounting-ps_psp_pnr.
          e_mdlb-kdauf accounting-vbeln.
          e_mdlb-kdpos accounting-vbelp.
          e_mdlb-kdein accounting-veten.
          e_mdlb-pspel accounting-ps_psp_pnr.


  method explode_po_bom.
            i_order         i_order
            i_position      i_position
            i_show_messages i_show_messages
            i_action_type   action_explode
    if line_existsmessages[ msgid 'ME' msgno '638' ).
      r_re_exploded abap_true.


  method delete_po_bom.
            i_order         i_order
            i_position      i_position
            i_show_messages i_show_messages
            i_action_type   action_delete
    if not line_existsmessages[ msgty 'E' ).
      r_deleted abap_true.