Extend the MDG Business Partner – Node Extension (Reuse Option)


So, here we are going to add a new entity to the company code data level, as shown in the above figure.

Steps:-

Extension of S4 API Structures

  • To get the API structures, we need to go to the standard BP handler class.

  • In Below structure, we need to add our own API structure.
  • Class ‘CL_MDG_BS_ECC_HANDLER’.
  • Table Type ‘MDG_BS_BP_TT_ECC_EXTERN’.


Data Dictionary Object Creation

Structures







For Genil model extensions:



Creation of Table to store this Secret number data in backend active table


Extension of BP data model with new Entity








Generate Data Model specific structures


Create and Implement BP Handler Class


Below methods we need to re-define

GET_OBJECT_DATA_BY_ENTITY

SORT_ENTITIES

MAP_DATA_2API

MAP_DATA_2STA

PREPARE_EI_HEADER_MAP_2API

READ_OBJECT_DATA

SAVE_ADDITIONAL_OBJECT_DATA

CONSTRUCTOR

Below methods we have created newly

READ_VENDOR_BY_LIFNR

READ_VENDOR

MAP_BP_ZSECRET_N_2API

MAP_BP_ZSECRET_N_2STA

CONSTRUCTOR

METHOD constructor.

    super->constructor( ).
    me
->gv_wf_services cl_mdg_bs_suppl_wf_services=>get_instance( ).

    go_mlt_as_api cl_mdg_bs_bp_mlt_assgnmnt_api=>get_instance( ).
ENDMETHOD
.

READ_VENDOR_BY_LIFNR

  METHOD read_vendor_by_lifnr.
    
DATA:
      ls_vmds_ei_main    
TYPE vmds_ei_main,
      ls_vmds_ei_extern  
TYPE vmds_ei_extern,
      ls_vmds_ei_main_in 
TYPE vmds_ei_main,
      ls_cvis_extern     
TYPE cvis_ei_extern,
      lv_partner_guid    
TYPE bu_partner_guid.

    
FIELD-SYMBOLS:
                   <ls_idlist> 
TYPE bus_ei_instance.

    
IF iv_lifnr IS NOT INITIAL.
      ls_vmds_ei_extern
-header-object_task 'M'.
      ls_vmds_ei_extern
-header-object_instance-lifnr iv_lifnr.
      
APPEND ls_vmds_ei_extern TO ls_vmds_ei_main_in-vendors.
    
ENDIF.

    
IF NOT ls_vmds_ei_main_in IS INITIAL.
* Extract Vendors
      vmd_ei_api_extract
=>get_data(
                            
EXPORTING
                              is_master_data 
ls_vmds_ei_main_in
                            
IMPORTING
                              es_master_data 
ls_vmds_ei_main
                            
EXCEPTIONS
                              
OTHERS ).

      
LOOP AT ls_vmds_ei_main-vendors INTO DATA(ls_vendors). "only one entry expected
        es_supplier
-vendor ls_vendors.
        
EXIT.
      
ENDLOOP.
    
ENDIF.

  
ENDMETHOD.

READ_VENDOR

  METHOD read_vendor.
    
DATA:
      lo_ka_bp_vendor    
TYPE REF TO cvi_ka_bp_vendor,
      ls_bp_suppl_link   
TYPE ty_bp_suppl_link,
      ls_vmds_ei_main    
TYPE vmds_ei_main,
      ls_vmds_ei_extern  
TYPE vmds_ei_extern,
      ls_vmds_ei_main_in 
TYPE vmds_ei_main,
      ls_cvis_extern     
TYPE cvis_ei_extern,
      lv_partner_guid    
TYPE bu_partner_guid.
    
FIELD-SYMBOLS:
    <ls_idlist> 
TYPE bus_ei_instance.
* Read Connection Between Vendor and Business Partner
    lo_ka_bp_vendor 
cvi_ka_bp_vendor=>get_instance( ).
    
LOOP AT it_idlist ASSIGNING <ls_idlist>.
* existenz in globaler Tabelle noch prüfen
      ls_bp_suppl_link
-bpartner <ls_idlist>-bpartner.
      lv_partner_guid 
<ls_idlist>-bpartnerguid.
      
IF lv_partner_guid IS INITIAL.
        
CALL FUNCTION 'BUPA_NUMBERS_GET'
          
EXPORTING
            iv_partner      
ls_bp_suppl_link-bpartner
          
IMPORTING
            ev_partner_guid 
lv_partner_guid.
      
ENDIF.
      lo_ka_bp_vendor
->get_assigned_vendor_for_bp(
                           
EXPORTING
                             i_partner 
lv_partner_guid
                           RECEIVING
                             r_vendor 
ls_bp_suppl_link-supplier
                           
EXCEPTIONS
                             
OTHERS ).

      
IF sy-subrc AND ls_bp_suppl_link-supplier IS NOT INITIAL.
        
