☰
LSMW批导物料主数据全流程:从录屏到BAPI的实战指南
2026/10/14 10:57:50 网站建设 项目流程

简介:《LSMW批导物料主数据教程》是一份面向SAP业务顾问与实施顾问的实操性文档。物料主数据是SAP系统中体量最大、最重要的基础数据,手工逐条创建效率极低,而项目上又常缺少ABAP开发支持,本教程正是为解决这一痛点而编写,帮助不熟悉ABAP的读者利用LSMW独立完成批量导入。文档以Word格式提供,全文1个文件、压缩包大小920KB,内容紧凑便于随时查阅。已有3461人学习下载,热度可见一斑。教程不仅对比了Standard Batch/Direct Input、Batch Input Recording、BAPI、IDoc四种LSMW批导方式的适用场景与优劣,还重点演示了最常用的Standard Batch/Direct Input完整十三步流程,从创建项目、维护源结构、制作Excel/TXT导入模板、字段映射与默认值设置,到读取数据、转换校验及执行批处理,每一步均配有操作截图和字段整理方法,并附赠数据导入模板。读者按图索骥即可完成物料主数据的大规模导入,大幅提升项目上线效率。

1. LSMW 批导物料主数据:一张 Excel 灌进 SAP,靠的是这套流程

刚接触物料主数据维护的人,最容易在 MM01 里迷失:基础视图、工厂/存储视图、采购视图、会计视图、销售视图,一个物料翻七八个页签,录到第 30 个物料时手已经比脑子快,第 300 个物料时已经在复制粘贴里彻底麻木。LSMW(Legacy System Migration Workbench)就是为这类重复劳动而生的,它是 SAP 系统里成熟的批量导入工具,能把 Excel/文本里的物料基础数据、工厂数据、采购、会计和销售数据,按录屏或 BAPI 逻辑整批转换、校验,再放进系统。批导物料主数据是 LSMW 最高频的实战场景,几乎每个有历史数据迁移或期初数据导入的项目都会遇到。这篇教程写给两类人:一类是刚接触 LSMW、想照着步骤把几十上百个物料安全灌进去的 IT 支持与关键用户;另一类是已经会录屏,但被日期、单位、前导零和批输入会话反复折磨的实施顾问。我会从源文件准备讲到映射配置、会话执行,最后把真正值得背下来的踩坑排查讲透。

2. 先别急着录屏:三个影响 LSMW 批导物料主数据成败的选择

2.1 导入方法怎么选:录屏、BAPI 与 IDoc 各自的脾气

LSMW 支持多种导入对象类型,物料主数据批导最常见的是两种:录屏(Batch Input)和 BAPI。录屏的本质是把你手工操作 MM01 的每一步按键和填值记录下来,LSMW 把 Excel 数据回放到这段屏幕上,生成批输入会话后再执行。它的最大优点是直观:录屏时你在前台填过哪些字段、停在哪一步、报什么错,批输入时基本还原。缺点是脆弱,系统版本或界面调整后录屏容易失效,S/4HANA 新界面下部分旧录屏不再兼容。

BAPI 方式则跳过了录屏,直接调用标准函数。物料主数据最常用的 BAPI 是 BAPI_MATERIAL_SAVEDATA,它以抬头数据和若干扩展结构的形式接收字段,LSMW 里把源字段映射到 BAPI 的输入结构上,执行时逐条调用 BAPI,返回的消息可以直接对应到每行。BAPI 的优点是稳定、不依赖屏幕布局,适合大批量且字段逻辑清晰的场景;缺点是对实施顾问的 ABAP 数据结构知识有要求,出错时不像录屏那样能直观看到屏幕。

IDoc 和 Direct Input 在物料主数据批导里相对少用。IDoc 通常用于系统间集成,像 MATMAS 物料主数据分发;Direct Input 更适合财务总账等特殊对象。如果不是跨系统集中导入,我一般不建议在 LSMW 里硬上 IDoc 做物料主数据,排查链路太长。

