简介:《SAP MDG Overview》是一份面向SAP顾问、数据治理专家及企业架构师的PDF演示资料,系统介绍SAP Master Data Governance 9.0的中央治理核心功能,帮助读者理解如何通过统一平台管理客户、供应商、物料等关键主数据,解决跨系统数据不一致、采购决策次优、上市延迟等常见业务痛点。包体为单一PDF文件,压缩包总大小约2.54MB,内容以图文幻灯片形式呈现,便于快速浏览与分享。已有671人学习下载。资料从主数据挑战、业务线影响切入,逐一说明MDG在集中管理、数据治理流程、跨部门同步、变更管控及分析监控等方面的落地思路,尤其适合作为MDG中央治理功能的入门概览,也可作为理解主数据治理价值与方案架构的参考。唯一需要注意的是,该资料未包含合并与批量处理能力,如需相关主题可另行查阅专项文档。
1. SAP MDG 是什么:一张图看懂主数据治理的边界与价值
一家制造企业上线 SAP 才半年,业务部门就发现物料编码重复率接近 15%,供应商银行账号信息在各系统里对不上。SAP MDG(Master Data Governance)就是在这种痛点上应运而生的:它把物料、客户、供应商、财务科目等主数据的创建、变更、审批、分发统一收到一个治理流程里,让主数据不再是各系统自己说了算。如果你正在做数据治理、准备从传统 MDM 切换到 S/4HANA,或者只是被主数据混乱拖累了报表和采购,这篇会告诉你 MDG 到底能治哪些病、配置时哪里最容易翻车。
2. SAP MDG 的核心架构与数据模型:先搞清楚对象、流程和表结构
2.1 MDG 的三大对象类型:物料、客户、供应商到底怎么建模
SAP MDG 在南向(Southbound)接口中支持三类标准对象:物料(MATERIAL)、客户(CUSTOMER)、供应商(SUPPLIER)以及财务科目(FINANCIAL ACCOUNTING)。在 MDG 里,这三类对象不是简单复用 ECC 里的表结构,而是通过“激活区(Active Area)”和“暂存区(Staging Area)”两套数据模型来管理。
我一般会先从 SOA 视角去理解对象建模:MDG 中的每个主数据对象都对应一组“实体类型(Entity Type)”,比如供应商对象由“角色”“地址”“银行数据”“采购组织视图”等子节点组成。每个实体类型又由“键字段(Key Fields)”和“属性字段(Attributes)”构成。与 ECC 的区别在于,MDG 里所有字段都带“有效期(Validity Period)”和“变更类型(Change Type)”,这使得数据历史可以追溯。
举个例子,供应商主数据在 MDG 里的建模层级是这样的:
- 根实体:供应商(Supplier)
- 地址实体:供应商地址、联系人口
- 角色实体:FI- 财务视图、MM- 采购视图、SD- 销售视图
- 数据分布实体:分发接口配置(Distribution Context)
每个实体类型的变更都对应一个“变更请求对象(Change Request Object)”,这个对象是整个治理流程的核心。你看 MDG 的建模不是直接建表,而是通过“元数据仓库(Metadata Repository)”定义“业务对象”和“实体类型”,运行时再通过这些定义动态生成底层的文件夹表(Folder Table)和激活表(Active Table)。
2.2 数据模型:从暂存区到激活区的表结构演变
MDG 的数据落地遵循两条主线:暂存区(Staging)和激活区(Active)。暂存区中的数据结构与最终激活区几乎一致,但多了一个“变更请求号”相关的列。
以供应商为例,暂存区的关键表是MDG_GEN_CVI(通用供应商主数据模型)下的这些表:
MDG_ALL_DAT:所有主数据的属性快照MDG_ALL_REL:主数据之间的关联MDG_CUST、MDG_SUPPLIER:客户 / 供应商主表
激活区则直接使用 ECC 标准表,比如常规的KNA1(客户主数据)、LFA1(供应商主数据)、MARA(物料主数据)。所以在配置时,你需要明确每个字段是从暂存区的哪个“节点”映射到激活区的哪个“字段”。
一个容易忽略的细节是:MDG 把“激活”过程拆成了“数据校验(Validation)”和“数据传递(Transfer)”。校验不通过时,暂存区的数据保留,不会覆盖激活区;只有所有校验规则通过后,才调用数据复制接口写入LFA1、KNA1等表。这意味着,不是改了暂存区数据就等于改了主数据,必须在 UI 或后台显式触发“激活(Activation)”动作。
2.3 流程建模:BRFplus 规则与工作流怎么配合
MDG 的审批流程依赖两个引擎:BRFplus(业务规则框架)和 SAP Business Workflow。BRFplus 负责“数据校验规则”和“字段属性规则”,比如“供应商国家为中国时,银行账号必须填写”这类逻辑。工作流负责“审批节点”,比如主管审批、财务审批。
这里我踩过一个坑:BRFplus 的“属性规则(Attribute Derivation)”是在 UI 操作时实时触发的,而“数据校验规则(Validation)”是在提交变更请求时触发的。两者执行时机不同,如果误把校验规则写在派生规则里,会出现“显示已通过,激活时报错”的诡异现象。
工作流配置上,MDG 标准交付里有几种流程模板,比如“单步审批”“两步审批”。你可以在 BP 主数据变更请求中把流程绑定到“流程变体(Process Variant)”,每个变体对应一个工作流任务。注意,工作流任务里的“代理(Agent)”必须配置成用户或角色,否则审批人看不到任务,数据会一直卡在“已提交”状态。
3. 从零搭建一个 MDG 模拟项目:配置步骤与关键参数
3.1 项目准备:系统检查与角色分配
搭建 MDG 之前,先确认系统版本。MDG 在 S/4HANA 中已经内置,在 ECC 6.0 中需要单独安装 MDG 组件。我建议至少使用 SAP S/4 HANA 1709 以上版本,因为旧版本对物料主数据的“多视图”支持要打补丁。
检查完成后,需要创建三个项目角色:
- 数据维护员:负责创建和修改主数据,分配事务代码
MDG_M(物料)、MDG_C(客户)、MDG_S(供应商) - 审批者:负责审批变更请求,分配事务代码
MDG_CP(处理审批任务) - 管理员:负责配置数据模型和流程,分配事务代码
MDGIMG(IMG 配置入口)
这个步骤看似简单,但最容易翻车的是“角色权限不足”。我一般会把权限角色与工作流代理角色区分开,否则会出现“用户能改但提交不了”的权限问题。
3.2 创建变更请求类型和编号范围
在事务代码MDGIMG中,进入“主数据治理”菜单,找到“变更请求”下的“定义变更请求类型”。每个变更请求类型要绑定一个“对象类型”(比如SUPPLIER_m或CUSTOMER_m),还要绑定一个“数据源”和“目标系统”。
关键参数设置:
- 变更请求类型:定义是“单对象”还是“多对象”类型
- 编号范围:大多数项目直接使用 MDG 自带的编号范围对象
MDG_CHG,但如果你有多套环境(开发、测试、生产),建议给每套环境分配不同的编号范围 - 状态管理:选择“自动状态更新”,这样在工作流审批通过后,系统自动把状态置为“已激活”
这里我给一个参考配置示例(以供应商为例):
变更请求类型:ZS_MDG_SUP 对象类型:SUPPLIER_m 数据源:ECC 目标系统:ECC, S4H 权限角色:MDG_SUPPLIER_REQ_CREATE参数含义:
- 对象类型决定后续能选择哪些实体类型
- 数据源一般选“ECC”作为主数据源,对应底层的 LFA1 表
- 目标系统配置用于后续的数据分发,如果只有单系统,就填本系统逻辑名
3.3 配置数据复制与激活框架
MDG 的数据复制框架(Data Replication Framework,DRF)负责把激活区数据同步到 ECC 表以及外围系统。配置路径在MDGIMG -> 数据复制框架 -> 配置复制模型。
你需要为每个对象类型分配一个“出站服务(Outbound Service)”。默认情况下,供应商对象会有一个GEN_CVI_SUPPLIER_SAVE服务。这个服务的参数决定是否同步银行信息、是否激活税数据等。
一个常见误区是:以为配置了复制模型,激活后数据就会自动同步到 ECC。实际上,DRF 的同步有“同步”和“异步”两种模式。异步模式下,激活后的数据会先写入“队列”,再由后台作业MDG_DRF_HOME定时推送。如果队列积压,ECC 就看不到新数据。我通常把这个作业设置为每 5 分钟跑一次,并监控队列长度。
下面是一个调试用的代码片段,查看复制队列是否有积压:
SELECT * FROM SMQ1 WHERE QNAME LIKE '%MDG%';这个查询会列出所有等待传输的消息队列。如果积压行数持续增长,说明目标系统连接或接口有问题。
3.4 配置 UI 与表单(含代码示例)
MDG 的 UI 基于 Floorplan Manager(FPM)。你可以复用标准配置,也可以自定义页面。配置 UI 的入口是事务代码MDGIMG -> 用户界面配置 -> 配置生成器。
在生成器中,选择对象类型后,系统会生成一个 FPM 应用。你可以拖拽字段、调整布局。但我不建议直接在标准页面上改,因为后续升级会被覆盖。更稳妥的做法是复制一个自定义页面,然后在“组件配置”里替换。
下面是一个通过 ABAP 代码强制给 UI 上的字段设置“只读”的示例(在P_WD_COMPONENT方法中实现):
METHOD SET_READONLY. DATA(lo_selection) = mo_controller->get_selection( ). DATA(lo_nd_supplier) = lo_selection->get_entity( node_name = 'SUPPLIER' ). IF lo_nd_supplier IS BOUND. lo_nd_supplier->set_attribute_editable( iv_attr = 'BANK_KEY' iv_value = abap_false ). ENDIF. ENDMETHOD.逻辑说明:这个增强能根据业务逻辑动态控制“银行代码(BANK_KEY)”字段的可编辑状态。set_attribute_editable的第二个参数传abap_false表示不可编辑。这里的mo_controller是 FPM 的控制器引用,实际项目中需要从视图控制器中获取。
参数说明:node_name对应 FPM 配置中的数据节点名,有时候叫SUPPLIER或SUPPLIER_HEADER,取决于你的自定义配置。如果传入错误的节点名,运行时会抛出CX_SY_REF_IS_OUT_OF_BOUND,排查时直接打断点看节点名最实际。
4. 用代码和脚本加速 MDG 实施:ABAP 示例与常用工具
4.1 批量导入主数据:用 BAPI 与 IDOC 的取舍
MDG 项目里,经常遇到从旧系统迁数据到 MDG 的场景。很多人第一反应是写 BAPI,但 BAPI 在 MDG 里会遇到一个问题:BAPI 直接写激活区表,绕过了暂存区、校验规则和工作流,导致数据质量失控。
我一般用的方案是:通过“MDG 数据导入 API(MDG_CHG_IMPORT)”来创建变更请求,再提交激活。这个 API 会把数据放进暂存区,触发正常的校验和审批流程。
下面是一个简单的 ABAP 调用示例,创建一个供应商变更请求:
DATA(ls_conf) = VALUE mdg_chg_imp_cfg( req_type = 'ZS_MDG_SUP' obj_type = 'SUPPLIER_m' model_name = 'VENDOR_M' ). DATA(ls_data) = VALUE mdg_chg_imp_data( obj_key = 'SUP001' field = 'BANK_KEY' value = 'XXXXXXXX'. ). CALL FUNCTION 'MDG_CHG_IMPORT' EXPORTING is_conf = ls_conf is_data = ls_data IMPORTING et_messages = DATA(lt_messages) ev_obj_id = DATA(lv_obj_id).逻辑说明:该 API 的核心是传入配置(请求类型、对象类型)和主数据属性值,返回新创建的变更请求 ID。之后你可以用MDG_CHG_PROCESS直接提交审批和激活,也可以把这个 ID 交给业务走工作流。
参数说明:obj_key对于供应商可以是供应商编码,对于物料可以是物料编码;如果不传,系统会按编号范围自动生成。field和value是属性名和属性值,属性名必须与数据模型中的字段名一致,否则会报Attribute doesn't exist。
如果导入量很大(比如几万条),建议分批调用,每批 100 条,并用并行 RFC 加速。注意,每批数据必须启一个独立的工作进程,否则会有锁冲突。
4.2 自定义校验逻辑:ABAP 增强示例
MDG 允许在 BRFplus 里配置大部分校验,但复杂的业务逻辑(比如检查供应商经营范围与物料类别的匹配性)还是得写在 ABAP 增强里。MDG 提供了“业务规则增强点”MDG_BP_*,也允许你在流程中配置“校验函数”。
下面是一个自定义校验的 ABAP 函数示例,用于在提交前检查供应商的地址是否完整:
FUNCTION Z_MDG_CHECK_ADDRESS. *"---------------------------------------------------------------------- "*"本地接口: *" IMPORTING VALUE(IV_SUPPLIER) TYPE LIFNR *" EXPORTING VALUE(EV_RETURN_CODE) TYPE I *" TABLES ET_MESSAGES TYPE BAPIRET2 *"---------------------------------------------------------------------- SELECT SINGLE COUNT(*) FROM LFA1 WHERE LIFNR = iv_supplier AND ADRNR = ''. IF sy-subrc = 0. ev_return_code = 1. APPEND VALUE #( type = 'E' message = |供应商 { iv_supplier } 缺少地址| ) TO et_messages. ELSE. ev_return_code = 0. ENDIF. ENDFUNCTION.逻辑说明:函数输入一个供应商编码,检查LFA1表中该供应商是否没有分配地址编号(ADRNR),如果没有就返回错误代码和消息。这个函数可以被 BRFplus 调用,也可以挂在工作流的表达式里。
参数说明:et_messages是标准返回消息表,类型为BAPIRET2。如果业务需要多个校验,把这些函数串在一起,任何一个返回非零则停止提交。注意,这里直接查了激活区表,所以这个校验只能用于激活后的复查,如果要作为提交前校验,应该查暂存区对应的视图(比如GTS_*)。
4.3 常见报表查询:从文件夹表拿数据的标准 SQL
MDG 的暂存区数据存在“文件夹表”里,命名规则一般是MDG_FK_<对象类型>_<实体>。比如供应商银行数据的文件夹表是MDG_FK_VENDOR_BANK。很多顾问写报表时查错了表,结果总查到空数据。
下面是一个查询“所有待审批供应商变更请求”的 SQL:
SELECT S.REQUEST_ID, S.CHANGE_REQUEST, H.OBJ_KEY, H.STATUS FROM MDG_FK_VENDOR_HEADER H INNER JOIN MDG_ALL_TRANSACTION S ON H.REQUEST_ID = S.REQUEST_ID WHERE H.STATUS IN ('01', '02') -- 01: 已提交,02: 审批中 ORDER BY S.REQUEST_ID DESC;逻辑说明:MDG_FK_VENDOR_HEADER存的是每个变更请求的头信息,MDG_ALL_TRANSACTION存的是事务记录。通过两个表的关联可以查出请求号和状态。这里的STATUS字段用的是内部状态代码,01表示刚保存,02表示审批流程进行中。
参数说明:如果你查不到数据,先确认数据模型是否包含VENDOR节点。有些项目自定义了模型名,比如Z_VENDOR,这时就要把表名换成MDG_FK_Z_VENDOR_HEADER。可以在事务代码 `MDGIMG“里查“实体类型列表”确认实际表名。
5. 避坑指南:MDG 实施中极易翻车的 5 个常见问题
5.1 现象:数据复制后激活失败,报错 "Attribute missing"
在测试环境创建一个供应商,录入银行信息后点击激活,系统直接报Attribute missing:BANK_ACCOUNT。明明界面上已经填了值,为什么还是报缺?
原因:MDG 暂存区中,银行账户属于“子实体节点”。激活时系统检查的是子节点里的字段是否有值,而 UI 上显示的“银行账户”数据可能没同步到暂存区的正确节点上。常见原因是 UI 绑定的是多维地址节点,激活框架默认检查的是另一个节点。
解决:打开事务代码MDGIMG -> 数据模型 -> 显示实体类型,找到供应商对象下的BANK实体,确认其“属性”列表中是否有银行账户字段。然后在 UI 配置里检查该字段的“数据字段路径”是否指向BANK.BANK_ACCOUNT。如果 UI 绑定的是辅助字段(辅助值),激活时就会漏掉。我一般直接在原始 UI 上移除辅助字段,强制直接绑定主字段。
5.2 现象:工作流审批通过但更改未生效
我们曾经遇到一个奇怪的案例:审批者在SBWP任务里点击“通过”,流程状态变为“已完成”,但主数据在 ECC 中没有任何变化。
原因:MDG 的工作流“审批通过”只是完成了审批动作,真正的数据激活是在工作流结束后的“事件”里触发的。如果你在流程定义里漏掉了“激活”事件,或者事件没有绑定到正确的“代理”,就会出现审批通过但无人激活。
解决:检查工作流配置(事务代码SWDD),找到对应流程的“结束”事件。事件的处理类型必须是“直接激活(MDG_ACTIVATE_OBJECT)”,且绑定的代理必须是一个“服务用户”(比如MDG_ACT_SERVICE)。我后来把激活节点拆成独立任务,并在流程中添加“如果激活失败,返回审批人”的异常分支,彻底避免了这个问题。
5.3 现象:自定义字段无法在 UI 上显示
项目里给供应商主数据加了两个自定义字段,比如“供应商等级”和“风险标记”。后台配置好、字段也在数据模型里加上了,但 FPM UI 上就是找不到。
原因:MDG 的 UI 生成器默认只显示“激活区”映射过的字段,有些自定义字段没有在“界面配置”中显式加入。另外,如果你改了数据模型后没有“重新生成标签”,也会导致字段显示为空白。
解决:在事务代码MDGIMG -> 用户界面配置 -> 配置生成器中,选择对象类型后点“重新生成页面”,系统会自动把新字段带出来。如果还不显示,检查字段是否在“业务规则(BRFplus)”中被设置为“不可维护”。我之前遇到的是 BRFplus 里有一个隐藏字段的规则,覆盖了 UI 的可编辑性。
5.4 现象:从非 MDG 系统批量导入数据时总是重复
从旧系统导出一批物料主数据,用MDG_CHG_IMPORT导入后,发现很多物料被导入了多次,重复创建了不同的物料号。
原因:导入时没有传外部键值(比如旧系统的物料编码EXT_KEY),MDG 为每条记录都生成了一个新的内部物料号。后续再用旧编码去创建时,系统无法识别已有记录,从而再次生成新号。
解决:在导入数据前,先检查MDG_FK_HEADER中的EXT_KEY字段。如果原系统有唯一键,必须把它映射到EXT_KEY。示例代码:
DATA(ls_data) = VALUE mdg_chg_imp_data( obj_key = 'OLD_MATNR_007' " 旧编码 field = 'EXT_KEY' value = 'OLD_MATNR_007' ).同时,在配置数据模型时给EXT_KEY加上唯一性校验(在 BRFplus 里用“唯一组合”规则)。这样后续导入重复数据时,会被校验规则拦截。
5.5 现象:MDG 与 ECC 同步延迟,业务抱怨数据不一致
MDG 激活后,ECC 里看不到更新,但过一会儿又能看到了。这种“间歇性延迟”最坑人,业务人员以为数据丢了。
原因:DRF 默认采用异步模式,数据先入队列再后台推送。如果同时跑大量主数据变更,后台作业MDG_DRF_HOME处理不过来,就会延迟。另一个原因是,某些接口(比如客户主数据的同步)依赖给外部回调,外部系统未确认,队列就会等待。
解决:我的对策是把主要的出站服务改成“同步调用”模式,虽然会影响性能,但对关键主数据值得。具体路径:DRFIMG -> 维护出站服务,选择对应服务,把“处理模式”改为“同步(Dialog)”或“事务前同步(Immediate)”。另外,监控队列长度并调整后台作业频率。这里有个小技巧:每天业务低峰期跑一个作业把所有积压队列清空,避免周四、周五高峰期的“雪崩”。
6. 进阶技巧:用生成器快速扩展主数据属性,附一个自检清单
6.1 使用 MDG 数据复制生成器(DRF)扩展新字段
当标准对象不够用时,你可以用 DRF 的“字段分发生成器”来扩展属性,而不是去改底层表结构。DRF 里有个“生成器”事务代码DRFD,选择“针对每个对象类型的字段列表生成”。
我在某个项目里扩展过一个“供应商资质证书到期日”字段。操作步骤如下:
- 在数据模型(事务代码
MDGDP)中添加自定义字段Z_CERT_EXPIRE,挂在供应商头实体下。 - 在 DRF 的“字段分发”配置中新增一条规则,把该字段映射到目标 ECC 表的增强字段
ZCERT_EXPIRE。 - 生成 ABAP 结构:DRF 会自动创建一对方法用于出站和入站映射。
- 在 FPM UI 上把该字段拖到对应页签,保存并激活。
这样做的最大好处是,不用手动写同步代码,DRF 自动处理了激活后分发到各系统的逻辑。但注意,DRF 生成的代码是“一次性”的,如果你在生成后手工修改字段属性,后续重新生成会覆盖,所以建议生成后直接备份,别再做“再生成”操作。
6.2 自检清单:上线前 3 天必过的 8 项检查
我把这些年踩过的坑汇总成一份上线前检查清单,每次 MDG 项目在迁移生产环境前,我都会强制自己走一遍:
- 变更请求类型分配了正确的编号范围,且生产环境编号范围与开发隔离。
- 工作流代理已同步到生产环境的用户主数据,不会出现审批人缺失。
- 所有 BRFplus 校验规则关联到正确的对象类型,且执行时机为“提交时”而非“保存时”。
- DRF 出站服务的处理模式符合业务要求,关键主数据已改为同步或定时高频作业。
- 自定义字段在 UI 上可见,并且在激活后能正确写入 ECC 对应增强表。
MDG_DRF_HOME后台作业间隔小于 15 分钟,且监控队列积压为零。- 准备好回退方案:修改主数据前对所有涉及表执行一次
SE16导出备份。 - 测试环境跑一次完整的“创建 → 审批 → 激活 → 分发 → 查询”链路,并检查日志事务代码
MDG_LOG。
作为一线操作的人,我最大的教训是:永远不要在没有跑通第 8 项之前就切生产。有一次因为工作流代理在测试环境没验证,上线当天审批任务直接卡住,业务部门电话被打爆。从那以后,每次 MDG 项目我都强制自己在每隔一次会议前把自检清单过一遍,特别是第 3 条和第 8 条,是血泪换来的。希望这篇速记能帮你少走类似的弯路,也希望你的 MDG 主数据治理项目能平稳落地。
本文还有配套的精品资源,点击获取