1. 从项目上线第一天起,就该搞懂这些 MM 表
干 MM 模块实施或者做 SAP 二次开发的朋友,一定有过这种经历:业务顾问跑过来丢给你一个需求——"帮我查一下这个物料在哪个工厂有多少库存""这张采购订单是谁在几号下的""这个物料凭证到底冲销了没有"。你一脸懵地打开 SE11,却不知道该进哪张表。
我刚开始做 MM 开发的时候,也是这么过来的。对着系统手册翻来覆去,什么"物料主数据""采购信息记录""实物库存",概念都懂,可真要写 SQL 去查数据,脑子还是空的。后来跟在几个老师傅后面混了一段时间,又连续啃了好几个项目的报表需求,慢慢才摸出一点门道——MM 模块的表虽然多,但真正高频使用的核心表就那么几十张。把这几十张表的职责边界、关联字段和典型查询场景搞明白,90% 的日常开发和排障工作都能轻松拿下。
这篇博客我就把自己在项目里反复用到的 MM 常用数据库表整理出来,按照物料主数据、采购管理、库存管理、财务评估这几个维度逐类拆解。不只列表名,还会把关键字段、和上下游表之间的关联关系以及实际写报表时的坑都讲清楚。无论你是刚入门的 ABAP 开发、负责 MM 模块的顾问,还是需要做数据抽取分析的运维人员,这篇文章应该都能帮你省下不少翻文档的时间。
2. 从全局到工厂再到库存地,物料主数据的表是怎样层层拆分的
物料主数据是 MM 模块一切业务操作的基础。很多新手刚接触时最容易懵的地方在于:物料的基本信息明明只是"一个物料",到了数据库里却被拆成了好几张表。其实一点也不复杂,我习惯把物料主数据想象成一份员工档案——MARA 是员工基本信息页,MARC 是部门内部的任职信息页,MARD 是具体办公地点的分配信息页,而 MAKT 就是员工的中英文姓名标签。不同的业务层级关注的信息不同,表自然也就分开了。
2.1 MARA:无论哪个工厂都改不了的通用属性
MARA(Material Master General Data)是整个物料主数据的心脏。这张表存的是一个物料跨工厂、跨库存地都完全一致的通用信息,也就是说不管物料在哪个工厂使用,这部分数据始终保持相同。
实际项目里,我几乎每天都要和 MARA 打交道。几个高频字段你一定要熟:
- MATNR(物料号):全局唯一的物料编码,几乎所有 MM 相关表的关联主键就是它。
- MTART(物料类型):比如 ROH 原料、FERT 成品、HALB 半成品、VERP 包装物料。这个字段直接影响物料是否允许做采购、是否允许做库存管理等业务事务。
- MBRSH(行业领域):M 机械行业、F 食品行业等,很多企业只用其中一个,但在跨行业集团项目里是关键的隔离字段。
- MEINS(基本单位):这个物料的库存基本计量单位,比如 PC、KG、M。要注意它和后面进货单位、发货单位之间的换算关系。
- MATKL(物料组):物料分类的大类,财务上经常按物料组出报表做毛利分析。
我刚开始写查询报表时总爱直接只用 MATNR 去关联,但后来发现,一旦物料主数据里有历史归档或者外部系统同步进来的异类物料,不带 MTART 和 MATKL 过滤条件的查询经常把垃圾数据也捞出来。所以实际开发时,只要需求允许,我都会默认加上物料类型不为空的条件,这个习惯帮我避开了多次脏数据造成的返工。
MARA 里面还有一个容易被忽略但很重要的表——MAKT(Material Text),也就是物料描述表。MAKT 按照语言代码 SPRAS 分别存储物料的描述文本。中文环境一般只维护中文,但跨国项目往往会同时维护 EN 和 ZH。做报表展示时 JOIN MAKT 取 MAKTX 是常规操作,但要记得要是业务顾问在界面操作的登录语言和你要输出的语言不一致,查出来的物料描述可能是空的,这种场景就需要做语言代码的兜底逻辑。
2.2 MARC:工厂级别让你看清物料在这个厂能不能用、怎么用
如果说 MARA 是"全局档案",那 MARC(Material Master Plant Data)就是"工厂档案"。同一种物料在不同工厂可能采购负责人不同、安全库存不同、计划策略不同、是否启用批次管理也不同,这些差异全靠 MARC 里的字段来体现。
MARC 是我做 MRP 相关开发和库存分析时最常用到的表之一:
- WERKS(工厂):MARC 的联合主键之一,另一个是 MATNR。你只要见到字段里有 WERKS,就说明这张表的数据是工厂维度的。
- DISPO(MRP 控制者):负责物料计划的人或小组代码,物料缺料分析经常按这个字段分组。
- DISMM(MRP 类型):ND 不计划、PD 自动再订货点、M0 主计划等。做 MRP 运行结果分析时,必须知道这个物料到底走的哪种计划策略。
- EKGRP(采购组):负责采购的小组代码,采购报表常按它分组统计。
- MAABC(ABC 分类):A 类高价值物料、B 类中等、C 类低值。库存管理优化和盘点策略都要参考这个字段。
- MSTAV(库存管理状态):这个字段控制物料在工厂维度是否允许做特定事务,比如是否允许采购、是否允许库存转移。状态不对时,业务操作根本保存不了。
有个很深刻的教训:某次做物料齐套分析的需求时,开发直接拿 MARA 全表去关联库存和采购数据,结果产能报表上的很多物料显示"无 MRP 数据"。查了半天才发现,需要 JOIN MARC 并且限定 DISPO 不为空,不然那些没有真正跑过 MRP 的物料都会被当成异常数据。所以这里我总结一条经验:凡是涉及工厂维度业务状态的报表,一律从 MARC 出发,MARA 只承担文本关联的角色,不要主次颠倒。
2.3 MARD 与 MCHB:库存地维度和批次维度的落地数据
MARD(Material Stock Storage Location)存的是物料在某工厂下不同存储地点的库存级别数据。和 MARC 相比,MARD 更像是"仓库库位档案",核心字段包括:
- WERKS(工厂)+ LGORT(库存地点):联合主键,一个物料在一个工厂的每个库存地点都有一条数据。
- LABST(非限制使用库存):这部分库存是可以直接使用的,最常见也最常查。
- UMLME(在途库存):已经发货但还未收货确认的库存,做跨工厂调拨分析时会强调这个。
- INSME(质检库存):到货后转入质检状态但还没放行的库存。
- EINME(冻结库存):有问题被冻结,不能参与 MRP 运算的库存。
- SPEME(退货库存):客户退回但还未做最终判定的库存。
这四个"特殊库存状态"字段加在一起才构成完整库存图景。做库存报表时,如果只查 LABST 就会漏掉质检和在途那部分量,最终业务问起来说"库存不对",其实就是因为没把这些状态字段都算进去。
MCHB(Batch Stock)则是启用了批次管理之后,库存按批次拆分的明细表。一张 MARD 的数据在 MCHB 里会被拆成多行,每个 CHARGE(批次号)一行。做批次追溯报表时,MCHB 是核心,但要记住 MCHB 里的库存状态字段远远没有 MARD 那么全,很多时候需要 JOIN 批次主数据表 MCH1/MCHA 才能把批次的创建日期、状态属性补齐。有批次的物料如果没有强制要求,建议首先从 MCHB 出发而不是 MARD,因为你从 MARD 只能看到总量,拆不到批次维度。
3. 从抬头到行项目,采购业务的表为何总是成对出现
采购模块在 MM 里的地位和物料主数据一样重。做过采购报表的人都知道,SAP 的凭证类数据通常会把"抬头信息"和"行项目信息"拆开存放:一张采购订单,抬头表存供应商、采购组织、订单日期这类只出现一次的信息,行项目表存每个细项的物料号、数量、单价、交货日期等重复多行的信息。这种设计既避免冗余,又符合业务单据的自然结构。
3.1 EKKO 与 EKPO:采购订单的一体两面
EKKO(Purchasing Document Header)是采购订单抬头表,我常用字段包括:
- EBELN(采购凭证号):SAP 里默认 10 位,外部编号范围可能带前缀。
- BSART(凭证类型):NB 标准采购订单、UB 转储订单、FO 框架协议等。框架协议的抬头信息也在这张表里。
- EKORG(采购组织)+EKGRP(采购组):决定了这个采购订单归属的组织结构。
- LIFNR(供应商编号):对应 LFA1 供应商主数据。
- AEDAT(创建日期):很多分析报表按月、按季度统计采购量时就压这个字段。
- WAERS(货币码):采购订单的币种。要注意订单货币和公司代码货币不一致的情况,做采购分析时的金额换算不能直接用订单金额。
EKPO(Purchasing Document Item)则是行项目表,字段上比 EKKO 丰富得多:
- EBELN + EBELP(行项目号):联合主键,10 位凭证号加 5 位行项目号。
- MATNR(物料号)+ MATKL(物料组):行项目里不一定都有物料号,比如服务采购、文本项目就只有物料组。
- MENGE(采购数量)+ MEINS(订单单位):这里的单位不一定等于物料主数据的基本单位,做数量汇总时必须先单位换算,不然数据直接翻倍或者缩水。
- NETPR(净单价)+ BRTTW(含税总额):做采购价格分析时这两个字段是主力。
- LOEKZ(删除标记):订单行被逻辑删除后这条数据还在表里,但业务上不再有效。写采购订单报表时一定得把这个字段过滤掉,否则统计口径就错了。
大部分情况下,查采购订单都是 JOIN 这两张表:LEFT JOIN EKKO ON EKPO~EBELN = EKKO~EBELN。订单类型、供应商、采购组织这些通用条件放 EKKO,物料号、日期区间、删除状态这些明细条件放 EKPO。如果没有跨表过滤条件,尽量先压小 EKPO 的结果集再 JOIN EKKO,不然数据量大时性能会明显有瓶颈。
3.2 从采购申请到采购信息记录,别漏掉 EKBE 和 EINA
采购订单不能凭空产生,前面通常还有采购申请环节。采购申请信息主要落在 EKAN(采购申请抬头)和 EBAN(采购申请行项目)两张表里。很多开发新手不知道这两个表的名字,等到要追溯需求来源时,才在 SE11 里翻天覆地找"Req"开头的表。这里我再强调一次:
- EBAN(Purchase Requisition Item):最常用字段是 BANFN(申请号)、BNFPO(申请行项目)、MATNR、MENGE、FRGDT(申请日期)、FRGZU(审批状态)。做采购需求分析、审批效率分析时都从这表下手。
- EKBE(Purchase Order History):这是采购订单的收货历史和发票历史的"流水账",只要有针对采购订单行的收货、发票校验、后续交货,都会在这里产生记录。想要看一个采购订单行到底来了几次货、每次多少数量、几号到的货,都查 EKBE,而不是去查 EKPO!这是新手最容易搞混的一张表。
- EINA(采购信息记录一般数据)+ EINE(采购信息记录采购组织数据):记录物料和供应商之间的采购关系数据,包括供应商的物料号、最小采购量、采购价格历史等。EINE 有 EKORG 维度,EINA 没有。查询价格参考时两张表要一起用。
我遇到过很多次这样的低级错误:想统计某个月份的采购收货情况,跑去 EKPO 里 SUM 数量。结果数据的口径完全对不上。因为在途未收货的采购订单行照样在 EKPO 里躺着,真正的实际到货量要看 EKBE 的收货行(BWERT 字段为 W 的就是收货)。所以如果你发现自己写的采购报表数量越查越多,先检查是不是用了 EKPO 而不是 EKBE。
3.3 供应商信息怎么从 LFA1 一路串到 LFM1、LFM2
供应商主数据是采购模块的另一个基石。通用数据在 LFA1(Supplier Master General Data),公司代码维度数据在 LFM1(Supplier Master Company Data),采购组织维度数据在 LFM2(Supplier Master Purchasing Data)。
实际项目中,查供应商基础信息时经常只要 LFA1 的 NAME1(名称)、ORT01(城市)、STRAS(街道)、PSTLZ(邮编)这几个字段。但要是需求涉及"这个供应商能采购哪个采购组织的物料""这家供应商当前在哪个公司代码下是否被冻结",就必须关联 LFM1 和 LFM2。
我推荐在自建报表里把 LFA1 当主表,LEFT JOIN LFM2 和 LFM1。LFM1 里的 SPERR(采购冻结标记)对于判断供应商能否下单非常关键,这个字段的值是空的通常表示正常业务状态。另外 LFA1 里有个 LOEKZ(删除标记),删除标记置 X 的供应商不能再创建新采购订单。不管查什么供应商数据,都要先加这个过滤条件,不然报表上会出现"幽灵供应商"。
4. 库存与物料凭证,你真正要盯紧的是 MKPF 与 MSEG
库存管理是 MM 模块里数据量最大、最容易出问题的部分。每一笔物料的收货、发货、转储、盘点、调拨,系统都会生成一张物料凭证,用来记录业务动作的前后变化。物料凭证同样分抬头表和行项目表,也就是 MKPF 和 MSEG。这两张表在我的日常开发中出现频率极高,几乎每个项目都会碰到。
4.1 MKPF:凭证抬头,时间维度的最佳入口
MKPF(Material Document Header)存储物料凭证的抬头信息:
- MBLNR(物料凭证号):10 位数字,和会计凭证不同,它纯粹按流水号增长,不区分年份。
- MJJAHR(凭证年度):物料凭证表是按年拆分的,跨年查询时必须把年份带上,SE16N 里直接查询老数据如果不限年度,经常卡半天才返回。
- BUDAT(过账日期):财务过账日期,月结和财务报表都按这个日期统计。
- BLDAT(凭证日期):业务发生日期。
- BLART(凭证类型):比如 WA 收货、WE 发货、WI 转储、WL 库存初始化等。
- USNAM(用户名):过账操作人员,做权限操作审计时会用到。
- TCODE(事务代码):记录了当时触发凭证的事务代码,比如 MIGO、MB1B、MB1A。
你以为查库存变动只要条件放在 MSEG 就够了?那不一定。因为 MSEG 里没有 BUDAT 这个字段,如果你要按过账日期做区间过滤,就必须先压小 MKPF 的结果集再关联 MSEG。这也是高性能查询的基本思路。很多新人就是这个细节没想通,导致一条库存流水报表查几万条记录,页面转半天。
4.2 MSEG:物料凭证行项目,几乎每个字段你都用得上
MSEG(Material Document Item)是整个 MM 模块数据量最大的一张表,没有之一。生产环境里跑 MRP、跑物料账、做冲销、做转储,都会在 MSEG 里留下行项目记录。一张凭证少则一两行,多则几十上百行。
我把 MSEG 里面的关键字段分成三组:
第一组是凭证关联字段:MBLNR、MJJAHR、ZEILE(行项目号)。查任何一张物料凭证的明细,就靠这三个字段定位。其中ZEILE 是 4 位数字,一张凭证最多 9999 行,超出这个数的极端场景很少见,但你得知道有这回事。
第二组是物料和库存对象字段:MATNR、WERKS、LGORT、UMWRK(转储目标工厂)、UMLGO(转储目标库存地)、CHARG(批次号)、SOBKZ(特殊库存标识)。如果查的是销售订单库存、项目库存这类特殊库存,还要带上 VBELN(销售订单号)等字段。
第三组是数量金额字段:MENGE(数量)、MEINS(单位)、DMBTR(按本位币计的金额)、WRBTR(按凭证币种计的金额)、SHKZG(借/贷标识,S 表示库存增加,H 表示减少)。做库存收发存汇总时,SHKZG 加上数量字段就足够了。
这里有一个特别实用的经验:MSEG 在 SE11 里看似字段不多,但一旦你在 Open SQL 里 GROUP BY 的字段组合不当,或者过滤条件没有完全压到索引上,查询速度就会直线下降。SAP 官方对 MSEG 提供了多个二级索引,其中比较常用的是基于 MATNR、WERKS、LGORT 的组合。写代码时尽量用这些字段做过滤,优先基于凭证号走主索引,避免全表扫描。
4.3 冲销与反记,MSEG 里最容易误读的干系字段
做物料凭证开发时,一定会遇到冲销场景。冲销凭证在数据库里并不是把原凭证删掉,而是生成一条数量一模一样但 SHKZG 相反的新凭证行。所以统计库存流水时,如果你只按 MATNR 和 WERKS 分组 SUM(MENGE),冲销量会自然抵消原始量,这其实是正确的。但如果不小心把冲销凭证过滤掉了,或者反过来没过滤掉原始凭证加上冲销凭证,数字就会差一倍。
判断一张物料凭证是不是冲销凭证,字段要看 STJOB 之类的追溯标记,但更直接的办法是根据业务凭证关联。MSEG 里没有直接的"冲销自哪张凭证"字段,需要看凭证抬头 MKPF 的 XSTORN(冲销标记)或者通过字段 VGART(事务类型)来判断。不同项目会用不同配置,所以接需求时一定要先问业务顾问"冲销凭证算不算在报表口径里"。这个问题我踩过不止一次,数据对不上时往往就是这种细节没确认。
5. 别把评估数据漏了,财务视角下 MBEW 与 MLIT 的角色
MM 和 FI 的集成点里,最核心的应该就是物料评估数据了。每次物料收货形成库存、每次发货结转成本,都会影响物料的价格和金额。MBEW(Material Valuation)就是承载"物料-工厂"维度评估数据的主表,它有点像财务视角下的 MARC。
MBEW 的高频字段包括:
- MATNR + WERKS + BWTAR(评估类型):联合主键。最常见的评估类型是空白的"标准评估"和"分割评估"下的各类型。做物料成本分析时,必须先搞清楚这个物料在系统里有没有启用分割评估,否则 JOIN 出来的数据会重复或者漏行。
- VBWRT(总价值):物料在当前工厂的总库存价值。
- SALK3(总库存价值,含移动平均价格相关数据):做物料单价计算时用的核心字段,等于总价值除以总库存量。
- VPRSV(价格控制标识):S 标准价还是 V 移动平均价。这个字段直接决定了物料的价格变化逻辑。
- STPRS(标准价格):标准价物料的期间基准价。
- PEINH(价格单位):比如采购 100 KG 才 100 元,那 PEINH 就是 100。
做物料成本报表时,经常要把 MBEW 的 SALK3 除以物料库存数量得到实际单价。如果只查 MARD 的 LABST 而不去算 MBEW 的价格,财务那边肯定不满意。物料账(MM 物料账)上线后,MLIT 和 MLGT 等物料分类账表会进一步承担实际成本核算的重任,在做支持物料账的成本分析报表时,MLIT 里各期间的消耗数量与实际金额对比才是最终口径。
6. 一张图理清 MM 表关系与高频查询的 SQL 实战
说了这么多表,如果不把它们之间的关系画出来,新手还是容易糊。我直接给你理一套最常见的关联逻辑:你从 SE11 里随便点开一张表,盯着字段名里的 MATNR、WERKS、EBELN、LIFNR 这几个外键,Map 的方向基本就出来了。
6.1 核心表关联关系速查
| 业务场景 | 主表 | 需要关联的表 | 关键关联字段 |
|---|---|---|---|
| 按物料查基本信息和文本 | MARA | MAKT | MARA~MATNR = MAKT~MATNR(限定语言) |
| 按工厂查物料库存状态 | MARC | MARD | MARC~MATNR + MARC~WERKS = MARD~MATNR + MARD~WERKS |
| 按采购订单查供应商和物料 | EKKO | EKPO、LFA1、MARA | EKKO~EBELN = EKPO~EBELN;EKKO~LIFNR = LFA1~LIFNR |
| 按采购订单查收货流水 | EKPO | EKBE、MSEG | EKPO~EBELN + EKPO~EBELP = EKBE~EBELN + EKBE~EBELP;EKBE 关联 MSEG 用凭证号 |
| 按物料凭证查明细 | MKPF | MSEG | MKPF~MBLNR + MKPF~MJJAHR = MSEG~MBLNR + MSEG~MJJAHR |
| 按物料查库存价值 | MARD | MBEW | MARD~MATNR + MARD~WERKS = MBEW~MATNR + MBEW~WERKS |
| 按供应商查采购信息记录 | EINA | EINE | EINA~INFNR = EINE~INFNR;EINA~MATNR 关联物料 |
这个表我自己做开发时经常对照着看,基本覆盖了 90% 的 MM 查询需求。
6.2 一个完整的库存收发汇总 SQL 样例
我在项目里最常写的库存流水汇总,大概长这样(以 ABAP Open SQL 风格为例):
SELECT mse~matnr, mse~werks, mse~lgort, mse~charg, mse~shkzg, SUM( mse~menge ) AS total_qty FROM mseg AS mse INNER JOIN mkpf AS mk ON mse~mbLnr = mk~mbLnr AND mse~mjjahr = mk~mjahr WHERE mk~budat IN s_date AND mse~matnr IN s_matnr AND mse~werks IN s_werks AND mse~sobkz = '' GROUP BY mse~matnr, mse~werks, mse~lgort, mse~charg, mse~shkzg ORDER BY mse~matnr, mse~werks, mse~lgort.这段查询有几个关键设计:
第一,通过 MKPF 的 BUDAT 做时间过滤,因为 MSEG 本身没有过账日期字段;第二,加了 SOBKZ = '' 条件排除特殊库存,除非你确实要统计在途或者寄售库存;第三,SHKZG 保留在 GROUP BY 里,这样你能分别拿到入库、出库数量,如果还要算期末结存,再在程序里做减法。
关于 SHKZG 我再多说一句:S 和 H 的语义在不同凭证类型里略微不同——收货时 S 代表库存增加,发货时 H 代表库存减少;但转储凭证经常一行 S 一行 H,分别对应转出和转入。所以做汇总前最好明确业务要求,"是否只看非转储类型的收发"要讲清楚。
6.3 查物料标准成本与库存价值的实际写法
做成本分析时,我经常要一次性把库存数量、价值、标准价格捞出来:
SELECT mrc~matnr, mrc~werks, mbe~vprsv, mbe~stprs, mbe~salk3, mbe~peinh, mrd~labst FROM marc AS mrc INNER JOIN mbew AS mbe ON mrc~matnr = mbe~matnr AND mrc~werks = mbe~werks INNER JOIN mard AS mrd ON mrc~matnr = mrd~matnr AND mrc~werks = mrd~werks WHERE mrc~werks IN s_werks AND mrc~matnr IN s_matnr.要注意,MARD 是库存地点维度,多个 LGORT 会 JOIN 出多行,如果你只想看工厂汇总,需要先对 MARD 做求和子查询。这是所有关联 MARD 的报表都会遇到的坑:明明工厂只有一条 MBEW 数据,因为库存地点有 5 个,结果就变 5 行。我一般会先写个子查询把 MARD 按 MATNR+WERKS 的 LABST 求和,再和 MBEW 关联,数据干净很多。
7. 做 MM 表开发时绕不过去的那几个坑
整理了这么多表,最后再聊几个实操里经常踩的坑。这些不是我在文档里学到的,全是项目现场总结经验。
第一个坑是单位不统一。MSEG 里存的 MENGE 是凭证单位,EKPO 里 MENGE 是订单单位,MARC 里的安全库存和批量字段又是基本单位。同一个物料可能在采购时用"千件",收货时用"件",库存时又显示"台"。在做数量汇总时千万不要直接 SUM,一定要先用 BAPI 或者函数做单位换算。我接手过一个历史报表,开发图省事直接 SUM,成品入库数量的口径整整差了 1000 倍,后来核对半天才找到原因。
第二个坑是逻辑删除数据。MARC、MARD、EKKO、EKPO、LFA1 这些表都有 LOEKZ 删除标记字段。很多报表需求要求"只要有效数据",写 SQL 时一个 X 条件漏掉,就会导致重复数据或者无效数据,最终汇总数值虚高。每次写完查询,建议先跑一遍带 LOEKZ 过滤和不带 LOEKZ 过滤的对比,看看差异到底有多大。
第三个坑是跨年查询。MKPF、MSEG 这些凭证表每年都会归档和拆分,跨年查询时 MJJAHR 条件必须显式给定,否则默认只查当前年度。做年度累计报表时,忘记了加上多个年度条件,报表数据少一大截都发现不了。我现在只要看到需求里带"去年""上年同期"这类字样,就会先检查年份条件是否写完整。
第四个坑是接口数据与口径确认。MM 的表里很多字段的值看起来相似,但口径不同。比如 MSEG 里的 DMBTR 是本币金额,WRBTR 是凭证币种金额;在汇率波动时,两个金额差异很大,用错字段的分析结果完全错误。还有 EKBE 里的 BWERT 收货标记,W 是收货,R 是发票校验,别拿到发票历史去做收货统计。
8. 最后再分享一个提升效率的日常检查妙招
最后分享一个小经验吧。我在准备一个 MM 报表开发的排障或者性能优化时,有一个固定的检查步骤。先把 SE11 里的表字段列表截图下来,然后把业务顾问给的核心"报表字段清单"逐个映射过去:物料号对应 MATNR,工厂对应 WERKS,库存地点对应 LGORT,金额对应 DMBTR/WRBTR,日期对应 BUDAT/BLDAT。映射完以后,你会发现大部分的需求其实就是从这几张核心表里挑字段、卡条件、做汇总。根本不需要把几十张表的字段背下来,真正理解哪些表是"主表",哪些表是"辅助表",开发效率会快很多。
MM 的数据库表世界看起来庞大,但核心脉络其实很清晰:物料主数据管对象,采购凭证管采购过程,库存凭证管库存变动,评估数据管价值和成本。把这四条线抓住,再配合上面说的高频表和关联字段,大部分查询开发任务都能得心应手。如果你在实际项目里也碰到了新的坑,或者发现自己常用的表和这里列的不一样,欢迎来一起补充交流。