选型我给一个简单判断:你要是只想把 Excel 里的物料基础信息和工厂信息快速导进去,而且系统版本老旧稳定,就选录屏;你要是面对几千上万条数据、要反复调字段、还要批量检查错误消息,优先考虑 BAPI。两者在 LSMW 里的配置路径差别不大,但后面字段映射的输入对象完全不同。

2.2 物料主数据的字段结构:Excel 不是随手拉的,要按视图分组

把 Excel 整理好是 LSMW 批导物料主数据的关键前戏。SAP 物料主数据不是一张大平表,而是由多个数据库表构成的:MARA 基础数据、MARC 工厂数据、MARD 存储地点数据、MBEW 会计数据、MVKE 销售数据、MAKT 物料描述等。LSMW 录屏后得到的映射目标字段,基本都带这些表名前缀。

我在准备源文件时,会按视图把列分组,而不是把所有字段塞进一个 sheet。一个便于维护的模板至少包含四组:基础数据、工厂/存储、会计、销售。基础数据组常见字段包括物料号、物料类型、行业领域、基本单位、物料组、旧物料号、净重、毛重和描述;工厂/存储组要关注工厂、存储地点、采购组、物料状态、批次管理标志;会计组主要解决评估类、价格控制、标准价格、税务类别;销售组则涉及销售组织、渠道、产品组、销售单位和项目类别组。

不是所有字段都必须出现在录屏里,这取决于 MM01 创建物料时你选择了哪些视图、物料类型是原料还是成品。物料类型会改变屏幕序列:ROH 原料的屏幕和 FERT 成品的屏幕不同,必输字段也不同。所以 Excel 模板最好按物料类型做版本,不要一个模板通吃所有类型。字段名上,录屏映射时右半边的目标字段是系统技术名,比如 MARA-MATNR、MARC-WERKS、MBEW-VPRSV,你的 Excel 表头与它们差一个字,映射时就要花时间对应。

2.3 LSMW 项目三层结构:项目、子项目、对象怎么规划

LSMW 的导航结构是项目(Project)、子项目(Subproject)、对象(Object)三层。三层各有用处,但不能乱用。项目通常是一次迁移主题,可以理解为“某工厂物料期初导入”;子项目是业务切分,比如“原料物料导入”“成品物料导入”;对象才是真正干活的最小单位,它绑定了一个导入文件、一组源字段、一组映射规则和一个批输入会话。

常见误区是把每个物料类型都建一个项目,结果项目树又长又乱。我一般习惯是一个项目下按物料类型建子项目,子项目下再按数据批次建对象,比如“第一周试导入”“全量导入”。每个对象只对应一个源文件,这一点很重要:你如果想把基础视图和销售视图放在两个 Excel 里,就不要塞进同一个对象,否则 LSMW 读取数据时会按源结构一一对应,文件关联非常混乱。

对象建立后,LSMW 菜单里会出现源结构、源字段、结构关系、字段映射、固定值转换、文件分配、读取数据、创建批输入会话这一串节点。这些节点是顺序执行的,前一个没做完整,后面按钮就是灰色。第一次做时不要跳步,按顺序走完,后面排错能省很多时间。

3. 实操:LSMW 批导物料主数据的五段式流程

3.1 源文件准备:用 Python 把 Excel 洗成 LSMW 能认的文本

LSMW 读取源文件时并不直接读 Excel,而是通过你定义的分隔符文本或 Excel 文件,但 Excel 文件对列类型、前导零和日期格式非常敏感。我一般会先做一步预处理:把多 sheet 的 Excel 合并、补前导零、统一日期格式、去重,然后输出一个 TAB 分隔的文本文件。