APPEND ls_bp_suppl_link TO gt_bp_suppl_link.
        ls_vmds_ei_extern
-header-object_task 'M'.
        ls_vmds_ei_extern
-header-object_instance-lifnr ls_bp_suppl_link-supplier.
        
APPEND ls_vmds_ei_extern TO ls_vmds_ei_main_in-vendors.
        
CLEARls_vmds_ei_extern.
      
ENDIF.
    
ENDLOOP.

    
IF NOT ls_vmds_ei_main_in IS INITIAL.
* Extract Vendors
      vmd_ei_api_extract
=>get_data(
                            
EXPORTING
                              is_master_data 
ls_vmds_ei_main_in
                            
IMPORTING
                              es_master_data 
ls_vmds_ei_main
                            
EXCEPTIONS
                              
OTHERS ).

      
LOOP AT it_idlist ASSIGNING <ls_idlist>.
        ls_cvis_extern
-partner-header-object_instance-bpartner <ls_idlist>-bpartner.
        
CLEAR ls_cvis_extern-vendor.
* Vendor
        
READ TABLE gt_bp_suppl_link
                      
INTO ls_bp_suppl_link
                      
WITH KEY bpartner <ls_idlist>-bpartner.
        
IF sy-subrc 0.

          
READ TABLE ls_vmds_ei_main-vendors
                     
INTO ls_vmds_ei_extern
                     
WITH KEY header-object_instance-lifnr ls_bp_suppl_link-supplier.

          
IF sy-subrc 0.
            ls_cvis_extern
-vendor ls_vmds_ei_extern.
          
ENDIF.
        
ENDIF.
        
APPEND ls_cvis_extern TO et_supplier.
      
ENDLOOP.
    
ENDIF.
  
ENDMETHOD.

MAP_BP_ZSECRET_N_2API

  METHOD map_bp_zsecret_n_2api.

    
DATAlv_dummy   TYPE string,
          ls_secret  
TYPE zxx_s_bp_pp_secret_n,             "#EC NEEDED
          ls_dunn_x  
TYPE mdg_bs_suppl_bp_dunn_x,
          ls_target  
TYPE zin_s_secret_number,
          ls_comp    
TYPE vmds_ei_company,
          ls_comp_db 
TYPE vmds_ei_company.

    
FIELD-SYMBOLS:
      <ls_data_x>         
TYPE any,
      <ls_comp>           
TYPE vmds_ei_company,
      <lv_assgnm_id>      
TYPE mdg_bp_assignment_id,
      <lv_partner>        
TYPE bu_partner,
      <ls_ecc_extern_db>  
TYPE mdg_bs_bp_s_ecc_extern,
      <ls_cvis_ei_extern> 
TYPE cvis_ei_extern,
      <ls_vendors>        
TYPE mdg_bs_bp_s_mlt_as_suppl,
      <ls_vendor>         
TYPE vmds_ei_extern.
    
MOVE-CORRESPONDING is_data TO ls_secret.
* Company Data key
    
READ TABLE cs_suppl-vendor-company_data-company WITH KEY data_key-bukrs ls_secret-company ASSIGNING <ls_comp>.
    
IF <ls_comp> IS NOT ASSIGNED.
* create entry as entities bp_compny and bp_dunn may map to the same target record as dunning data are company dependent
* CAUTION if no inactive changes for the company code exist: check if company data for the relevant
*comp. code is saved. If DB data exists, the company code data must be insertedas well as otherwise
* check would determine initial company code data when checking entity BP_COMPNY
      ls_comp
-data_key-bukrs ls_secret-company.
      ls_comp
-task gc_upd"if insert of entity comes later on task is overwritten
* check if comp. code is saved
      
ASSIGN COMPONENT 'BP_HEADER' OF STRUCTURE is_data TO <lv_partner>.
      
IF sy-subrc 0.
        
IF <lv_partner> IS NOT INITIAL.
          
ASSIGN COMPONENT 'ASSGNM_ID' OF STRUCTURE is_data TO <lv_assgnm_id>.
          
IF sy-subrc 0.
            
IF <lv_assgnm_id> IS NOT INITIAL.
              
READ TABLE gt_ecc_extern_db ASSIGNING <ls_ecc_extern_db>
                                          
WITH KEY partner-header-object_instance-bpartner <lv_partner>.
              
IF sy-subrc 0.
                
READ TABLE <ls_ecc_extern_db>-vendors ASSIGNING <ls_vendors>
                                                      
WITH KEY assignment_id <lv_assgnm_id>.
                
IF sy-subrc 0.
                  
READ TABLE <ls_vendors>-vendor-company_data-company INTO ls_comp_db
                                            
WITH KEY data_key-bukrs ls_secret-company.

                  
IF sy-subrc 0.
                    ls_comp
-data ls_comp_db-data.
                  
ENDIF.
                
ENDIF.
              
ENDIF.
            
ENDIF.
          
ENDIF.
        
ENDIF.
      
ENDIF.
      
