干过SAP项目的朋友,十有八九都碰过LSMW。这个界面堪称复古的大块头,虽然第一眼并不讨喜,但它在数据导入这件事上,确实是绕不开的免费利器。从物料主数据、客户主数据,到财务期初余额、采购订单,只要不是上HANA之后全面转S/4的数据迁移框架,多数项目组还是会优先甩给你一个LSMW让你去批导。今天不聊BODS,也不聊自开发报表导入程序,就专讲LSMW本身:数据批导怎么做,默认值在哪里配,多余字段怎么删,以及最容易被问到的问题——开发机建好的LSMW工程,怎么完整搬到生产机。
这篇文章适合刚接触LSMW的模块顾问,也适合给那些已经在用LSMW但始终没搞懂“固定值”“删除字段”和“跨客户端传输”的运维同事。我会把步骤尽量写细,并把我踩过的坑一并讲清楚。
1. LSMW的核心思路与方案选型
1.1 LSMW到底是个什么工具
LSMW全称Legacy System Migration Workbench,中文常叫“旧系统数据迁移工作台”,本质是一个基于SAP标准框架的数据导入平台。它的思路很简单:把你Excel、CSV、TXT里的外部数据,按你预先定义好的规则,转换成SAP能识别的批输入会话或者BAPI/IDoc调用,最终把数据写进系统。
你可以把它理解成一条“翻译管道”:外部数据进左端,中间经过你的转换规则,右端出来的就是SAP能正常处理的数据结构。LSMW不是SAP标准功能模块,而是每个SAP系统里都自带的一个开发工作台工具,事务代码就是LSMW。
这工具最大的优势是免费、标准、不需要写ABAP代码,只要你会录屏幕、会配置映射关系,就能在几个小时内从零开始做出一个批量导入工具。而它的局限性也很明显:界面老旧,操作逻辑偏“按部就班”,第一次用的人常常找不到按钮在哪;它在处理特别复杂的业务校验时也比较吃力,真遇到需要复杂增强的场景,最终还是要回到ABAP开发。
1.2 五种记录方式怎么选
打开LSMW,第一步就是维护对象属性,界面里会让你选择迁移方式,常见的有:
| 方式 | 说明 | 适用场景 |
|---|---|---|
| Batch Input Recording(录屏) | 录一次标准事务操作过程,再循环回放数据 | 操作简单、屏幕字段固定的主数据导入 |
| BAPI | 调用SAP标准BAPI接口 | 数据量较大、有现成BAPI的业务对象 |
| IDoc | 通过IDoc接口接收数据 | 有外围系统做接口时常用 |
| Batch Input + BAPI | 录屏和BAPI结合 | 某些录屏字段无法覆盖时 |
| Direct Input | 老式的直接输入程序 | 现已不推荐,新项目很少用到 |
我最常用的还是Batch Input Recording,也就是录屏。因为它对顾问的门槛最低,录一次屏就能处理大量数据。尤其是MM01、XK01、FD01这些屏幕逻辑复杂的T-code,直接用录屏思路最稳妥,因为你能完整看到每个屏幕字段在做什么。
但录屏方式也有一个毛病:录出来的目标结构往往会多出很多你根本不需要的字段,比如系统内部自动跳出来的状态字段、计量单位附加字段。这正好引出后文要讲的“多余字段怎么删除”——这不是技巧问题,而是录屏方式天然带出来的麻烦。
1.3 为什么还在用LSMW
很多新入行的顾问会问,现在有S/4HANA迁移工具、有RAP开发新程序、有各种国产导入工具,为什么还在用LSMW?
我的看法是:项目上多数数据迁移是一次性的,或者频率很低,专门开发一套ABAP报表导入程序成本高、周期长;而LSMW是系统自带能力,所有实施顾问基本都会一点,不需要额外授权,也不用写代码。有些客户安全策略严格,不轻易往生产系统传自定义程序,这时候LSMW反而成了最合适的方案。
另外,LSMW的跨客户端传输能力其实很有意思。很多顾问把LSMW在开发机配置好后,不知道怎么搬到测试机、生产机,于是跑到生产机重新录一遍屏,白白浪费时间。这事说到底还是没理解LSMW的存储机制——它把配置存在数据库表里,而不是程序里,所以只要把这部分数据传过去,整个工程就完整带过去了。这个思路后面第四章我会展开讲。
2. 数据批导全流程拆解
2.1 开工前的准备工作
别急着打开LSMW录数据,先把准备工作做扎实。我一般按这个顺序来:
- 明确要导什么:主数据还是业务单据,涉及哪些T-code,哪些字段是系统必填,哪些字段可以留空。
- 准备源数据文件:推荐用TXT(制表符分隔)或CSV格式,第一行放字段名,后续行放数据。LSMW读文件时不挑编码,但尽量用UTF-8或ANSI,避免中文乱码。
- 在系统中先跑一遍手工记账:比如要导入供应商主数据,就用XK01手工创建一个供应商,记录下有哪些必填项、哪些字段有默认值、哪些字段会自动校验。
- 理清映射关系:源文件里的每个字段对应SAP屏幕上哪个字段,这个映射关系越早想清楚,后面越省事。
很多新手上来就直接录屏,录完发现源字段和目标字段对不上,又返工重录,问题就在于准备工作没做足。尤其要提醒一点:源文件里最好只放你真正需要导入的字段,多余列能砍就砍。文件里堆太多无用列,不仅映射麻烦,后期排查问题也更困难。
2.2 LSMW的标准15步流程
LSMW的批导流程基本固定,标准路径是这样的:
- 进入LSMW事务代码。
- 创建项目Project、子项目Subproject、对象Object。
- 定义对象属性,选择录屏或BAPI方式。
- 维护源结构(Source Structures)。
- 维护源字段(Source Fields)。
- 维护结构关系(Source Structure and Field Relations)。
- 维护字段映射和转换规则(Field Mapping and Conversion Rules)。
- 维护固定值、事务、规则(Fixed Values, Transactions and Rules)。
- 读入数据(Read Data)。
- 显示读取后的数据(Display Read Data)。
- 转换数据(Convert Data)。
- 显示转换后的数据(Display Converted Data)。
- 创建批输入会话(Create Batch-Input Session)。
- 运行批输入会话(Run Batch-Input Session)。
- 查看批输入会话日志(Analysis)。
这15步看起来多,实际上可以分为三阶段:前8步是“配置定义”,第9到12步是“数据处理”,第13到第15步是“会话运行与检查”。
第一次用的人不要被这15步吓到,每一个界面理解透之后,操作起来很快。真正花时间的不是“点按钮”,而是字段映射和转换规则的调试。
2.3 实操:从创建工程到读入数据
这里我按录屏方式走一遍,大家跟着做。
在LSMW初始界面输入项目名称、子项目名称、对象名称,然后回车,会进入项目列表。新建项目时,系统会让你维护简短描述,描述建议带上日期或数据场景,比如“供应商主数据期初导入202508”,方便以后区分。
接着双击“定义对象属性”,选择录屏方式“Batch Input Recording”,系统会让你输入录屏的T-code。比如导入供应商主数据,就输入XK01。保存后进入录屏界面,正常做一次手工创建供应商的操作,录完保存,录屏会被保存下来。
然后依次进入源结构和源字段定义。源结构一般按业务逻辑分块,比如“基础数据”“公司代码数据”“采购组织数据”等。源字段就是源文件里要导入的字段。我把它们维护好之后,系统会要求维护结构和字段的对应关系。
再到字段映射界面,这里你会看到左边是源字段,右边是录屏产生的目标字段,中间通过映射关系连起来。双击一行,可以定义转换规则、固定值。把源文件中的“名称1”拖到目标字段的“名称1”上,把“街道”拖到“街道”上,逐个对应。如果有无法映射的字段,可以留空。
全部映射完成后,回到LSMW主界面,执行“读取数据”,选择本地文件,LSMW会把文件读入内存。接着执行“显示读取数据”确认数据是否读成功。然后执行“转换数据”,确认转换后的数据格式是否符合预期。没问题的话,创建批输入会话,LSMW会生成一个可以处理的会话编号。
2.4 跑批导会话与日志检查
创建会话后,直接进入SM35事务代码,能看到刚刚生成的外部会话。选中会话点“处理”,系统会逐条回放录屏,把数据写进SAP。
这里有个细节要特别注意:LSMW只负责把数据放到批输入会话里,真正往数据库写数据的是SM35。所以SM35的日志才是最终结果,LSMW前面转换得很好,不代表SM35一定能顺利执行。
SM35跑批时,建议勾选“显示错误”或“前台处理”,先看几条数据是否能通过校验。如果全绿,再考虑后台大批量执行。一旦出现红叉,双击查看报错文本,绝大多数问题都在字段格式、必填项缺失、后台配置不完整三个方面。
3. 默认值配置与多余字段删除
3.1 默认值配置的三种做法
默认值配置是LSMW批导中非常实用的一项功能。很多情况下,源数据里根本没有某些字段,但这些字段在屏幕上是必填的,或者业务上必须固定填一个值,这时候就不需要去找用户补数据,直接在LSMW里配置固定值就行。
我常用的方法有三种:
方法一:在字段映射界面配置固定值
还是在“维护字段映射和转换规则”里,双击目标字段那一行,在下方的转换规则区域,把类型选为固定值,然后输入你要写的值。保存后,该字段在所有数据中都会填充这个固定值,源文件里有没有这个字段都不影响。
方法二:在源结构中增加一个常量字段
如果你希望这个默认值在后续统计、日志里能看到,或者不想在映射界面里处理,可以在维护源结构时,不把默认值作为一个源字段,而是在“维护固定值”步骤中定义。这种方式更接近“参数化配置”,在那个固定值界面里,能维护事务代码、功能模块参数等。
方法三:在转换规则中写赋值代码
当你需要在导入时做一点判断,比如“如果物料组为空,就填默认物料组”,可以在转换规则的ABAP代码区域写一句赋值。这个对不熟悉编程的顾问稍有点门槛,但好处是灵活,能处理带条件的默认值。
对于普通业务场景,我最推荐方法一,因为最直观,也最容易维护,后面谁接手这个LSMW工程,在里面双击一下就能看到默认值是什么。
3.2 默认值配置的注意事项
默认值看着简单,用不好会出问题。我列举几个自己踩过的坑:
- 固定值类型必须和目标字段的数据类型匹配。比如账户组字段一般是3位字符,你固定填一个数字“1”虽然能保存,但执行时系统报错“值无效”,排查起来容易一头雾水。
- 固定值会覆盖源文件的值。如果你源文件里其实有这一列,但映射时又给这个目标字段配了固定值,那么源文件里的值会被固定值覆盖,这个需要特别注意。
- 固定值适用范围是整个读入过程,不是个别行。如果你需要对某些行填“A”,某些行填“B”,那就不能简单用固定值,而是在源文件里增加一列,或者用转换规则做判断。
- 配置了固定值不代表屏幕会自动显示。你在LSMW映射中配置了固定值,SM35回放时还是会走录屏的逻辑,有些字段即使固定值已经填上,如果屏幕上有联动校验,比如“填写字段A后必须填写字段B”,你漏配了B,照样报错。
3.3 多余字段的三种删除方式
“多余字段如何删除”这个需求,我基本在每一个LSMW项目里都会碰到。数据源文件里往往有几十列,真正要导入的就十几列;录屏的时候更离谱,一个供应商主数据可能录出上百个目标字段,实际用到的不到一半。
先说清楚一个概念:LSMW里删除字段有三个层级,分别是源字段、目标字段映射、录屏结构字段。不同场景删的内容不一样。
场景一:源文件列太多,但不想导入这些列
这个最简单,在维护源结构时,把需要的字段维护进去就行。LSMW读取文件时,源文件多出来的列不会自动进入源字段列表,相当于天然被忽略。前文我强调过,源文件最好只保留必要列,原因就在这里。
场景二:源结构里字段建多了,需要删除
在“维护源字段”界面,选中多余的字段,点删除按钮。如果系统提示“该字段已被分配”,说明你已经在字段映射里使用了它,需要先去字段映射界面把对应的映射关系删掉,再回来删除源字段。
如果执行过“读取数据”,有时系统会锁定不让删。我的做法是重新执行一次“读取数据”,或者把处理状态重置掉,再删除字段。这属于LSMW比较别扭的地方,它的操作顺序性很强,不是想改就能随时改。
场景三:录屏产生的目标字段多,不想导入
这种情况最多见。录屏时会录进很多系统字段、状态字段,比如“排程”“状态标识”等,你并不需要在批导中手工维护,但LSMW把它当成目标字段列出来了。
处理方式:在字段映射界面,直接用菜单中的“删除映射”功能,把这条映射删掉,让目标字段留空。LSMW允许目标字段不映射任何源字段,录屏回放时该字段保持系统默认值,不会被你的文件影响。
如果你连“看到它”都觉得碍眼,想把目标字段本身从结构里去掉,那就比较复杂了。因为目标结构是录屏自动生成的,LSMW没有提供直接删除目标字段的功能,强行删可能会导致会话回放异常。我的建议是:目标字段多余就让它待着,只要映射关系里没有它,就不影响结果。
3.4 一个实例:供应商主数据导入时的默认值与字段清理
我最近在做一个供应商主数据导入,就同时遇到了默认值和多余字段两个需求。
导入场景是XK01创建供应商,源文件里有名称、街道、城市、国家、电话等字段。但部分公共字段,比如采购组织、账户组,所有供应商都是同一个值,不适合要求用户逐行填写。我在字段映射中筛选出采购组织、账户组,双击后直接设置为固定值,比如采购组织固定为“0001”,账户组固定为“0001”。这样源文件就不用包含这两列,文件也清爽很多。
同时,录屏时录出来一批用不到的字段,比如“删除标记”“集中审批”“权限组”等。我在字段映射中把不需要的字段对应的映射行全部删除,保留真正需要的映射。整个批导跑下来很干净,SM35日志全绿,没有一条报错。
4. 跨客户端传输方法
4.1 为什么要传LSMW工程
LSMW工程一般是在开发机或配置机里做的,做完数据量测试没问题后,最终要在生产系统里跑。这时候问题就来了:LSMW不是标准的开发对象,不能像ABAP程序一样直接进传输请求,很多人就在这一步卡住。
实际上,LSMW的配置是存储在数据库表里的,我们要做的就是把这张配置表的数据打包进传输请求,然后搬到目标系统。SAP自己也提供了分发和导出导入两种方式,下面一个个讲。
4.2 方案一:用LSMW自带分发功能
这是最正统的方式,也是我优先推荐的方式。在LSMW初始界面选中要传输的项目和对象,然后点击菜单栏中的“对象”或“跳转”,找到“分发”功能。不同版本菜单位置略有差异,但关键字一般是Distribute。
点开分发功能后,系统会弹出一个传输请求选择界面,你可以新建请求,也可以选现有请求。确认后,LSMW会自动把当前对象相关的配置表数据写入这个请求。然后在目标系统,用STMS把请求导入。
在目标系统导入完成后,进入LSMW看看项目和对象是否已经出现。如果看不到,刷新一下或检查请求是否完整导入。这个方法优点是能把LSMW对象完整地一次性搬过去,源结构、字段映射、转换规则、固定值全部保留,基本不需要再调整。
4.3 方案二:导出导入文件
如果不方便用传输请求,或者你的权限不支持创建传输请求,可以用LSMW自带的导出导入功能。
在LSMW对象列表中选中对象,找到“导出”功能,系统会把当前对象导出为一个本地文件。然后在目标系统的LSMW中,新建或者选择对象后,使用“导入”功能,把这个文件导进去。
这种方式不需要传输请求,操作门槛低,但有一个明显坑:源数据文件不会被一起导出。也就是说,你导出的只是LSMW的配置定义,不包括你要导入的那个Excel或TXT文件。目标系统里导入完LSMW工程后,必须在读取数据步骤重新指定本地源文件路径。
另外,导出导入过程中,不同版本的LSMW兼容性一般没问题,但如果你跨的是ECC和S/4,我建议还是用传输请求方式,因为S/4和ECC屏幕结构有差异,录屏对象导入后可能需要重新验证一下。
4.4 方案三:快速重建法
第三种方法听起来不太“技术”,但在实际项目中非常常见:直接在目标系统重新做一遍LSMW。
很多顾问觉得重新录屏很浪费时间,其实如果只导一个对象,源结构、字段映射都比较简单,重新录一遍屏也就是20到30分钟的事。这个方法尤其适合目标系统是生产系统、但传请求流程繁琐的情况。
我习惯的做法是:在开发机的LSMW里,把字段映射界面截图,把源文件模板准备好,然后到目标系统照着截图快速新建工程、录屏、映射、读文件、建会话、执行。虽然看起来不够“自动化”,但胜在不会污染传输请求,也不需要依赖权限,反而更省心。
4.5 传输后的检查清单
无论用哪种方式传输,到了目标系统之后,我建议按这个清单过一遍:
- 检查目标系统SAP版本与源系统是否一致。录屏在ECC录的,到了S/4很可能屏幕字段有变化,需要重新验证。
- 检查后台配置。目标系统与源系统的必填字段、字段状态组、编号范围等如果不同,批导可能直接报错。
- 确认源数据文件路径。LSMW读数据时用的是目标系统的应用服务器路径或本地路径,传输后要重新指定。
- 建议先在目标系统建一个小批次测试数据,最多10条,跑一遍SM35,确认没有后台校验问题,再放开全量导入。
- 传输请求如果不是同一个系统链路的,注意STMS队列是否正常,避免请求没有真正到达目标系统。
5. 常见问题与排查技巧
5.1 报错速查表
LSMW的报错信息往往比较抽象,我整理了一张速查表,方便大家对照:
| 现象 | 常见原因 | 解决思路 |
|---|---|---|
| 读取数据时“找不到文件” | 文件路径不对或文件没有传到应用服务器 | 确认路径、文件名、文件是否已上传 |
| 转换数据报“字段长度过长” | 源文件字段值超出目标字段域长度 | 检查数据,或对源字段做截断处理 |
| 创建会话成功,SM35执行后红叉 | 必填字段缺失、后台配置不符、字段状态错误 | 双击红叉查看详细报错,逐个修正 |
| 映射界面找不到某目标字段 | 目标字段可能被录屏结构隐藏 | 用搜索功能,或重新录屏 |
| 删除源字段提示“已分配” | 该字段已建立映射关系 | 回到字段映射删除对应关系,再删源字段 |
| 跨系统导入后对象消失 | 请求未完整导入,或未刷新对象列表 | 用SE10检查请求,重新导入 |
5.2 我的几条避坑经验
LSMW这个工具本身不复杂,但实际用起来容易在细节上翻车。我分享几条自己长时间积累的经验。
第一,录屏时动作一定要“干净”。我见过有人录XK01时顺便改了个公司代码全局参数,或者录屏过程中点了一下“附加”菜单里的东西,结果批导时几百条数据都带上了这个多余动作。录屏尽量一次走完正常流程,不要往屏幕上添加额外操作,尤其不要修改默认勾选项。
第二,源文件字段名前不要带空格或特殊符号。LSMW读文件时按列名识别字段,如果文件第一行某些列名有空格、换行符或特殊字符,字段匹配时容易出怪问题。最好全部用英文字母、数字、下划线组成。
第三,数据量大的时候一定要分批建会话。我一般一次读几千行,然后在创建会话前按数量拆分成多个会话,每个会话控制在500到1000条之间。这样即使某个会话报错,也只影响那一批,不需要全部重跑。
第四,SM35执行之前,先在“读入数据”和“显示读取数据”里把数据仔细看一遍。这一步很多人直接跳过,结果到了SM35才报错,浪费时间还不好定位。数据行数少时可以随机抽查几行,大数量时排序看关键字段有没有明显错位。
第五,最后也是最重要的一条:做任何跨客户端传输前,先在开发机做好备份。导出的LSMW配置文件、源数据文件、传输请求编号,这些都单独归档到一个项目目录里。因为生产系统导入后一旦需要调整,你很可能要回到原环境去修改再重新传输,没有备份就只能靠记忆重建,那太痛苦了。
我在实际项目中还发现,很多同事对LSMW的“固定值”和“删除多余字段”概念混淆,以为固定值就是可以“忽略”字段,删除字段就是“不用管它”。这两个其实完全不同:固定值是告诉系统“这个地方填一个固定内容”,删除映射是告诉系统“这个字段你不要管”。时序上,固定值的优先级更高,如果同一个目标字段既配了固定值,又有源字段映射,固定值会覆盖映射值。所以大家配置完一定要在“显示读取数据”里面检查最终结果,确认每个字段最终取值是不是符合预期。
如果你准备在公司内部推广LSMW做数据批导的统一工具,我建议做一个小规范文档,规定好源文件命名规则、字段命名规范、固定值使用规范,以及传输请求的申请流程。毕竟LSMW这工具简单归简单,但多个顾问各自用各自的方式操作,最后产生的一堆对象、录屏、工程会很乱,事后清理比新建还麻烦。