import pandas as pd # 读取多 sheet 的 Excel 模板 bas = pd.read_excel("mm_source.xlsx", sheet_name="基础数据", dtype=str) plant = pd.read_excel("mm_source.xlsx", sheet_name="工厂数据", dtype=str) acct = pd.read_excel("mm_source.xlsx", sheet_name="会计数据", dtype=str) # 按物料号合并成一个宽表 df = bas.merge(plant, on="MATNR", how="left", suffixes=("", "_PLANT")) df = df.merge(acct, on="MATNR", how="left", suffixes=("", "_ACCT")) # 物料号统一补足 18 位前导零 df["MATNR"] = df["MATNR"].str.strip().str.zfill(18) # 日期统一为 SAP 习惯的 DD.MM.YYYY df["DATE_FROM"] = pd.to_datetime(df["DATE_FROM"], errors="coerce").dt.strftime("%d.%m.%Y") # 去除物料号完全重复的行 df = df.drop_duplicates(subset=["MATNR"]) # 输出 TAB 分隔文件,不写表头,避免 LSMW 首行误读 df.to_csv("mm_input.txt", sep="\t", header=False, index=False)

这段脚本解决两个高频问题:一是 Excel 里物料号被当成数字,合并后 100000001 变成 1,zfill(18) 补齐后就是纯物料号应有的形态;二是日期列被读成 Excel 序列号,必须显式转成 DD.MM.YYYY。输出不写表头,因为在 LSMW 里表头字段不是必须,写了反而容易把标题行当成数据。TAB 分隔对物料描述里带逗号的场景更友好,CSV 遇到逗号就必须加引号。脚本里 merge 按物料号进行,适合基础数据、工厂数据、会计数据都只有一行的情况。

3.2 LSMW 创建项目与对象:录屏 MM01 与维护源结构、源字段

源文件准备好后,进入事务码 LSMW。初始界面左侧维护项目、子项目和对象,创建时 ID 只允许字母数字。把对象属性里的对象类型选为“BP(批输入)”,事务码填 MM01,然后点击“录屏”旁边的按钮记录一段新的录屏,或者从已有的录屏集合里导入。

录屏的关键点:录制前把系统语言和显示格式调好,把要覆盖的视图勾全。录屏操作要完整走到保存成功,不要只录到中间页面就退出,否则批输入会话执行到最后一步无法提交。录屏中所有你填过的字段,后面才会出现在字段映射的目标字段清单里,录屏没填过的字段,Excel 里有值也映射不上去。

录完之后维护源结构。物料主数据我建议不搞复杂主从结构,直接用平铺结构。把源结构设计成一个主结构,比如命名为 HEADER,下面包含物料号、类型、单位、描述、工厂、评估类、销售组织等所有字段。好处是每条数据对应一条记录,LSMW 读取和批输入会话生成都简单。一个物料对应多个工厂时,可以在 Excel 里把同一物料复制成多行,每行带不同工厂,配合录屏中 MM01 的完整流程即可逐个建立工厂视图。

然后维护源字段,把 Excel 表头名称挨个加进去。源字段名可以和表头一致,尽量用大写字母和数字,不要用中文名,因为后面映射界面全是技术字段,中文名对应起来非常吃力。源字段的类型和长度也要注意,物料号字段长度设 18,描述字段长度设 40,数量字段长度设 13。

3.3 字段映射与固定值转换:把 Excel 列对应到系统屏幕字段

源字段建好后,进入字段映射和转换规则。界面上半部分是源字段,下半部分是录屏产生的屏幕字段,你只需把两边拉出对应关系。这个步骤没有公式可背,核心是把 Excel 列和系统字段逐项对应,常见对应关系可以这样检查:基础数据视图对应 MARA 表的字段,描述对应 MAKT-MAKTX,工厂数据对应 MARC 表字段,会计数据对应 MBEW 表字段,销售数据对应 MVKE 表字段。

不是所有 Excel 列都要映射,也不是所有屏幕字段都必须映射。屏幕字段里带“值请求”“保存”这类按钮动作不需要处理,LSMW 会按录屏原样执行。你真正要关注的是录屏中出现过的可输入字段,比如物料号、物料类型、基本单位、净重、工厂、评估类、标准价格。字段如果显示为灰色,说明在录屏中它没有出现在屏幕上,通常是视图没选全或物料类型把它隐藏了。

