Technical Articles
Automatic Creation and Submission of Change Request for Customer
Purpose:
We had a requirement automatically create and submit change request for CUSTOMER and monitor based on CUSTOMER TYPE Rules where the data is received from third party system i.e.,CRM system through a middle ware system.
In the below example it is shown that to create a CUSTOMER Change Request and Submit for review & approvals. Also, create a change request for existing CUSTOMER along with submit Review and approval.
Similar example can be used for any other Auto creation of Change request for Material or Business Partner or Supplier & Submit Change Request.
Basic Content to Know on API:
Master Data Governance (MDG)
Application Programming Interface (API)
The MDG framework several interfaces that are used by the delivered SAP MDG applications and also can be used by other external applications (like customer applications) in order to handle the governance process and the related entity data.
The detail information of API has been shared in the below link
Below are the API with their Purpose in a tabular format to understand easily
API | Interface | Implementation Class |
Change Request API | IF_USMD_CRREQUEST_API | CL_USMD_CRREQUEST_API |
External Mode API | IF_USMD_MODEL_EXT | CL_USMD_MODEL_EXT |
Governance API | IF_USMD_GOV_API | CL_USMD_GOV_API |
Convenience API | IF_USMD_CONV_SOM_GOV_API | CL_USMD_CONV_SOM_GOV_API |
Context API | IF_USMD_APP_CONTEXT | CL_USMD_APP_CONTEXT |
API | Main Purpose |
Change Request API | Handling of change request and partly changing and reading entity |
External Mode API | Reading Entity Data |
Governance API | Handling of several change request and entity data |
Convenience API | As Governance API but using single change request |
Context API | Store and provide context data |
An RFC has been created to fulfill the requirement and send the data back to CRM on successful creation of Change Request or to send reason of failure like any missing data.
Below Code is used to create a Governance API and also create Change request ID
“ Create an instance of the governance API
IF go_mdg_conv IS NOT BOUND.
TRY .
go_mdg_conv = cl_usmd_conv_som_gov_api=>get_instance(
iv_model_name = 'BP'
).
CATCH cx_usmd_conv_som_gov_api INTO go_som_gov_api_error. "
et_messages = go_som_gov_api_error->mt_messages.
CATCH cx_usmd_app_context_cons_error INTO go_cons_error. "
ls_message = go_cons_error->e_message.
APPEND ls_message TO et_messages.
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
*--Create a new change request using change request type
TRY.
go_mdg_conv->set_environment(
EXPORTING
iv_crequest_type = im_changereq_type "'CUST1P2'
iv_create_crequest = abap_true
).
CATCH cx_usmd_conv_som_gov_api INTO go_som_gov_api_error. "
et_messages = go_som_gov_api_error->mt_messages.
RETURN.
ENDTRY.
ev_crequest_id = go_mdg_conv->get_crequest_id( ).
****------- Create Temp key for address " Create Customer
TRY.
go_mdg_conv->create_entity_tmp_key(
EXPORTING
* iv_lock = ABAP_TRUE
iv_entity = 'ADDRNO'
IMPORTING
es_key = ev_temp_key_bp_addr
).
CATCH cx_usmd_conv_som_gov_api INTO go_som_gov_api_error. "
et_messages = go_som_gov_api_error->mt_messages.
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
TRY.
go_mdg_conv->create_entity_tmp_key(
EXPORTING
* iv_lock = ABAP_TRUE
iv_entity = 'BP_HEADER' "'BP_REL'
IMPORTING
es_key = ev_temp_key_bp
).
CATCH cx_usmd_conv_som_gov_api INTO go_som_gov_api_error. "
et_messages = go_som_gov_api_error->mt_messages.
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
Below logic is used to generate UI screen for Change Request ID created using this above logic
TRY.
lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ).
CATCH cx_uuid_error INTO lo_error.
CLEAR lv_uuid_16.
ENDTRY.
Below Logic is used to fill the required Entity Data to create a Customer with reference to data received from data from CRM system.
*Create all the data references needed to maintain the Entity
"Create a data reference of the key structure / table of entity
*--------------------------------------------------------------------*
* 'BP_HEADER'
*--------------------------------------------------------------------*
* FIELD-SYMBOLS : "<fs_bp_header> TYPE /mdgbp/_s_bp_pp_bp_header,
* <lt_anydata_bp_header> TYPE ANY TABLE.
DATA: lv_uuid_16 TYPE sysuuid_x16.
DATA lo_error TYPE REF TO cx_root.
DATA :et_entity_data TYPE usmd_gov_api_ts_ent_data,
et_entity_keys TYPE usmd_gov_api_ts_ent_tabl.
DATA go_core_error TYPE REF TO cx_usmd_gov_api_core_error .
DATA lo_ent_error TYPE REF TO cx_usmd_gov_api_entity_write.
TRY .
go_mdg_conv->get_entity_structure(
EXPORTING
iv_entity_name = 'BP_HEADER'
iv_struct_type = go_mdg_conv->gc_struct_key_attr
* iv_edition = ABAP_FALSE
IMPORTING
er_structure = l_s_entity
er_table = l_t_entity
).
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
ASSIGN l_s_entity->* TO <fs_bp_header>.
ASSIGN l_t_entity->* TO <lt_anydata_bp_header>.
TRY.
lv_uuid_16 = cl_system_uuid=>create_uuid_x16_static( ).
CATCH cx_uuid_error INTO lo_error.
CLEAR lv_uuid_16.
ENDTRY.
<fs_bp_header>-bp_header = ev_temp_key_bp.
<fs_bp_header>-bp_guid = lv_uuid_16.
<fs_bp_header>-bu_group = lv_bu_group.
<fs_bp_header>-bu_type = 2.
INSERT <fs_bp_header> INTO TABLE <lt_anydata_bp_header>.
CLEAR : lw_entity_keys,lt_entity_keys_lock.
lw_entity_keys-entity = 'BP_HEADER'.
lw_entity_keys-tabl = l_t_entity.
INSERT lw_entity_keys INTO TABLE lt_entity_keys.
INSERT lw_entity_keys INTO TABLE lt_entity_keys_lock.
CLEAR lw_entity_data.
lw_entity_data-entity = 'BP_HEADER'.
lw_entity_data-entity_data = l_t_entity.
INSERT lw_entity_data INTO TABLE et_entity_data.
*-----Before making changes to an object, the object needs to be Enqueued even if this is a creation scenario------*
TRY.
go_mdg_conv->enqueue_entity (
EXPORTING
it_entity_keys = lt_entity_keys_lock ).
CATCH cx_usmd_conv_som_gov_api INTO go_som_gov_api_error. "
et_messages = go_som_gov_api_error->mt_messages.
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
*--------------------------------------------------------------------*
* ADDRNO
*--------------------------------------------------------------------*
FIELD-SYMBOLS : <fs_addrno> TYPE /mdgbp/_s_bp_ky_addrno,
<lt_anydata_addrno> TYPE ANY TABLE.
CLEAR: l_s_entity, l_t_entity.
TRY .
go_mdg_conv->get_entity_structure(
EXPORTING
iv_entity_name = 'ADDRNO'
iv_struct_type = go_mdg_conv->gc_struct_key_attr
* iv_edition = ABAP_FALSE
IMPORTING
er_structure = l_s_entity
er_table = l_t_entity
).
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
ASSIGN l_s_entity->* TO <fs_addrno>.
ASSIGN l_t_entity->* TO <lt_anydata_addrno>.
<fs_addrno>-addrno = ev_temp_key_bp_addr.
INSERT <fs_addrno> INTO TABLE <lt_anydata_addrno>.
CLEAR lw_entity_data.
lw_entity_data-entity = 'ADDRNO'.
lw_entity_data-entity_data = l_t_entity.
INSERT lw_entity_data INTO TABLE et_entity_data.
CLEAR : lw_entity_keys,lt_entity_keys_lock.
lw_entity_keys-entity = 'ADDRNO'.
lw_entity_keys-tabl = l_t_entity.
INSERT lw_entity_keys INTO TABLE lt_entity_keys.
INSERT lw_entity_keys INTO TABLE lt_entity_keys_lock.
*lock the entity
TRY.
go_mdg_conv->enqueue_entity(
EXPORTING
it_entity_keys = lt_entity_keys_lock
* iv_lock_mode = 'E'
).
CATCH cx_usmd_conv_som_gov_api INTO go_som_gov_api_error. "
et_messages = go_som_gov_api_error->mt_messages.
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
*------*Write the entity data to the change request------*
TRY.
go_mdg_conv->write_entity_data(it_entity_data = et_entity_data ).
CLEAR et_entity_data.
CATCH cx_usmd_gov_api_core_error INTO go_core_error.
et_messages = go_core_error->mt_messages.
CATCH cx_usmd_gov_api_entity_write INTO lo_ent_error.
et_messages = lo_ent_error->mt_messages.
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages. "
ENDTRY.
*--------------------------------------------------------------------*
* BP_ROLE
*--------------------------------------------------------------------*
* FIELD-SYMBOLS : <fs_bp_role> TYPE /mdgbp/_s_bp_pp_bp_role,
* <lt_anydata_bp_role> TYPE ANY TABLE.
CLEAR: l_s_entity, l_t_entity.
TRY .
go_mdg_conv->get_entity_structure(
EXPORTING
iv_entity_name = 'BP_ROLE'
iv_struct_type = go_mdg_conv->gc_struct_key_attr
* iv_edition = ABAP_FALSE
IMPORTING
er_structure = l_s_entity
er_table = l_t_entity
).
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
ASSIGN l_s_entity->* TO <fs_bp_role>.
ASSIGN l_t_entity->* TO <lt_anydata_bp_role>.
<fs_bp_role>-bp_header = ev_temp_key_bp.
<fs_bp_role>-bp_rol_id = 'FLCU01'.
INSERT <fs_bp_role> INTO TABLE <lt_anydata_bp_role>.
CLEAR lw_entity_keys.
lw_entity_keys-entity = 'BP_ROLE'.
lw_entity_keys-tabl = l_t_entity.
INSERT lw_entity_keys INTO TABLE lt_entity_keys.
CLEAR lw_entity_data.
lw_entity_data-entity = 'BP_ROLE'.
lw_entity_data-entity_data = l_t_entity.
INSERT lw_entity_data INTO TABLE et_entity_data.
ENDIF.
*--------------------------------------------------------------------*
* 'ADDRESS'
*--------------------------------------------------------------------*
* FIELD-SYMBOLS: <fs_address> TYPE /mdgbp/_s_bp_pp_address,
* <lt_anydata_address> TYPE ANY TABLE.
CLEAR: l_s_entity, l_t_entity.
TRY .
go_mdg_conv->get_entity_structure(
EXPORTING
iv_entity_name = 'ADDRESS'
iv_struct_type = go_mdg_conv->gc_struct_key_attr
* iv_edition = ABAP_FALSE
IMPORTING
er_structure = l_s_entity
er_table = l_t_entity
).
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
ASSIGN l_s_entity->* TO <fs_address>.
ASSIGN l_t_entity->* TO <lt_anydata_address>.
<fs_address>-addrno = ev_temp_key_bp_addr.
<fs_address>-bp_header = ev_temp_key_bp.
<fs_address>-type = 1.
INSERT <fs_address> INTO TABLE <lt_anydata_address>.
CLEAR lw_entity_data.
lw_entity_data-entity = 'ADDRESS'.
lw_entity_data-entity_data = l_t_entity.
* Lw_entity_data-entity_attributes = .
INSERT lw_entity_data INTO TABLE et_entity_data.
CLEAR lw_entity_keys.
lw_entity_keys-entity = 'ADDRESS'.
lw_entity_keys-tabl = l_t_entity.
INSERT lw_entity_keys INTO TABLE lt_entity_keys.
*--------------------------------------------------------------------*
* 'BP_CENTRL'
*--------------------------------------------------------------------*
* FIELD-SYMBOLS :
* <fs_bp_centrl> TYPE /mdgbp/_s_bp_pp_bp_centrl,
* <fs_bp_cusgen> TYPE /mdgbpx/_s_bp_pp_bp_cusgen,
* <fs_bp_cus_cc> TYPE /mdgbpx/_s_bp_pp_bp_cus_cc,
* <fs_bp_mlt_as> TYPE /mdgbpx/_s_bp_pp_bp_mlt_as,
* <lt_anydata_centrl> TYPE ANY TABLE.
CLEAR: l_s_entity, l_t_entity.
TRY .
go_mdg_conv->get_entity_structure(
EXPORTING
iv_entity_name = 'BP_CENTRL'
iv_struct_type = go_mdg_conv->gc_struct_key_attr
* iv_edition = ABAP_FALSE
IMPORTING
er_structure = l_s_entity
er_table = l_t_entity
).
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
ASSIGN l_s_entity->* TO <fs_bp_centrl>.
ASSIGN l_t_entity->* TO <lt_anydata_centrl>.
<fs_bp_centrl>-bp_header = ev_temp_key_bp.
<fs_bp_centrl>-name_org1 = is_bpcentral-name_org1. "'WG Tech'.
<fs_bp_centrl>-name_org2 = is_bpcentral-name_org2. "'WG Tech'.
<fs_bp_centrl>-bu_sort1 = is_bpcentral-bu_sort1. "'WG'.
INSERT <fs_bp_centrl> INTO TABLE <lt_anydata_centrl>.
CLEAR lw_entity_data.
lw_entity_data-entity = 'BP_CENTRL'.
lw_entity_data-entity_data = l_t_entity.
INSERT lw_entity_data INTO TABLE et_entity_data.
***Create Key struct
CLEAR lw_entity_keys.
lw_entity_keys-entity = 'BP_CENTRL'.
lw_entity_keys-tabl = l_t_entity.
INSERT lw_entity_keys INTO TABLE lt_entity_keys.
*--------------------------------------------------------------------*
* 'AD_TEL'
*--------------------------------------------------------------------*
IF is_adtel-t_number IS NOT INITIAL.
CLEAR: l_s_entity, l_t_entity.
TRY .
go_mdg_conv->get_entity_structure(
EXPORTING
iv_entity_name = 'AD_TEL'
iv_struct_type = go_mdg_conv->gc_struct_key_attr
* iv_edition = ABAP_FALSE
IMPORTING
er_structure = l_s_entity
er_table = l_t_entity
).
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
ASSIGN l_s_entity->* TO <fs_ad_tel>.
ASSIGN l_t_entity->* TO <lt_anydata_ad_tel>.
<fs_ad_tel>-addrno = ev_temp_key_bp_addr.
<fs_ad_tel>-bp_header = ev_temp_key_bp.
<fs_ad_tel>-t_number = is_adtel-t_number.
INSERT <fs_ad_tel> INTO TABLE <lt_anydata_ad_tel>.
CLEAR lw_entity_data.
lw_entity_data-entity = 'AD_TEL'.
lw_entity_data-entity_data = l_t_entity.
* Lw_entity_data-entity_attributes = .
INSERT lw_entity_data INTO TABLE et_entity_data.
CLEAR lw_entity_keys.
lw_entity_keys-entity = 'AD_TEL'.
lw_entity_keys-tabl = l_t_entity.
INSERT lw_entity_keys INTO TABLE lt_entity_keys.
ENDIF.
*--------------------------------------------------------------------*
* 'AD_FAX'
*--------------------------------------------------------------------*
IF is_adfax-f_number IS NOT INITIAL.
CLEAR: l_s_entity, l_t_entity.
TRY .
go_mdg_conv->get_entity_structure(
EXPORTING
iv_entity_name = 'AD_FAX'
iv_struct_type = go_mdg_conv->gc_struct_key_attr
* iv_edition = ABAP_FALSE
IMPORTING
er_structure = l_s_entity
er_table = l_t_entity
).
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
ASSIGN l_s_entity->* TO <fs_ad_fax>.
ASSIGN l_t_entity->* TO <lt_anydata_ad_fax>.
<fs_ad_fax>-addrno = ev_temp_key_bp_addr.
<fs_ad_fax>-bp_header = ev_temp_key_bp.
<fs_ad_fax>-f_number = is_adfax-f_number.
INSERT <fs_ad_fax> INTO TABLE <lt_anydata_ad_fax>.
CLEAR lw_entity_data.
lw_entity_data-entity = 'AD_FAX'.
lw_entity_data-entity_data = l_t_entity.
* Lw_entity_data-entity_attributes = .
INSERT lw_entity_data INTO TABLE et_entity_data.
CLEAR lw_entity_keys.
lw_entity_keys-entity = 'AD_FAX'.
lw_entity_keys-tabl = l_t_entity.
INSERT lw_entity_keys INTO TABLE lt_entity_keys.
ENDIF.
**--------------------------------------------------------------------*
** 'BP_ADDR'
**--------------------------------------------------------------------*
FIELD-SYMBOLS: <fs_bp_addr> TYPE /mdgbp/_s_bp_pp_bp_addr,
<lt_anydata_bp_addr> TYPE ANY TABLE.
CLEAR: l_s_entity, l_t_entity.
TRY .
go_mdg_conv->get_entity_structure(
EXPORTING
iv_entity_name = 'BP_ADDR'
iv_struct_type = go_mdg_conv->gc_struct_key_attr
* iv_edition = ABAP_FALSE
IMPORTING
er_structure = l_s_entity
er_table = l_t_entity
).
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
ASSIGN l_s_entity->* TO <fs_bp_addr>.
ASSIGN l_t_entity->* TO <lt_anydata_bp_addr>.
<fs_bp_addr>-addrno = ev_temp_key_bp_addr.
<fs_bp_addr>-bp_header = ev_temp_key_bp.
INSERT <fs_bp_addr> INTO TABLE <lt_anydata_bp_addr>.
CLEAR lw_entity_data.
lw_entity_data-entity = 'BP_ADDR'.
lw_entity_data-entity_data = l_t_entity.
* Lw_entity_data-entity_attributes = .
INSERT lw_entity_data INTO TABLE et_entity_data.
CLEAR lw_entity_keys.
lw_entity_keys-entity = 'BP_ADDR'.
lw_entity_keys-tabl = l_t_entity.
INSERT lw_entity_keys INTO TABLE lt_entity_keys.
*--------------------------------------------------------------------*
* 'AD_POSTAL'
*--------------------------------------------------------------------*
* FIELD-SYMBOLS: <fs_ad_postal> TYPE /mdgbp/_s_bp_pp_ad_postal,
* <lt_anydata_postal> TYPE ANY TABLE.
CLEAR: l_s_entity, l_t_entity.
TRY .
go_mdg_conv->get_entity_structure(
EXPORTING
iv_entity_name = 'AD_POSTAL'
iv_struct_type = go_mdg_conv->gc_struct_key_attr
* iv_edition = ABAP_FALSE
IMPORTING
er_structure = l_s_entity
er_table = l_t_entity
).
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
ASSIGN l_s_entity->* TO <fs_ad_postal>.
ASSIGN l_t_entity->* TO <lt_anydata_postal>.
ASSIGN COMPONENT 'ADDRNO' OF STRUCTURE <fs_ad_postal>
TO FIELD-SYMBOL(<lfv_field_val>).
IF sy-subrc EQ 0.
<lfv_field_val> = ev_temp_key_bp_addr.
ENDIF.
ASSIGN COMPONENT 'BP_HEADER' OF STRUCTURE <fs_ad_postal>
TO <lfv_field_val>.
IF sy-subrc EQ 0.
<lfv_field_val> = ev_temp_key_bp.
ENDIF.
ASSIGN COMPONENT 'STREET' OF STRUCTURE <fs_ad_postal>
TO <lfv_field_val>.
IF sy-subrc EQ 0.
<lfv_field_val> = is_address-street.
ENDIF.
ASSIGN COMPONENT 'DISTRICT' OF STRUCTURE <fs_ad_postal>
TO <lfv_field_val>.
IF sy-subrc EQ 0.
<lfv_field_val> = is_address-district.
ENDIF.
ASSIGN COMPONENT 'DEFLTCOMM' OF STRUCTURE <fs_ad_postal>
TO <lfv_field_val>.
IF sy-subrc EQ 0.
<lfv_field_val> = is_address-defltcomm.
ENDIF.
ASSIGN COMPONENT 'RFE_POSTL' OF STRUCTURE <fs_ad_postal>
TO <lfv_field_val>.
IF sy-subrc EQ 0.
<lfv_field_val> = is_address-rfe_postl..
ENDIF.
ASSIGN COMPONENT 'CITY1' OF STRUCTURE <fs_ad_postal>
TO <lfv_field_val>.
IF sy-subrc EQ 0.
<lfv_field_val> = is_address-city1.
ENDIF.
ASSIGN COMPONENT 'REF_POSTA' OF STRUCTURE <fs_ad_postal>
TO <lfv_field_val>.
IF sy-subrc EQ 0.
<lfv_field_val> = lv_country_key.
ENDIF.
ASSIGN COMPONENT 'POBOX_CTY' OF STRUCTURE <fs_ad_postal>
TO <lfv_field_val>.
IF sy-subrc EQ 0.
<lfv_field_val> = lv_country_key.
ENDIF.
ASSIGN COMPONENT 'RFE_POST' OF STRUCTURE <fs_ad_postal>
TO <lfv_field_val>.
IF sy-subrc EQ 0.
<lfv_field_val> = lv_region.
ENDIF.
ASSIGN COMPONENT 'RFE_POSTL' OF STRUCTURE <fs_ad_postal>
TO <lfv_field_val>.
IF sy-subrc EQ 0.
<lfv_field_val> = is_address-rfe_postl.
ENDIF.
ASSIGN COMPONENT 'POST_COD1' OF STRUCTURE <fs_ad_postal>
TO <lfv_field_val>.
IF sy-subrc EQ 0.
<lfv_field_val> = is_address-post_cod1.
ENDIF.
ASSIGN COMPONENT 'POST_COD2' OF STRUCTURE <fs_ad_postal>
TO <lfv_field_val>.
IF sy-subrc EQ 0.
<lfv_field_val> = is_address-post_cod1.
ENDIF.
ASSIGN COMPONENT 'PO_BOX' OF STRUCTURE <fs_ad_postal>
TO <lfv_field_val>.
IF sy-subrc EQ 0.
<lfv_field_val> = is_address-po_box.
ENDIF.
ASSIGN COMPONENT 'LANGU_COM' OF STRUCTURE <fs_ad_postal>
TO <lfv_field_val>.
IF sy-subrc EQ 0.
IF is_bucusgen-cus_langu IS NOT INITIAL.
<lfv_field_val> = lv_langu.
ELSE.
<lfv_field_val> = 'EN'.
ENDIF.
ENDIF.
INSERT <fs_ad_postal> INTO TABLE <lt_anydata_postal>.
CLEAR lw_entity_data.
lw_entity_data-entity = 'AD_POSTAL'.
lw_entity_data-entity_data = l_t_entity.
INSERT lw_entity_data INTO TABLE et_entity_data.
CLEAR lw_entity_keys.
lw_entity_keys-entity = 'AD_POSTAL'.
lw_entity_keys-tabl = l_t_entity.
INSERT lw_entity_keys INTO TABLE lt_entity_keys.
*--------------------------------------------------------------------*
* 'BP_CUS_CC'
*--------------------------------------------------------------------*
IF is_bpcuscc-company IS NOT INITIAL.
CLEAR: l_s_entity, l_t_entity.
TRY .
go_mdg_conv->get_entity_structure(
EXPORTING
iv_entity_name = 'BP_CUS_CC'
iv_struct_type = go_mdg_conv->gc_struct_key_attr
* iv_edition = ABAP_FALSE
IMPORTING
er_structure = l_s_entity
er_table = l_t_entity
).
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
ASSIGN l_s_entity->* TO <fs_bp_cus_cc>.
ASSIGN l_t_entity->* TO <lt_anydata_bp_cus_cc>.
<fs_bp_cus_cc>-bp_header = ev_temp_key_bp.
<fs_bp_cus_cc>-assgnm_id = '0000000002'.
<fs_bp_cus_cc>-company = is_bpcuscc-company.
INSERT <fs_bp_cus_cc> INTO TABLE <lt_anydata_bp_cus_cc>.
CLEAR lw_entity_data.
lw_entity_data-entity = 'BP_CUS_CC'.
lw_entity_data-entity_data = l_t_entity.
INSERT lw_entity_data INTO TABLE et_entity_data.
CLEAR lw_entity_keys.
lw_entity_keys-entity = 'BP_CUS_CC'.
lw_entity_keys-tabl = l_t_entity.
INSERT lw_entity_keys INTO TABLE lt_entity_keys.
ENDIF.
*--------------------------------------------------------------------*
* 'BP_SALES'
*--------------------------------------------------------------------*
IF is_bpsales-vkorg IS NOT INITIAL.
CLEAR: l_s_entity, l_t_entity.
TRY .
go_mdg_conv->get_entity_structure(
EXPORTING
iv_entity_name = 'BP_SALES'
iv_struct_type = go_mdg_conv->gc_struct_key_attr
* iv_edition = ABAP_FALSE
IMPORTING
er_structure = l_s_entity
er_table = l_t_entity
).
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
ASSIGN l_s_entity->* TO <fs_bp_sales>.
ASSIGN l_t_entity->* TO <lt_anydata_bp_sales>.
<fs_bp_sales>-bp_header = ev_temp_key_bp.
<fs_bp_sales>-vkorg = is_bpsales-vkorg.
<fs_bp_sales>-csd_zterm = is_bpsales-csd_zterm.
<fs_bp_sales>-csd_waers = is_bpsales-csd_waers.
<fs_bp_sales>-csd_vsbed = is_bpsales-csd_vsbed.
INSERT <fs_bp_sales> INTO TABLE <lt_anydata_bp_sales>.
CLEAR lw_entity_data.
lw_entity_data-entity = 'BP_SALES'.
lw_entity_data-entity_data = l_t_entity.
INSERT lw_entity_data INTO TABLE et_entity_data.
CLEAR lw_entity_keys.
lw_entity_keys-entity = 'BP_SALES'.
lw_entity_keys-tabl = l_t_entity.
INSERT lw_entity_keys INTO TABLE lt_entity_keys.
ENDIF.
*--------------------------------------------------------------------*
* 'BP_ADDUSG'
*--------------------------------------------------------------------*
* FIELD-SYMBOLS: <fs_bp_addusg> TYPE /mdgbp/_s_bp_pp_bp_addusg,
* <lt_anydata_bp_addusg> TYPE ANY TABLE.
CLEAR: l_s_entity, l_t_entity.
TRY .
go_mdg_conv->get_entity_structure(
EXPORTING
iv_entity_name = 'BP_ADDUSG'
iv_struct_type = go_mdg_conv->gc_struct_key_attr
* iv_edition = ABAP_FALSE
IMPORTING
er_structure = l_s_entity
er_table = l_t_entity
).
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
ASSIGN l_s_entity->* TO <fs_bp_addusg>.
ASSIGN l_t_entity->* TO <lt_anydata_bp_addusg>.
<fs_bp_addusg>-addrno = ev_temp_key_bp_addr.
<fs_bp_addusg>-bp_header = ev_temp_key_bp.
<fs_bp_addusg>-bp_adrknd = 'XXDEFAULT'.
<fs_bp_addusg>-xdfadu = abap_true.
INSERT <fs_bp_addusg> INTO TABLE <lt_anydata_bp_addusg>.
CLEAR lw_entity_data.
lw_entity_data-entity = 'BP_ADDUSG'.
lw_entity_data-entity_data = l_t_entity.
INSERT lw_entity_data INTO TABLE et_entity_data.
CLEAR lw_entity_keys.
lw_entity_keys-entity = 'BP_ADDUSG'.
lw_entity_keys-tabl = l_t_entity.
INSERT lw_entity_keys INTO TABLE lt_entity_keys.
*--------------------------------------------------------------------*
* 'BP_MLT_AS'
*--------------------------------------------------------------------*
* FIELD-SYMBOLS :
* <lt_anydata_bp_mlt_as> TYPE ANY TABLE.
CLEAR: l_s_entity, l_t_entity.
TRY .
go_mdg_conv->get_entity_structure(
EXPORTING
iv_entity_name = 'BP_MLT_AS'
iv_struct_type = go_mdg_conv->gc_struct_key_attr
* iv_edition = ABAP_FALSE
IMPORTING
er_structure = l_s_entity
er_table = l_t_entity
).
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
ASSIGN l_s_entity->* TO <fs_bp_mlt_as>.
ASSIGN l_t_entity->* TO <lt_anydata_bp_mlt_as>.
IF <lt_anydata_bp_mlt_as> IS INITIAL.
<fs_bp_mlt_as>-bp_header = ev_temp_key_bp.
<fs_bp_mlt_as>-as_type = 'CUST'.
<fs_bp_mlt_as>-assgnm_id = '0000000002'.
<fs_bp_mlt_as>-object_id = ev_temp_key_bp.
<fs_bp_mlt_as>-standard = abap_true.
INSERT <fs_bp_mlt_as> INTO TABLE <lt_anydata_bp_mlt_as>.
ENDIF.
CLEAR lw_entity_data.
lw_entity_data-entity = 'BP_MLT_AS'.
lw_entity_data-entity_data = l_t_entity.
INSERT lw_entity_data INTO TABLE et_entity_data.
CLEAR lw_entity_keys.
lw_entity_keys-entity = 'BP_MLT_AS'.
lw_entity_keys-tabl = l_t_entity.
INSERT lw_entity_keys INTO TABLE lt_entity_keys.
*--------------------------------------------------------------------*
* 'BP_CUSGEN'
*--------------------------------------------------------------------*
* FIELD-SYMBOLS <lt_anydata_bp_cusgen> TYPE ANY TABLE.
CLEAR: l_s_entity, l_t_entity.
TRY .
go_mdg_conv->get_entity_structure(
EXPORTING
iv_entity_name = 'BP_CUSGEN'
iv_struct_type = go_mdg_conv->gc_struct_key_attr
* iv_edition = ABAP_FALSE
IMPORTING
er_structure = l_s_entity
er_table = l_t_entity
).
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
ASSIGN l_s_entity->* TO <fs_bp_cusgen>.
ASSIGN l_t_entity->* TO <lt_anydata_bp_cusgen>.
IF <lt_anydata_bp_cusgen> IS INITIAL.
<fs_bp_cusgen>-bp_header = ev_temp_key_bp.
<fs_bp_cusgen>-assgnm_id = '0000000002'.
<fs_bp_cusgen>-kunnr = gs_kunnr. "ev_temp_key_bp.
<fs_bp_cusgen>-ktokd = lv_account_group.
<fs_bp_cusgen>-country = lv_country_key. "'IN'."is_bucusgen-country.
<fs_bp_cusgen>-land1 = lv_country_key. "'IN'."is_bucusgen-country.
<fs_bp_cusgen>-region = lv_region. "'IN'."is_bucusgen-country.
IF is_bucusgen-cus_langu IS NOT INITIAL.
<fs_bp_cusgen>-cus_langu = lv_langu."is_bucusgen-cus_langu.
ELSE.
<fs_bp_cusgen>-cus_langu = 'EN'.
ENDIF.
INSERT <fs_bp_cusgen> INTO TABLE <lt_anydata_bp_cusgen>.
ENDIF.
CLEAR lw_entity_data.
lw_entity_data-entity = 'BP_CUSGEN'.
lw_entity_data-entity_data = l_t_entity.
INSERT lw_entity_data INTO TABLE et_entity_data.
CLEAR lw_entity_keys.
lw_entity_keys-entity = 'BP_CUSGEN'.
lw_entity_keys-tabl = l_t_entity.
INSERT lw_entity_keys INTO TABLE lt_entity_keys.
Write All entities into CR
TRY.
go_mdg_conv->write_entity_data( it_entity_data = et_entity_data ).
CLEAR et_entity_data.
CATCH cx_usmd_gov_api_core_error INTO go_core_error.
et_messages = go_core_error->mt_messages.
CATCH cx_usmd_gov_api_entity_write INTO lo_ent_error.
et_messages = lo_ent_error->mt_messages.
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages. "
ENDTRY.
Below Logic is used to Update Change Request ID with CR Description
Create a new change request using change request type and a description (mandatory)
TRY.
DATA: g_crequest_data TYPE usmd_s_crequest.
g_crequest_data-usmd_crequest = ev_crequest_id.
g_crequest_data-usmd_creq_type = im_changereq_type. "'CUST1P2'.
g_crequest_data-usmd_creq_text = im_changreq_text. "'Description for Change Request
g_crequest_data-usmd_creq_status = '01'. " IM_CHANGREQ_STAT
go_mdg_conv->write_crequest( is_crequest_data = g_crequest_data ).
CATCH cx_usmd_gov_api_core_error INTO go_core_error.
et_messages = go_core_error->mt_messages.
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
Save the change request and the entity data using below logic.
TRY.
go_mdg_conv->save( ).
CATCH cx_usmd_conv_som_gov_api INTO go_som_gov_api_error. "
et_messages = go_som_gov_api_error->mt_messages.
CATCH cx_usmd_app_context_cons_error INTO go_cons_error. "
ls_message = go_cons_error->e_message.
APPEND ls_message TO et_messages.
CATCH cx_usmd_gov_api_core_error INTO go_core_error.
et_messages = go_core_error->mt_messages.
Commit and once you save the change request
COMMIT WORK AND WAIT.
Catch the error messages as below and Dequeue all Entities
CATCH cx_usmd_gov_api INTO go_gov_api_error. "
et_messages = go_gov_api_error->mt_messages.
ENDTRY.
" DEQUE
go_mdg_conv->dequeue_entity_all( ).
If everything is fine, the workflow can be started for the change request and Submit the Change Request for further process
TRY.
go_gov_api->start_workflow( iv_crequest_id = ev_crequest_id ).
CATCH cx_usmd_gov_api_core_error.
ENDTRY.
Conclusion:
Build an RFC an can be called remotely in middle ware PI system where it will transfer data from CRM to SAP MDG where it will create a Change Request and Submit for review, send the created change request information back to CRM.
perfect blog with so many details , that helps me a lot, thanks from China
Thanks for a very elaborate posting. I have a doubt that I need to clarify. We have a scenario where we need to receive data from a third party and we need to create a change request for BP in MDG 8.0 which needs to go through the approval process in order to create a BP in MDG.
Is it possible to use SAP PI to set up message BusinessPartnerSUITEBulkReplicateRequest_In and create a change request in MDG through BADI MDG_SE_BP_BULK_REPLRQ_IN? Or we have to use the process as you describe above?
How can we use your proposed solution through SAP PI?
Thanks
Though you are using convenience API, at last, how did you call start workflow using governance API?
To start workflow (SUBMIT) from convenience API, call method SET_ACTION.
lo_conv_gov_api->set_action( iv_crequest_action = 'OS' ).
correct.Please refer
https://answers.sap.com/questions/13333369/sart-workflow-using-convenience-api.html
Hi Swathy,
Thanks for sharing end to end CRM integration program for auto BP CR creation in MDG.
It help me lot in my one of the project, where i had requirement to auto create BP CR from Oracle CRM.
Hello Swathy,
Thanks for sharing detailed document.
We have requirement to create CR from external system along with attachment. Do you know how to attach document while creating in MDG with this API. Thanks in advanced.
Hello Swathy,
Thanks for document.
Could you please share the importing structure names, it would helpful for me.
Import structure starting with is_address,is_bpsales etc,..
Thanks in advance.
Hello Swathi,
Thank you for this detailed blog.
I need your help to create similar RFC for material in MDG. If you can help that will be great.
Thanks in advance!
Hi swathi /team ,
How do we add bp_cpgen or bp_rel related entity type , could you please help .
thank you,