INSERT ls_comp INTO TABLE cs_suppl-vendor-company_data-company ASSIGNING <ls_comp>.
    
ENDIF.
* Secret Number Data Key
    ls_target
-data_key-secret_number ls_secret-zsecret.
* Secret Number Data
    
IF iv_task gc_ins OR iv_task gc_upd.
      ls_target
-data-sn_comment ls_secret-sncomment .
    
ENDIF.
    ls_target
-task iv_task.
    
APPEND ls_target TO <ls_comp>-zsecret_number-zsecret_number.
    cv_xchange 
abap_true.

  
ENDMETHOD.

MAP_BP_ZSECRET_N_2STA

  METHOD map_bp_zsecret_n_2sta.

    
FIELD-SYMBOLS<ls_extern_db>     LIKE LINE OF gt_ecc_extern_db,
                   <ls_vendor>        
TYPE mdg_bs_bp_s_mlt_as_suppl,
                   <ls_company>       
TYPE LINE OF vmds_ei_company_t,
                   <ls_secret_number> 
TYPE zin_s_secret_number,
                   <lv_bp_header>     
TYPE bu_partner,
                   <lv_company>       
TYPE bukrs,
                   <lv_secret_number> 
TYPE zin_de_secret_number,
                   <lv_comment>       
TYPE zin_de_secret_number_comment.

    
DATAlr_data  TYPE REF TO data,
          lv_dummy 
TYPE string.

    
FIELD-SYMBOLS:
      <ls_data>   
TYPE data,
      <ls_comp>   
TYPE vmds_ei_company,
      <ls_secret> 
TYPE zin_s_secret_number,
      <lv_as_id>  
TYPE mdg_bp_assignment_id.

    
LOOP AT gt_ecc_extern_db ASSIGNING <ls_extern_db>.
      
LOOP AT <ls_extern_db>-vendors ASSIGNING <ls_vendor>.
        
LOOP AT <ls_vendor>-vendor-company_data-company ASSIGNING <ls_company>.
          
LOOP AT <ls_company>-zsecret_number-zsecret_number ASSIGNING <ls_secret>.
            
CREATE DATA lr_data LIKE LINE OF ct_data.
            
ASSIGN lr_data->TO <ls_data>.

            
ASSIGN COMPONENT:
            
'BP_HEADER' OF STRUCTURE <ls_data> TO <lv_bp_header>,
            
'COMPANY' OF STRUCTURE <ls_data> TO <lv_company>,
            
'ZSECRET' OF STRUCTURE <ls_data> TO <lv_secret_number>,
            
'SNCOMMENT' OF STRUCTURE <ls_data> TO <lv_comment>,
            
'ASSGNM_ID' OF STRUCTURE <ls_data> TO <lv_as_id>.

            <lv_as_id>  
<ls_vendor>-assignment_id.
            <lv_bp_header> 
<ls_extern_db>-partner-header-object_instance-bpartner.
            <lv_company> 
<ls_company>-data_key-bukrs.
            <lv_secret_number> 
<ls_secret>-data_key-secret_number.
            <lv_comment> 
<ls_secret>-data-sn_comment.
            
INSERT <ls_data> INTO TABLE ct_data.
          
ENDLOOP.
        
ENDLOOP.
        
ENDLOOP.
        
ENDLOOP.

      
ENDMETHOD.

GET_OBJECT_DATA_BY_ENTITY

  METHOD if_mdg_bs_bp_access_handler~get_object_data_by_entity.

    CASE iv_entity.
      
WHEN 'ZSECRET_N'.
        
FIELD-SYMBOLS<ls_secret_num> TYPE zin_t_secret_num.
        
DATAlo_line TYPE REF TO data.
        