固定值转换在物料主数据批导里特别有用。行业领域基本是固定值,物料类型在同一个对象里也可以固定,价格控制字段如果不区分标准价和移动平均价,直接固定为 S 或 V。使用固定值转换把这些字段从 Excel 里拿掉,让映射更清晰。转换规则还可以处理单位,比如 Excel 里写“PCS”,系统里要的是“PC”,在转换规则里做一个字符替换即可。

3.4 读取数据、显示校验与创建批输入会话

字段映射完成后,接下来是文件相关操作。先在文件节点里创建文件,指定路径,然后分配文件到源结构,注意文件里的字段顺序必须和源字段定义顺序一致。这一步不匹配,后面读取数据就会错位,而且不会报明显错误,只会在运行批输入会话时产生一堆垃圾值。

读取数据前建议先勾选“文件开头跳过多少行”的选项,防止把标题行读进数据。点击读取数据后,系统会告诉你读取了多少条、错误多少条。批导物料主数据时我会立即去“显示读取数据”页面,随机抽查几条,重点看物料号是否补足了 18 位、日期是否是 DD.MM.YYYY、数值字段是否还是文本。数据有问题在这里发现成本最低,一旦生成批输入会话,排查就要进入 SM35。

确认无误后创建批输入会话。LSMW 会按源结构逐条生成 BDC 记录,会话生成后可以继续处理下一个对象,也可以立刻执行。如果用的是 BAPI 对象类型,则没有创建批输入会话这一步,而是直接执行 BAPI,返回的消息会记录在 LSMW 的数据采集日志里。两种方式我建议初次都先小批量验证:录屏方式生成会话后在 SM35 里前台执行,BAPI 方式在 LSMW 里执行前限定数据范围。

4. LSMW 批导物料主数据的参数与转换规则:日期、单位、前导零

4.1 前导零和物料号:为什么系统里物料号总缺零

物料号是最容易出问题的地方。SAP 内部存储的物料号默认 18 位,数字型物料号左补零,比如外部编号 1001 在系统里实际是 000000000000001001。Excel 里如果物料号列是数值格式,1001 会被存成 1001,进到 LSMW 源文件后也是 1001,执行批输入时系统按内部物料号处理,找不到对应物料或创建出错误物料。

解决办法有两个层次。第一层是源文件侧:Python 脚本里用 zfill(18) 统一补齐,或 Excel 模板中把物料号列设置成文本格式,手输时不要带格式。第二层是 LSMW 侧:源字段定义时把物料号字段长度设为 18,在转换规则中使用前导零补位转换。需要注意的是,如果你导的是外部给号物料类型,物料号可能混合数字和字母,zfill 只对数字字符串有效,字母开头的物料号不要机械补零。

4.2 日期格式:DD.MM.YYYY 还是 YYYYMMDD

物料主数据中日期字段不多,但每个都关键,比如生效起始日期、到期日、后续期间等。LSMW 读取文本文件时不会智能识别日期,它把源字段内容原样传递给录屏。Excel 里写的 2025-06-13 可能被 Excel 转成 45300 这样的序列号,或者读出来后是 2025-06-13 文本,SAP 屏幕字段接受的格式取决于系统日期格式设置,常见的是 DD.MM.YYYY 或 YYYYMMDD。

我习惯在 Python 预处理阶段统一转成 DD.MM.YYYY。转换时用 pdate.to_datetime 加 errors="coerce",遇到无法解析的值会变成空值,这样后续读取时可以发现脏数据。转换规则里也可以写日期格式,但 LSMW 的日期转换规则比较基础,一般只处理“年-月-日”到日期的映射,不如源文件侧转换直观。另一条经验:不要在 Excel 里手动输入日期,也不要让 Excel 自动格式化,全部通过脚本转文本,这样源文件里没有隐藏格式。

4.3 单位与数量:基本单位、销售单位和净重毛重

