MDG 使用 API 创建变更请求

作者:郑德鼎 约 7 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:CO, Data Engineering, FI, MM, SD, 数据工程, 物料管理, 财务, 销售分销
MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图

# 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等主数据表。

MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图

上图清晰的解释了主数据创建修改的大体流程以及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 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图

MDG数据模型隐形地充当UI建模的元数据(以资产主模型为例)

MDG后台配置事务码:MDGIMG

数据模型配置路劲:主数据治理,集中处理->常规设置->编辑数据模型

MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图

**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_id

iv_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_id

iv_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_id

iv_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_id

iv_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中查看创建成功的变更请求**

MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图

**3.审批变更请求**

MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图
MDG 使用 API 创建变更请求 - 封面图

**3.查看审批成功后SAP中查看创建成功的资产号(AS03)**

MDG 使用 API 创建变更请求 - 封面图.textContent = new Date().getFullYear();