SELECT SINGLE FROM zin_t_secret_num INTO @DATA(ls_secret_numWHERE lifnr @iv_partner.
        
CREATE DATA lo_line TYPE zin_t_secret_num.
        
ASSIGN lo_line->TO <ls_secret_num>.
        <ls_secret_num> 
ls_secret_num.
        er_data 
lo_line.
    
ENDCASE.
  
ENDMETHOD.

MAP_DATA_2API

METHOD if_mdg_bs_bp_access_handler~map_data_2api.

  
DATAls_cvi_ei_extern TYPE cvis_ei_extern.
* ls_suppl_ext TYPE mdg_bs_bp_s_mlt_as_suppl .
  
FIELD-SYMBOLS:
    <lt_mlt_as>    
TYPE mdg_bs_bp_tt_mlt_as,
    <ls_mlt_as>    
TYPE mdg_bs_bp_s_mlt_as,
    <lt_data>      
TYPE mdg_bs_bp_tt_mlt_as_suppl,
    <ls_data>      
TYPE vmds_ei_extern,
    <ls_ext_suppl> 
TYPE vmds_ei_extern,
    <ls_bp_header> 
TYPE bus_ei_extern,
    <ls_as_id>     
TYPE mdg_bp_assignment_id,
    <ls_ext_as_id> 
TYPE mdg_bp_assignment_id,
    <ls_suppl>     
TYPE mdg_bs_bp_s_mlt_as_suppl" vmds_ei_extern.
  
ASSIGN COMPONENT 'ASSGNM_ID' OF STRUCTURE is_data TO <ls_as_id>.
  
ASSIGN COMPONENT 'VENDOR' OF STRUCTURE cs_data_ext TO <ls_ext_suppl> .
  
CHECK <ls_ext_suppl> IS ASSIGNED.
* ls_cvi_ei_extern-partner-header-object_instance_bpartner = not available here...
  ls_cvi_ei_extern
-vendor <ls_ext_suppl> .
  
CASE iv_entity.
    
WHEN 'ZSECRET_N'.
      
CALL METHOD me->map_bp_zsecret_n_2api
        
EXPORTING
          is_data    
is_data
          iv_task    
iv_task
*          iv_fname   = iv_fname
        
CHANGING
          cs_suppl   
ls_cvi_ei_extern
*          ct_return  = ct_return
          cv_xchange 
cv_xchange.
    
WHEN OTHERS.
  
ENDCASE.
  
IF <ls_ext_suppl> IS ASSIGNED.
    <ls_ext_suppl> 
ls_cvi_ei_extern-vendor.
    
ASSIGN COMPONENT 'ASSIGNMENT_ID' OF STRUCTURE cs_data_ext TO <ls_ext_as_id>.
    
IF sy-subrc 0.
      <ls_ext_as_id> 
<ls_as_id>.
    
ENDIF.
  
ENDIF.
ENDMETHOD.

MAP_DATA_2STA

METHOD if_mdg_bs_bp_access_handler~map_data_2sta.

  
DATAls_cvi_ei_extern TYPE cvis_ei_extern,
        lv_as_id         
TYPE mdg_bp_assignment_id.

  
FIELD-SYMBOLS:
    <lt_mlt_as>    
TYPE ANY TABLE,
    <ls_mlt_as>    
TYPE any,
    <lt_data>      
TYPE mdg_bs_bp_tt_mlt_as_suppl,
    <ls_data>      
TYPE mdg_bs_bp_s_mlt_as_suppl,
    <ls_bp_header> 
TYPE bus_ei_extern,
    <ls_data_ret>  
TYPE any,
    <lv_as_id_ret> 
TYPE any,
    <lv_as_id>     
TYPE any.

* special handling for multiple assignments:
* in case a multiple assignment record for standard vendor was simulated (ifcvi_vend_link exist but no entry
* in table MDG_MLT_ASSGNMNT) then only this record is bufferd by customer handler and has to be mapped here, that's why entity 'BP_MLT_AS'
* has to be processed here additionally
*  IF iv_entity = 'BP_MLT_AS'.
*    ASSIGN COMPONENT 'MLT_ASSIGNMENTS' OF STRUCTURE is_data TO <lt_mlt_as>.
*    CALL METHOD me->map_bp_mlt_as_2sta
*      EXPORTING
*        it_mlt_as = <lt_mlt_as>
*      CHANGING
*        ct_data   = ct_data
*        ct_return = ct_return.
*    RETURN.
*  ENDIF.
** handling of all other entities
*  ASSIGN COMPONENT 'PARTNER' OF STRUCTURE is_data TO <ls_bp_header>.
*  ASSIGN COMPONENT 'VENDORS' OF STRUCTURE is_data TO <lt_data>.
*  IF <lt_data> IS ASSIGNED.
*    LOOP AT <lt_data> ASSIGNING <ls_data>.
** build CVI structure for mapping
*      ls_cvi_ei_extern-partner = <ls_bp_header>.
*      ls_cvi_ei_extern-vendor = <ls_data>-vendor.
*      ASSIGN COMPONENT 'ASSIGNMENT_ID' OF STRUCTURE <ls_data> TO <lv_as_id>.
*      IF sy-subrc = 0.
*        lv_as_id = <lv_as_id>.
*      ENDIF.
      
CASE iv_entity.
        
WHEN 'ZSECRET_N'.
          
CALL METHOD me->map_bp_zsecret_n_2sta
            
EXPORTING
              is_suppl         
ls_cvi_ei_extern
              iv_assignment_id 
lv_as_id
            
CHANGING
              ct_data          
ct_data.
*              ct_return        = ct_return.
      
ENDCASE.
*    ENDLOOP.
*  ENDIF.
ENDMETHOD.

PREPARE_EI_HEADER_MAP_2API

  METHOD if_mdg_bs_bp_access_handler~prepare_ei_header_map_2api.
    
FIELD-SYMBOLS:
      <ls_suppl_ext>  
TYPE cvis_ei_extern,
      <bp_suppl_link> 
TYPE ty_bp_suppl_link.
    
DATA:
    ls_suppl_ext 
TYPE cvis_ei_extern.
    
FIELD-SYMBOLS:
      <lv_partner>       
TYPE bu_partner,
      <ls_ecc_ext>       
TYPE mdg_bs_bp_s_ecc_extern,
      <ls_data_ext_db>   
TYPE mdg_bs_bp_s_ecc_extern,
      <ls_vendor_db>     
TYPE mdg_bs_bp_s_mlt_as_suppl,
      <lv_kunnr>         
TYPE kunnr,
      <ls_ecc_ext_suppl> 
TYPE mdg_bs_bp_s_mlt_as_suppl,
      <lv_assignment_id> 
TYPE mdg_bp_assignment_id,
      <ls_ecc_mlt_as>    
TYPE mdg_bs_bp_s_mlt_as_mem,
      <ls_ext>           
TYPE mdg_bs_bp_s_mlt_as_suppl.
    
DATA:
      ls_cust_ext      
TYPE cvis_ei_extern,
      ls_ecc_ext       
TYPE mdg_bs_bp_s_ecc_extern,
      lr_data          
TYPE REF TO data,
      ls_ecc_ext_suppl 
TYPE mdg_bs_bp_s_mlt_as_suppl,
      ls_ecc_mlt_as    
TYPE mdg_bs_bp_s_mlt_as_mem.

    
CHECK iv_entity 'ZSECRET_N'.
* Supplier Switch for EHP6 has to be active
    
IF cl_mdg_bs_suppl_switch_check=>mdg_bs_ecc_supplier_switch_02( ) EQ abap_true
    
.
      
ASSIGN COMPONENT 'BP_HEADER' OF STRUCTURE is_data TO <lv_partner>.
      
ASSIGN COMPONENT 'ASSGNM_ID' OF STRUCTURE is_data TO <lv_assignment_id>.
* check whether record with bp number already exists, if not create one
      
READ TABLE ct_data_ext
      
WITH KEY ('PARTNER-HEADER-OBJECT_INSTANCE-BPARTNER') = <lv_partner>
      
ASSIGNING <ls_ecc_ext>.
* should always be provided by BP_Handler
      
IF sy-subrc <> 0.
* create BP record
        
CLEAR ls_ecc_ext.
        ls_ecc_ext
-partner-header-object_instance-bpartner <lv_partner>.
        
READ TABLE gt_ecc_extern_db
        
ASSIGNING <ls_data_ext_db>
        
WITH KEY partner-header-object_instance-bpartner <lv_partner>.
        
IF sy-subrc 0.
          ls_ecc_ext
-partner-header-object_task gc_upd.
        
ELSE.
          ls_ecc_ext
-partner-header-object_task gc_ins.
        
ENDIF.
        
INSERT ls_ecc_ext INTO TABLE ct_data_ext ASSIGNING <ls_ecc_ext>.
      
ENDIF.

* check if vendor record was already mapped
      
READ TABLE <ls_ecc_ext>-vendors
      
WITH KEY assignment_id <lv_assignment_id> ASSIGNING <ls_ecc_ext_suppl>.
* create new supplier entry
      
IF sy-subrc <> 0.
        ls_ecc_ext_suppl
-assignment_id <lv_assignment_id>.
* determine LIFNR (may already exist on DB)
        
READ TABLE gt_ecc_extern_db
        
ASSIGNING <ls_data_ext_db>
        
WITH KEY partner-header-object_instance-bpartner <lv_partner>.
* Partner already exist on DB
        
IF sy-subrc 0.
          
READ TABLE <ls_data_ext_db>-vendors ASSIGNING <ls_vendor_db>
          
WITH KEY assignment_id <lv_assignment_id>.
* supplier already exist on DB
          
IF sy-subrc 0.
* fill suplier ID
            ls_ecc_ext_suppl
-vendor-header-object_instance-lifnr <ls_vendor_db>-vendor-header-object_instance-lifnr.
            ls_ecc_ext_suppl
-vendor-header-object_task gc_upd.
          
ELSE.
* supplier doesn't exist on DB, must be Insert
            ls_ecc_ext_suppl
-vendor-header-object_task gc_ins.
          
ENDIF.
        
ENDIF.
        
INSERT ls_ecc_ext_suppl INTO TABLE <ls_ecc_ext>-vendors ASSIGNING <ls_ecc_ext_suppl>.
      
ENDIF"create new supplier target record
      
GET REFERENCE OF <ls_ecc_ext_suppl> INTO er_data_ext.
    
ENDIF.
  
ENDMETHOD.

 

READ_OBJECT_DATA

  METHOD if_mdg_bs_bp_access_handler~read_object_data.
    
DATAlt_supplier   TYPE cvis_ei_extern_t,
          ls_as_vendor  
TYPE cvis_ei_extern,
          lt_mlt_as     
TYPE mdg_bs_bp_tt_mlt_as,
          lt_mlt_as_old 
TYPE mdg_bs_bp_tt_mlt_as_mem,
          lt_mlt_as_ret 
TYPE mdg_bs_bp_tt_mlt_as_mem,
          ls_mlt_as     
TYPE mdg_bs_bp_s_mlt_as,
          ls_mlt_as_old 
TYPE mdg_bs_bp_s_mlt_as_mem,
          ls_mlt_as_db  
TYPE mdg_bs_bp_s_mlt_as_target,
          lt_return     
TYPE bapiret2_t,
          lv_lifnr      
TYPE lifnr.

    
FIELD-SYMBOLS:
      <ls_cvis_data_db> 
TYPE cvis_ei_extern,
      <ls_supplier>     
TYPE cvis_ei_extern,
      <ls_as_supplier>  
TYPE cvis_ei_extern,
      <ls_mlt_as_db>    
TYPE mdg_bs_bp_s_mlt_as_target.

    
DATAlt_ecc_extern_db TYPE mdg_bs_bp_tt_ecc_extern,
          ls_ecc_extern_db 
TYPE mdg_bs_bp_s_ecc_extern,
          ls_vendor        
TYPE mdg_bs_bp_s_mlt_as_suppl,
          lv_kunnr         
TYPE kunnr.

    
FIELD-SYMBOLS:
      <ls_ecc_extern_db> 
TYPE mdg_bs_bp_s_ecc_extern,
      <ls_mlt_as_old>    
TYPE mdg_bs_bp_s_mlt_as_mem,
      <ls_idlist>        
TYPE bus_ei_instance.

    
DATAlt_zin_t_secret_num TYPE TABLE OF zin_t_secret_num,
          ls_zin_t_secret_num 
LIKE LINE OF lt_zin_t_secret_num,
          ls_secret_number    
TYPE zin_s_secret_number.

    
FIELD-SYMBOLS<ls_extern_db>     LIKE LINE OF gt_ecc_extern_db,
                   <ls_vendor>        
TYPE mdg_bs_bp_s_mlt_as_suppl,
                   <ls_company>       
TYPE LINE OF vmds_ei_company_t,
                   <ls_secret_number> 
TYPE zin_s_secret_number.

** Part for Customer-own tables
    
LOOP AT gt_ecc_extern_db ASSIGNING <ls_extern_db>.
      
LOOP AT <ls_extern_db>-vendors ASSIGNING <ls_vendor>.
        
LOOP AT <ls_vendor>-vendor-company_data-company ASSIGNING <ls_company>.
          
CLEARlt_zin_t_secret_num,
          ls_zin_t_secret_num
.
          
SELECT FROM zin_t_secret_num APPENDING TABLE lt_zin_t_secret_num
                                                          
WHERE bukrs <ls_company>-data_key-bukrs
                                                            
AND lifnr <ls_vendor>-vendor-header-object_instance-lifnr.
          
IF NOT lt_zin_t_secret_num IS INITIAL.
            <ls_company>
-zsecret_number-zcurrent_state 'X'.
          
ENDIF.

          
LOOP AT lt_zin_t_secret_num INTO ls_zin_t_secret_num.
*            APPEND INITIAL LINE TO <ls_company>-zsecret_number-zsecret_number ASSIGNING <ls_secret_number>.
*            <ls_secret_number>-data_key-secret_number = ls_zin_t_secret_num-secret_number.
*            <ls_secret_number>-data-sn_comment = ls_zin_t_secret_num-sn_comment.
            
APPEND VALUE #data_key-secret_number ls_zin_t_secret_num-secret_number
                           
data-sn_comment ls_zin_t_secret_num-sn_comment TO <ls_company>-zsecret_number-zsecret_number.
*            APPEND <ls_secret_number> TO <ls_company>-zsecret_number-zsecret_number.
          
ENDLOOP.
        
ENDLOOP.
      
ENDLOOP.
    
ENDLOOP.
  
ENDMETHOD.

SAVE_ADDITIONAL_OBJECT_DATA

  METHOD if_mdg_bs_bp_access_handler~save_additional_object_data.
    
FIELD-SYMBOLS:
      <lt_data_new> 
TYPE mdg_bs_bp_s_ecc_extern,
      <lt_data_db>  
TYPE mdg_bs_bp_s_ecc_extern,
      <ls_partner>  
TYPE bus_ei_extern,
      <ls_data>     
TYPE zin_t_secret_num,
      <ls_data_db>  
TYPE zin_t_secret_num,
      <ls_company>  
TYPE vmds_ei_company,
      <ls_secret>   
TYPE zin_s_secret_number,
      <lv_vendor>   
TYPE mdg_bs_bp_s_mlt_as_suppl,
      <ls_data_ext> 
TYPE mdg_bs_bp_s_ecc_extern.

    
DATAlt_current_secret  TYPE TABLE OF zin_t_secret_num,
          lt_database_secret 
TYPE TABLE OF zin_t_secret_num,
          ls_current_secret  
TYPE zin_t_secret_num,
          ls_database_secret 
TYPE zin_t_secret_num,
          lt_ins             
TYPE TABLE OF zin_t_secret_num,
          lt_upd             
TYPE TABLE OF zin_t_secret_num,
          lt_del             
TYPE TABLE OF zin_t_secret_num,
          ls_data            
TYPE zin_t_secret_num,
          lr_ecc_extern_db   
TYPE REF TO data.

* Note: IS_DATA_DB does not contain DB state of customer specific data, use GT_ECC_EXTERN_DB forcurrent db state of handler
    
ASSIGN is_data TO <lt_data_new>.
    
ASSIGN COMPONENT 'PARTNER' OF STRUCTURE is_data TO <ls_partner>.
    
CHECK <ls_partner> IS ASSIGNED.
    
READ TABLE gt_ecc_extern_db
    
ASSIGNING <ls_data_ext>
    
WITH KEY partner-header-object_instance-bpartner <ls_partner>-header-object_instance-bpartner.
    
IF <ls_data_ext> IS ASSIGNED.
      
ASSIGN <ls_data_ext> TO <lt_data_db>.
    
ELSE.
      
CREATE DATA lr_ecc_extern_db TYPE mdg_bs_bp_s_ecc_extern.
      
ASSIGN lr_ecc_extern_db->TO <lt_data_db>.
    
ENDIF.
* current data
    
LOOP AT <lt_data_new>-vendors ASSIGNING <lv_vendor>.
      
LOOP AT <lv_vendor>-vendor-company_data-company ASSIGNING <ls_company>.
        
LOOP AT <ls_company>-zsecret_number-zsecret_number ASSIGNING <ls_secret>.
          
CLEARls_data.
          
ASSERT NOT <lv_vendor>-vendor-header-object_instance-lifnr IS INITIAL.
          ls_data
-lifnr <lv_vendor>-vendor-header-object_instance-lifnr.
          ls_data
-bukrs <ls_company>-data_key-bukrs.
          ls_data
-secret_number <ls_secret>-data_key-secret_number.
          ls_data
-sn_comment <ls_secret>-data-sn_comment.
          
CASE <ls_secret>-task.
            
WHEN gc_del.
              
APPEND ls_data TO lt_del.
            
WHEN gc_ins.
              
APPEND ls_data TO lt_ins.
            
WHEN gc_upd.
              
APPEND ls_data TO lt_upd.
          
ENDCASE.
        
ENDLOOP.
      
ENDLOOP.
    
ENDLOOP.

* database data
    
LOOP AT <lt_data_db>-vendors ASSIGNING <lv_vendor>.
      
LOOP AT <lv_vendor>-vendor-company_data-company ASSIGNING <ls_company>.
        
LOOP AT <ls_company>-zsecret_number-zsecret_number ASSIGNING <ls_secret>.
          
ASSERT NOT <lv_vendor>-vendor-header-object_instance-lifnr IS INITIAL.
          ls_database_secret
-lifnr <lv_vendor>-vendor-header-object_instance-lifnr.
          ls_database_secret
-bukrs <ls_company>-data_key-bukrs.
          ls_database_secret
-secret_number <ls_secret>-data_key-secret_number.
          ls_database_secret
-sn_comment <ls_secret>-data-sn_comment.
          
APPEND ls_database_secret TO lt_database_secret.
        
ENDLOOP.
      
ENDLOOP.
    
ENDLOOP.

    lt_current_secret 
lt_database_secret.
* merge
* Deletes
    
LOOP AT lt_del ASSIGNING <ls_data>.
      
READ TABLE lt_current_secret WITH KEY bukrs <ls_data>-bukrs
                                            lifnr 
<ls_data>-lifnr
                                            secret_number 
<ls_data>-secret_number
                                            
ASSIGNING <ls_data_db>.
      
IF sy-subrc 0.
* delete record in target table
        
DELETE lt_current_secret INDEX sy-tabix.
      
ELSE.
* record doesn't exist on DB -> must be a new one, keep data to be checked consistent
        
READ TABLE lt_ins WITH KEY bukrs <ls_data>-bukrs
                                   lifnr 
<ls_data>-lifnr
                                   secret_number 
<ls_data>-secret_number ASSIGNING <ls_data_db>.
        
IF sy-subrc 0.
          
DELETE lt_current_secret INDEX sy-tabix.
        
ENDIF.
      
ENDIF.
    
ENDLOOP.

* Inserts
    
LOOP AT lt_ins ASSIGNING <ls_data>.
      
READ TABLE lt_current_secret WITH KEY bukrs <ls_data>-bukrs
                                            lifnr 
<ls_data>-lifnr
                                            secret_number 
<ls_data>-secret_number
      
ASSIGNING <ls_data_db>.
* insert record into target table
      
IF sy-subrc NE 0.
        
INSERT <ls_data> INTO TABLE lt_current_secret.
      
ENDIF.
    
ENDLOOP.

* Updates
    
LOOP AT lt_upd ASSIGNING <ls_data>.
      
READ TABLE lt_current_secret WITH KEY bukrs <ls_data>-bukrs
                                            lifnr 
<ls_data>-lifnr
                                            secret_number 
<ls_data>-secret_number
                                            
ASSIGNING <ls_data_db>.
* insert record into target table
      
IF sy-subrc 0.
        <ls_data_db> 
<ls_data>.
      
ENDIF.
    
ENDLOOP.

    
CALL FUNCTION 'ZIN_FM_SECRET_NUMBER_UPDATES' IN UPDATE TASK
      
TABLES
        x_secret_numbers 
lt_current_secret
        y_secret_numbers 
lt_database_secret.

  
ENDMETHOD.

SORT_ENTITIES

  METHOD if_mdg_bs_bp_access_handler~sort_entities.
    
DATAlt_entity TYPE TABLE OF ty_usmd_entity,
          lv_entity 
TYPE ty_usmd_entity.

    lt_entity 
it_entities_all.

    
READ TABLE lt_entity WITH KEY entity 'ZSECRET_N' INTO lv_entity.
    
IF sy-subrc 0.
      
APPEND lv_entity TO ct_entities.
    
ENDIF.

  
ENDMETHOD
.

Note: You can customize code as per your requirement.

Extend Genil Model

  • Open t-code GENIL_MODEL_BROWSER.
  • Create enhancement




METHOD transform_to_entity_key.

*** This method transforms a GenIL object ID into its entity key.
*** It requires the correct key structure in the chancing parameter.
    
DATA:
      lr_genil_key 
TYPE REF TO data,
      lv_structure 
TYPE string.

    
FIELD-SYMBOLS:
      <ls_genil_key> 
TYPE key,
      <lv_bp_id>     
TYPE any,
      <lv_bp_guid>   
TYPE any.
* limit handling to supplier objects
    
CASE iv_object_name.
      
WHEN 'ZBS_SP_SECRET_NUMBERS'.
* get GenIL key
        
TRY.
            lv_structure 
me->object_model->get_key_struct_nameiv_object_name iv_object_name ).
          