单位是物料主数据里又一个高危区。Excel 里写“PCS”“pcs”“ST”“KG”“千克”,系统里要的唯一值可能是“PC”或“KGM”。录屏执行时单位字段值不合法,批输入会话就会报“字段值无效”或直接把会话标红。我一般整理一个单位映射表,在 Python 脚本中把 Excel 值统一映射为 SAP 内部单位代码,比如“PCS/pcs/件”映射为“PC”,“千克/KG/kg”映射为“KGM”。

数量字段的精度也要统一。基本单位字段 MEINS 是单位代码,净重 NTGEW 是数量加重量的组合概念,录屏里净重字段旁边通常还有一个重量单位字段 GEWEI。如果只给净重而不给重量单位,保存时可能提示单位缺失。最佳做法是 Excel 模板里同时留净重和重量单位两列,映射到录屏的对应字段。标准价格字段也要注意小数位数,按物料类型的货币小数位设置,不要让脚本把浮点数格式化成科学计数法。

4.4 必输字段与视图选择:字段不映射会让会话直接锁死

MM01 创建物料的必输字段由物料类型、行业领域和视图选择共同决定。同一个屏幕在不同物料类型下,必输字段完全不一样。原料物料必须填物料组和评估类,成品物料可能还要填利润中心、产品组等。你在录屏里如果走了正常创建流程,必输字段会自动触发请求,但源文件中没有值,批输入执行时系统也会给出同样提示并停在那个字段上。

LSMW 判断数据是否合法是在创建批输入会话时完成的,字段缺值会在会话中体现为空白字段,执行时系统弹红。规避方式是在小批量验证阶段把必输字段逐一核对。固定值转换非常有用:物料组、行业领域、价格控制这类字段可以在 LSMW 里直接固定,既减少 Excel 列数又防止填错。但要小心,固定值转换会让整个对象的所有物料都使用同一个物料组,如果 Excel 里不同物料要不同分组,就不能用固定值,必须作为源字段维护。

5. LSMW 批导物料主数据避坑:五条高频踩坑记录与排查方法

5.1 现象:读取的行数和 Excel 对不上,数据少了半截

第一次做物料主数据批导的人,常会遇到 LSMW 显示读取 3000 条,但 Excel 里明明是 3200 行。少掉的多半是文件尾部的空行,也可能是字段值里包含分隔符把一行拆成了两行。我遇到过最隐蔽的情况:物料描述里带了换行符,TAB 分隔文件把换行符也带进字段,LSMW 把它当成了新纪录。

原因在源文件自身,LSMW 不会帮你清理内容。解决方法是预处理时清洗字段中的换行和制表符,Python 里用 str.replace 或正则替换掉 \n、\r;文件末尾不要留空行,读数据前在文件配置里设置合适的起始行。打开显示读取数据,逐条核对最后几行,如果最后几条记录字段错位,基本就是分隔符问题。

5.2 现象:批输入会话执行后,系统提示物料编号不存在

这条非常扎心,因为会话执行完,错误记录里报“物料编号不存在”。看到这个提示,我的第一反应不是去查物料是否存在,而是去查源文件里的物料号前导零。Excel 里物料号看起来是 100000001,实际存的是数字 1,LSMW 读到后传给了 MM01 录屏,录屏在这个屏上找不到这个内部编号的物料。

这种错误不会阻塞整批会话,其他没有前导零问题的物料可能会成功,导致数据一半成功一半失败,处理起来更麻烦。解决方式是严格执行源文件侧 zfill(18),并在 LSMW 显示读取数据后进行抽样。能把这个问题阻断在“创建批输入会话”之前就不要拖到执行,否则你还要在 SM35 里逐条删除错误会话。

5.3 现象:重复导入导致“物料已存在”

当 Excel 里同一个物料号出现两次,或者源文件中物料号相同但工厂不同,LSMW 会为每一行都生成一条 BDC 记录。两次创建同一物料,第二次执行时 MM01 直接报“物料已存在”。原因多半是数据源合并时没有去重,或者业务上确实需要一物多工厂,但复制行时没有意识到录屏本身是“创建物料”而不是“创建工厂”。

