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.
Extension of S4 API Structures
- 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’.
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
Below methods we have
created newly
READ_VENDOR_BY_LIFNR
READ_VENDOR
MAP_BP_ZSECRET_N_2API
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 = 1 ).
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 = 1 ).
IF sy-subrc = 0 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.
CLEAR: ls_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 = 1 ).
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.
DATA: lv_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.
DATA: lr_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.
DATA: lo_line TYPE REF TO data.
SELECT SINGLE * FROM zin_t_secret_num INTO @DATA(ls_secret_num) WHERE 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.
DATA: ls_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.
DATA: ls_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.
DATA: lt_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.
DATA: lt_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.
DATA: lt_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>.
CLEAR: lt_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.
DATA: lt_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>.
CLEAR: ls_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.
DATA: lt_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
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_name( iv_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_id( iv_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.
*** 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
Comments
Post a Comment