CATCH cx_crm_unsupported_object.
            
RETURN
            
.ENDTRY.
        
CREATE DATA lr_genil_key TYPE (lv_structure).
        
ASSIGN lr_genil_key->TO <ls_genil_key>.
        me
->transform_to_object_key(
        
EXPORTING
        iv_object_name 
iv_object_name
        iv_object_id 
iv_object_id
        
IMPORTING
        es_object_key 
<ls_genil_key> ).
* map to entity key
        me
->mo_typecasting->map(
        
EXPORTING
        is_source_structure 
<ls_genil_key>
        
CHANGING
        cs_target_structure 
cs_entity_key ).
* BP ID requires special logic
        
ASSIGN COMPONENT 'BP_HEADER' OF STRUCTURE cs_entity_key TO <lv_bp_id>.
        
ASSIGN COMPONENT 'BP_GUID' OF STRUCTURE <ls_genil_key> TO <lv_bp_guid>.
        
CHECK <lv_bp_id> IS ASSIGNED AND <lv_bp_guid> IS ASSIGNED.
        <lv_bp_id> 
me->get_bp_idiv_bp_guid <lv_bp_guid> ).
      
WHEN OTHERS.
* call parent

        
CALL METHOD super->transform_to_entity_key
          
EXPORTING
            iv_object_name 