解决思路:如果目标是“第一次创建物料”,就去重后再生成会话,物料号相同且工厂不同的行只保留一行,后续工厂数据用 MM01 扩展视图的录屏处理。如果一定要在一个对象里处理,可以把录屏改录成 MM01 的“扩展物料”流程,这会增加录屏复杂度。我建议拆成两个对象,创建物料一个、扩展工厂一个,逻辑清晰,也方便后续复用。

5.4 现象:批输入会话状态黄灯,双击字段出现问号

SM35 里查看会话,有的记录状态不是绿灯,双击记录后屏幕字段上出现问号,表示录屏里没有这个字段,或者系统认为该字段在当前屏幕不存在。出现这种问题的字段,往往是你后来手写在映射关系里的字段,录屏时它根本不在屏幕上。

原因出在录屏阶段视图或屏幕序列没有包含该字段。解决方法是回到 LSMW 重新录屏,在 MM01 中把对应视图勾上,或在字段选择里把该字段设为可选项。如果录屏已经废弃,也可以考虑不用这个字段,或者干脆把对象切换成 BAPI,用 BAPI 方法不受屏幕字段限制。遇到问号不要硬在 SM35 里改值,那只是临时绕过,下次执行还会再犯。

5.5 现象:会话执行速度快,结果却是一半成功一半错误

物料主数据批导跑完,SM35 日志里错误率很高时,最怕的是只盯着错误记录看,而不看成功记录是否真的成功。批输入会话执行是一种模拟前台操作,物料可能在最后一个屏幕保存时报错,也可能在中间某一步因为缺失必输字段而中断。更容易忽略的是成功记录虽然提交了,但有些字段被默认逻辑替换掉了,比如单位、评估类和税分类。

原因是数据量大后没有做小批量验证就直接投入。我的习惯是每批次先取 20 条做前台执行,亲眼确认保存成功且字段正确,再放大数据量。SM35 里的日志可以双击错误记录,查看具体字段和值;对成功记录也要抽样看 MM60 物料清单,确认工厂、视图、字段都落到位。只靠会话绿灯和错误记录数判断成败,容易漏掉逻辑层面的错误。

6. 会话复盘与模板复用:LSMW 批导物料主数据怎么越做越顺

批导完成不等于工作结束,复盘这一步我从来不敢省。SM35 执行完后,回到批输入会话列表,看每个会话的“已插入/更新/错误”统计。错误的双击进去逐条排查,正确的也要抽样打开 MM60 或 MM03 核对关键字段。很多批导问题不是错在 LSMW 映射,而是源数据本身就是脏的,复盘时要把错误归类到源文件和映射规则两个层面,下次改进才有方向。

模板复用是 LSMW 值得长期投入的方向。一个项目下跑通的录屏和字段映射,可以通过 LSMW 复制对象创建新对象,直接修改源文件分配和固定值转换,就能从原料物料批导复用为成品物料批导。我一般会保留一个不绑定实际业务数据的最小字段版本,每次新项目导入时复制一份再做增量修改,把前导零转换、日期转换和单位映射固定写在脚本里,避免重复踩坑。

另外,LSMW 里面“固定值转换”和“用户定义例程”是可以沉淀的。用户例程里写的单位映射、字段清洗逻辑,能在多个对象间复用,比每个对象重新维护转换规则可靠。文件命名和项目结构也建议规范化,项目 ID 用迁移主题缩写,子项目按物料类型或模块划分,对象名带版本和日期,会话执行时你能一眼看出哪个对应哪个。

我自己的教训是:有一段时间批导物料图快,读取后不看数据就直接生成会话,总以为 LSMW 会帮我把关。后来一次三千条数据里混进了一整列错误单位,执行完才发现大部分记录卡在单位字段。从那以后,我的习惯是先 20 条前台试跑,再全量后台执行,每次都在“显示读取数据”里抽查物料号、日期和单位三个字段。这个习惯让我躲过了很多次返工,也让我对 LSMW 的哪一步最该慢下来有了明确判断。希望这篇教程能帮你在批导物料主数据时少走这些弯路,一次就跑通。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询