# MDG使用API创建变更请求
8号技师—小贺 [ 建广技师 ](javascript:void\(0\);)
__ _ _ _ _
** MDG ** ** 数据模型 Data Modeling **
SAP MDG 包含以下三大块数据模型:
物料主数据(Material Master)
业务合作伙伴(BP) 客户(Customer)和供应商(Supplier) 财务(Financials)
需要注意的是,SAP MDG中的数据模型都是独立存在的,彼此没有任何交集,这也是我们在考虑是否需要新建DataModel时的重要依据。
SAP MDG 包含两个存储区域:
Staging Area
包含了在处理过程中的数据,与Change Request相关联,这些是MDG所独有的数据库表。
Active Area
包含了已经处理好的数据,可以随时供其他系统和应用调用,例如大家熟悉的MARA、BUT000等主数据表。
上图清晰的解释了主数据创建修改的大体流程以及Staging Area与Active Area在此过程中担当的角色。当Final
Approval被处理之后,主数据记录从Staging Area中更新到Active Area。这个过程也被称为 **Activation** 。
根据部署方式的不同,这些Active Areas被分为 **Flex Mode** 和 **Reuse Active Area** :
• Flex Mode
在这种模式下,当数据模型被定义后,一组新的数据库表被自动生成。当没有与之相对应的SAP
ERP表,或因为某种需求,MDG表与ERP表必须做隔离时,我们可以采用该模式。当然,如果需要的话,数据可以随时复制到SAP ERP主数据表中。所有的SAP
MDG FI主数据对象都是采用Flex Mode实施。
• Reuse Active Area
这种模式中,已存在的SAPERP表被直接复用。Material
Master和BusinessPartners主数据都是采用该模式实施,这就意味着当Change Request被**(Activated)后,对应的SAP
ERP主数据表也会被同步更新。
MDG数据模型隐形地充当UI建模的元数据(以资产主模型为例)
MDG后台配置事务码:MDGIMG
数据模型配置路劲:主数据治理,集中处理->常规设置->编辑数据模型
**1.API创建变更请求并发起工作流审批(资产号: 800010100041 ) **
DATA : lo_gov_api TYPE REF TO if_usmd_gov_api ,
lr_zc01_key_str TYPE REF TO data , "Entity ZC01 - key structure
lr_zc01_key_tab TYPE REF TO data , "Entity ZC01 - key table
lr_zc01_data_str TYPE REF TO data , "Entity ZC01 - data structure
lr_zc01_data_tab TYPE REF TO data , "Entity ZC01 - data table
ls_entity TYPE usmd_gov_api_s_ent_tabl ,
lt_entity TYPE usmd_gov_api_ts_ent_tabl .
DATA : lv_description TYPE usmd_txtlg ,
lv_crequest_id TYPE usmd_crequest , "Change Request ID
lt_messages TYPE usmd_t_message .
FIELD-SYMBOLS : <ls_zc01_key> TYPE any ,
<lt_zc01_key> TYPE ANY TABLE ,
<ls_zc01_data> TYPE any ,
<lt_zc01_data> TYPE ANY TABLE .
FIELD-SYMBOLS : <value> TYPE any .
• Create an instance of the governance API
TRY .
lo_gov_api = cl_usmd_gov_api => get_instance ( iv_model_name = 'ZC' ).
CATCH cx_usmd_gov_api .EXIT .
ENDTRY .• Create all the data references needed to maintain the ZC01 entity
• Create a data reference of the key structure / table of entity ZC01
lo_gov_api -> create_data_reference (
EXPORTING iv_entity_name = 'ZC01'
iv_struct = lo_gov_api -> gc_struct_key
IMPORTING er_structure = lr_zc01_key_str
er_table = lr_zc01_key_tab ).• Create a data reference of the key and attribute structure / table of
• entity ZC01
lo_gov_api -> create_data_reference (
EXPORTING iv_entity_name = 'ZC01'
iv_struct = lo_gov_api -> gc_struct_key_attr
IMPORTING er_structure = lr_zc01_data_str
er_table = lr_zc01_data_tab ).• TO field symbols
ASSIGN lr_zc01_key_str -> * TO <ls_zc01_key> .
ASSIGN lr_zc01_key_tab -> * TO <lt_zc01_key> .
ASSIGN lr_zc01_data_str -> * TO <ls_zc01_data> .
ASSIGN lr_zc01_data_tab -> * TO <lt_zc01_data> .
"Fill the key and data structure with values to create a new ZC01
"The entity ZC01 only has key field ZC01.
ASSIGN COMPONENT 'ZC01' OF STRUCTURE <ls_zc01_key> TO <value> .
IF sy \- subrc = 0 .<value> = '800010100041' .
INSERT <ls_zc01_key> INTO TABLE <lt_zc01_key> .
ELSE .
EXIT .
ENDIF .• description (required)
lv_description = ' 资产测试变更请求 ' && sy \- datum && sy \- uzeit .
TRY .
lv_crequest_id = lo_gov_api -> create_crequest (iv_crequest_type = 'ZCCRT'
iv_description = lv_description ).CATCH cx_usmd_gov_api ."Something went wrong while creating the change request (e.g. model blocked
"or change request type unknown).
EXIT .
ENDTRY .• Before making changes to an object, the object needs to be enqueued
• even if this is a creation scenario
TRY .
lo_gov_api -> enqueue_entity ( EXPORTING iv_crequest_id = lv_crequest_idiv_entity_name = 'ZC01'
it_data = <lt_zc01_key> ).
CATCH cx_usmd_gov_api_entity_lock cx_usmd_gov_api .EXIT .
"Tough luck –
"something went wrong while enqueueing the entity (it could be a
"technical reason, or maybe the ZC01 is already interlocked!
ENDTRY .• Provide some entity attributes (complete data structure)
MOVE-CORRESPONDING <ls_zc01_key> TO <ls_zc01_data> .
ASSIGN COMPONENT 'BUKRSZC' OF STRUCTURE <ls_zc01_data> TO <value> .
<value> = '8000' .
ASSIGN COMPONENT 'ANLN2ZC' OF STRUCTURE <ls_zc01_data> TO <value> .
<value> = '0000' .
ASSIGN COMPONENT 'TXTLG' OF STRUCTURE <ls_zc01_data> TO <value> .
<value> = ' 测试资产号 ' .
ASSIGN COMPONENT 'ANLKL' OF STRUCTURE <ls_zc01_data> TO <value> .
<value> = 'Z100' .
ASSIGN COMPONENT 'INVNR' OF STRUCTURE <ls_zc01_data> TO <value> .
<value> = 'CN10001' .
ASSIGN COMPONENT 'SERNR' OF STRUCTURE <ls_zc01_data> TO <value> .
<value> = 'SN20220317001' .
ASSIGN COMPONENT 'NDJAR' OF STRUCTURE <ls_zc01_data> TO <value> .
<value> = '10' .
ASSIGN COMPONENT 'MENGE' OF STRUCTURE <ls_zc01_data> TO <value> .
<value> = '1' .
ASSIGN COMPONENT 'MEINS' OF STRUCTURE <ls_zc01_data> TO <value> .
<value> = 'EA' .
INSERT <ls_zc01_data> INTO TABLE <lt_zc01_data> .
• Write the entity data to the change request
TRY .
lo_gov_api -> write_entity ( EXPORTING iv_crequest_id = lv_crequest_idiv_entity_name = 'ZC01'
it_data = <lt_zc01_data> ).
CATCH cx_usmd_gov_api_entity_write .EXIT .
"might be that you have no authorization, or the entity is
"not enqueued or cannot be added to the object list of the change
"request
ENDTRY .TRY .
lo_gov_api -> read_entity ( EXPORTING iv_crequest_id = lv_crequest_idiv_entity_name = 'ZC01'
it_key = <lt_zc01_key>
IMPORTING et_data = <lt_zc01_data> ).
CATCH cx_usmd_gov_api_core_error cx_usmd_gov_api .EXIT .
"Adequate Exception handling
ENDTRY .• The complete change request should be checked before it is saved
TRY .
lo_gov_api -> check_crequest_data ( iv_crequest_id = lv_crequest_id )."Collect the entities to be checked
ls_entity \- entity = 'ZC01' .
ls_entity \- tabl = lr_zc01_key_tab .INSERT ls_entity INTO TABLE lt_entity .
"check the entity
lo_gov_api -> check_complete_data (
EXPORTING iv_crequest_id = lv_crequest_id
it_key = lt_entity ).CATCH cx_usmd_gov_api_core_error cx_usmd_gov_api ."Possibility to handle the erroneous data or go on.
ENDTRY .DATA : lr_error TYPE REF TO cx_usmd_gov_api_core_error .
DATA : l_msg TYPE string .
"Save the change request (and the entity data of course)
TRY .lo_gov_api -> save ( ).
"Save is done in draft mode by default so it is possible to
"save the change request even if change request data or
"entity data is not consistent.
CATCH cx_usmd_gov_api_core_error INTO lr_error .EXIT .
"Adequate Exception handling
ENDTRY ."At the end, it is necessary to clean the house
TRY .
lo_gov_api -> dequeue_entity ( EXPORTING iv_crequest_id = lv_crequest_idiv_entity_name = 'ZC01'
it_data = <lt_zc01_key> ).lo_gov_api -> dequeue_crequest (
EXPORTING iv_crequest_id = lv_crequest_id ).
CATCH cx_usmd_gov_api .
ENDTRY .COMMIT WORK AND WAIT .
• the change request (this is like a 'submit')
TRY .
lo_gov_api -> start_workflow ( iv_crequest_id = lv_crequest_id ).
CATCH cx_usmd_gov_api_core_error ."Adequate Exception handling
ENDTRY .COMMIT WORK .
"Interested in the errors occured?
lt_messages = lo_gov_api -> get_messages ( ).**2.创建成功后,进入资产查询APP中查看创建成功的变更请求**
**3.审批变更请求**
**3.查看审批成功后SAP中查看创建成功的资产号(AS03)**
.textContent = new Date().getFullYear();