iv_object_name
            iv_object_id   
iv_object_id
          
CHANGING
            cs_entity_key  
cs_entity_key.
       
ENDCASE.
      
ENDMETHOD.

 

  METHOD if_genil_appl_dyn_meta_info~is_child_create_allowed.
*** This method controls if the creation of a supplier dependend object is allowed or not
* delegate to parent first
    super
->if_genil_appl_dyn_meta_info~is_child_create_allowed(
      
EXPORTING
        iv_relation_name     
iv_relation_name                 " Relation Name
        iv_relation_filter   
iv_relation_filter                 " Relation Filter Interface
        iv_child_name        
iv_child_name                 " External Name of Object
      
CHANGING
        cv_parent_and_result 
cv_parent_and_result                 " Object Instance with Boolean Result
    
).

    
CASE iv_child_name.
      
WHEN 'ZBS_SP_SECRET_NUMBERS'.
        cv_parent_and_result
-success abap_true"It's always allowed
      
WHEN OTHERS.

    
ENDCASE.
  
ENDMETHOD.

  • Create new dependant object.

  • Create new relation with Company code object

  • Connect Data model with Genil model
  • tcode SM34



Extending UI

  • Open any supplier from the Manage Supplier Governance Fiori App.
  • Go to the company code data level where we need to add our UIBB.
  • Go to the technical settings and open the application configuration.
  • Create new enhancements.

  • Add one UIBB







Comments

Popular posts from this blog

SAP MDG Data Modelling

SAP Customer/Vendor Integration (CVI)