简介:《SAP两种批处理工具使用方法详解(BDC&LSMW)》是一份面向SAP顾问、实施及运维人员的实用文档,重点解决批量数据录入、数据迁移及重复事务码操作中的效率问题。资源包内为单个docx文档,大小约2.49MB,可直接在常用文档软件中打开阅读。文档先从BDC入手,讲解SHDB录屏生成脚本、前台与后台执行方式、批量脚本生成及邮件合并技巧;随后转入LSMW,梳理操作界面、分步向导、源结构与目标结构映射、数据转换规则及实际转换流程,并结合物料账期开启等实例加以说明。文中还配有界面截图、字段注释及批量处理注意事项,有助于读者快速定位关键配置并减少重复操作中的失误;对两种工具的适用边界也做了对比,便于按业务场景合理选型。已有1748人学习使用,适合需要掌握SAP批处理工具或涉及数据迁移项目的从业者。
1. SAP 批处理必须先分清 BDC 和 LSMW:录脚本和传数据根本是两件事
做 SAP 运维或者上线支持的人,迟早会撞上批处理这个词。物料主数据要批量建、客户主数据要迁移、财务凭证要成批导入,手工一条条敲事务代码不仅慢,月底那几天能让人盯屏幕盯到眼干。市面上提到的批处理工具主要就是 BDC(Batch Data Conversion,事务代码 SHDB)和 LSMW(Legacy System Migration Workbench),但很多人一开始容易搞混:以为 LSMW 是 BDC 的升级版,实际两者解决的是不同层面的问题。BDC 是录屏回放,把前台操作录下来再批量重放,适合小规模、一次性、业务操作型的批处理;LSMW 是数据迁移工作台,面向文件到 SAP 数据结构的转换,适合大批量、带映射关系的主数据和初始数据导入。选错工具后果很直接:BDC 去跑几千条主数据,脚本执行时间长、错误定位靠盯日志;LSMW 去处理十几条账期调整,光搭源结构目标结构就够折腾。这篇就按两种工具分别拆穿,讲清楚每一步怎么操作、参数怎么设、哪些地方容易翻车。
2. SHDB 录屏重放:用 MMPV 开物料账期的完整操作流
2.1 SHDB 脚本结构:三个屏幕信息和一个被忽略的提交后继续标志
先明确 BDC 的适用边界。BDC 的核心机制是把事务代码操作的每一屏字段变化记录成脚本,执行时由系统按脚本逐屏回填数据并触发事件。实际使用主要集中在两类场景:一类是少量重复操作,比如逐个修改订单抬头字段,手工改脚本里的值再处理;另一类是批量操作,通过导出脚本模板,用 Office 邮件合并或文本处理工具生成几十上百个执行脚本,再导入执行。BDC 不适用于需要复杂读表校验、跨多张表关联判断的数据处理,因为脚本本身没有业务逻辑判断能力,充其量是屏幕数据的顺序回放。另外,SHDB 无法录制后台配置事务,如果要对 SM30、SM34 维护视图操作,需要先转成前台操作方式,这是很多顾问第一次用就碰壁的地方。
以业务场景举例:公司代码 0001 需要从 1998 年 4 月到 1999 年 12 月逐月打开物料账期,初始状态为 1998 年 3 月,需要执行 21 次 MMPV 操作。MMPV 是物料凭证结算期间调整事务,涉及公司代码、年份、月份三个核心字段。打开 SHDB 后点击新建记录按钮,弹出创建记录对话框,这里有两个关键点:
事务代码填 MMPV,同时必须勾选提交后继续选项。原因在于 MMPV 的操作路径不止一屏,执行完一个期间的物料账期打开后,系统可能返回初始屏幕供下次输入,如果不勾选提交后继续,录屏在执行一次后会直接结束或者卡在中间屏幕,导致后续屏幕的字段无法被正确回填。按照常见选择,处理模式下录屏时选前台(A),执行批量脚本时选后台(N),录屏和执行是两个不同阶段,模式选择互不影响。
# SHDB 创建记录的参数没有命令行窗口,这里的注释说明 GUI 操作要点 # 记录名称:Z_MMPV_OPEN_PERIOD(自定义命名) # 事务代码:MMPV # 提交后继续:勾选(X) # 开始记录:点击后进入录屏状态这里要特别留意录屏过程中的操作纪律。SHDB 录屏会把你在事务里每一次按键、每一次回车、每一次点击都忠实地记录成 dynpro 数据。多余的鼠标操作会生成额外的屏幕跳转,批量执行时这些无关步骤会被原样重放,导致执行到中途报错。比如在清单页面里你想往下翻看内容,顺手去拖拽了滚动条,录屏里就多了一个 set_scrollbar 命令,批量执行时如果目标行数不足,就会直接短路。
那么录屏的准确性怎么验证?最简单的方法是录完后手动执行一次脚本,选择前台模式观察屏幕是否按预期切换。关于事务代码里的特殊处理逻辑,部分事务比如 MMPV 在成功执行后会有警告提示,此时回车即可,千万不要点菜单栏的其它按钮。回车会作为 OK_CODE 被记录,但其它按钮的点击可能触发不期望的功能调用。
2.2 脚本字段手工改值与处理模式选择:少量重复时的快捷路径
录完第一次 MMPV(1998 年 4 月)后,SHDB 会展示记录的脚本,里面包含三个屏幕。重点看屏幕上的字段名:I_LFMON(月份,2 字节)、I_LFGJA(年份,4 字节)、I_VBUKR(公司代码,值 0001)。这里有个实用技巧:脚本尚未保存时,可以直接在图 6 的脚本显示界面修改字段值,然后点处理按钮执行新操作。
比如我要把 1998 年 4 月改成 1998 年 5 月,直接在 I_LFMON 里把 4 改成 5,再执行一次,就完成了下一期间的物料账期打开。这种方式适合重复次数少于 10 次的场景,因为手工改字段值容易改错位置,尤其当脚本跨了多个屏幕时,每个屏幕都有各自的字段集合,你改错了屏系统也不会报错,只会默默执行了错误的期间打开。建议每次修改后先在前台模式跑一遍,确认提示消息与预期一致,再切回后台执行。
执行界面里有几个处理模式选项,分别是前台(A,显示所有屏幕)、后台(N,静默执行不弹屏幕)、只显示错误(E,只在出错时弹出屏幕)、后台(P,处理过程中显示最后结果屏幕)。选择哪个取决于工作习惯,我的建议是首次跑新脚本批次时选只显示错误,因为批量数据如果有问题,停在出错屏幕可以立刻看清报错原因,而后台模式只会给一个最终处理记录列表,你还要一条条核对状态字段。后台(N)适合确认过脚本无误后的正式跑批,跑完看处理记录里的执行情况即可。
| 处理模式 | 屏幕显示 | 适用场景 |
|---|---|---|
| 前台(A) | 每步都显示 | 调试脚本、少量操作验证 |
| 后台(N) | 不显示 | 批量跑批、脚本已确认可靠 |
| 只显示错误(E) | 出错时显示 | 首轮批量执行的检查 |
| 后台(P) | 只显示最终屏幕 | 需要确认结果界面 |
从实测经验看,SHDB 记录脚本后若不保存,重启系统后记录仍在当前会话中,但若登录会话超时断开,未保存的记录会丢失。所以录完重要脚本后,建议直接在 SHDB 界面保存记录,方便后续复用。
2.3 导出脚本模板与页面控制命令:为邮件合并做数据准备
把录屏脚本导出成本地文件时,SHDB 会生成纯文本格式的脚本,文件名你可以自定义,一般用事务代码命名方便识别,比如 ZMMPV.txt。导出后的脚本是一个很规整的文本块,里面包含了每屏的字段名和值、屏幕号、程序名等完整信息。它的结构在后续用邮件合并且生成批量脚本时是不能破坏的,所以不要手工在文件里随意增删行。
先看一下导出文件的典型内容,帮助你理解后面批量脚本生成原理:
# ZMMPV.txt 部分内容示意 # 第一屏:初始屏幕 BDC_OKCODE /ENTER BDC_CURSOR I_LFMON BDC_FIELD (I_VBUKR) '0001' BDC_FIELD (I_LFMON) '04' BDC_FIELD (I_LFGJA) '1998' # 第二屏:警告确认 BDC_OKCODE /ENTER # 第三屏:结果返回 BDC_OKCODE /F3注意这里的 BDC_OKCODE 字段,它记录的是会话中的操作代码,/ENTER 表示回车,/F3 表示退出到上一屏幕。录屏过程如果点击界面右上角的 X 关闭按钮,会生成 /EXIT 或 /F3 这样的不同代码,这取决于事务代码的 GUI 状态。批量执行时如果预期行为是退出事务但仍停留在初始屏幕,/F3 通常是最安全的选择,/EXIT 在某些事务里会直接终止整段脚本。
另外在录屏中遇到列表需要滚动的情况,比如 MMPV 的结果显示有多个期间明细时,不要用鼠标拖滚动条,而要用 PageUp 和 PageDown 翻页。滚动条操作会记录成特定类型的屏幕控制命令,重放时不具备屏幕实际数据匹配能力,很容易触发控制报错。
导出时还要留意文件的编码格式。SAP 导出脚本文件默认是 ANSI 编码而非 UTF-8,如果你用 Windows 记事本打开并另存为 UTF-8 带 BOM,后续邮件合并生成的脚本再导入 SHDB 时可能出现第一行解析失败。这个问题在后面的避坑章节还会重点排查。
导出脚本的时机也有讲究。如果你计划用邮件合并生成大批量脚本,建议在录完第一次操作后就导出模板,不要先手工改字段执行多次后再导出,那样导出的脚本可能包含了你手工改动后的状态。让模板保持最原始、最干净的录屏状态,批量生成时才不容易出错。
3. 邮件合并批量生成 MMPV 脚本:从模板到一个文件 20 次执行的细节
邮件合并在 SAP 批处理里是一个讨巧的用法,它并不属于 SAP 系统功能,而是利用微软 Office 的邮件合并能力,把 Excel 数据表的每行数据替换到文本模板中,生成一个包含多次执行脚本的批处理文件。很多人一听邮件合并就以为只能做 Word 信函,实际上它能处理文本文件,效果等同于模板引擎的字符串替换。
3.1 Excel 数据源与文本模板的字段映射规则
以批量生成 1998 年 5 月至 1999 年 12 月的 MMPV 执行脚本为例,共 20 次执行。先把数据和模板准备好。Excel 数据源长这样:
year,month 1998,05 1998,06 1998,07 1998,08 1998,09 1998,10 1998,11 1998,12 1999,01 1999,02 1999,03 1999,04 1999,05 1999,06 1999,07 1999,08 1999,09 1999,10 1999,11 1999,12把 ZMMPV.txt 原始模板中 I_LFMON 字段的值 04 替换为 «month»,I_LFGJA 字段的值 1998 替换为 «year»(Word 域代码写法,实际插入合并域的方式是在 Word 中打开模板,选择插入 → 邮件合并 → 插入合并域)。这里有个细节:月份字段宽度是 2 字节,所以 5 月要写成 05,Excel 里月份列必须设置为文本格式,否则默认数字格式会去掉前导零。
邮件合并生成的批处理文件结构是:每轮执行脚本按顺序拼接。SHDB 导入时按文件中脚本块的先后顺序执行,不是按日期字段排序,所以 Excel 的行顺序就是执行顺序。保持月份递增能让执行逻辑清晰,更重要的是能避免并发场景下的期间覆盖冲突,如果乱序执行,系统会报物料账期未顺延的警告。
3.2 合并后文件行数与空行陷阱:如何确认导入数据正确
邮件合并完成后,生成的 MMPV_BATH.txt 每轮执行脚本应该有 13 行数据,这个 13 行是由 3 屏操作对应的字段数量决定的:第一屏 5 行(含 OKCODE、CURSOR、三个字段)、第二屏 1 行(OKCODE)、第三屏 1 行(OKCODE),合计 7 行,但实际导出模板可能包含额外的屏幕标题信息、注释行等,具体行数以导出文件为准。20 轮执行即 260 行,显示 261 是因为文件末尾有空行或最后一个脚本块后追加了换行符。导入 SHDB 后显示的行数如果与预期不符,不要急着执行,先检查数据源:
# 检查文本文件行数与关键字段总数 wc -l MMPV_BATH.txt # 输出 261 则总行数为 261(含末尾空行) # 检查字段值是否按月递增 grep -c "1999,12" MMPV_BATH.txt # 输出 0 因为文本中字段格式非 CSV,需用 grep I_LFGJA 配合上下文查看导入后 SHDB 界面显示的脚本内容如果第一条已经变成 1998 年 5 月,说明邮件合并成功;如果仍是 1998 年 4 月,说明模板文件没有被正确替换,需要回到邮件合并步骤重新检查域代码。
3.3 处理模式选择与执行结果记录:后台执行完成后看什么
加载 MMPV_BATH.txt 到 SHDB 后,点处理按钮会弹出处理模式选择对话框。选项包括前台(A)显示所有屏幕、后台(N)不显示屏幕后台执行、只显示错误(E)等。批量 20 次执行建议选后台(N),执行完后 SHDB 会显示一个执行结果列表,包含每次执行的返回值和对应的错误消息。这时要看什么?两个维度:
第一个维度是每次执行的状态。如果状态栏不是绿色完成图标,点进去查看系统消息,比如 MMPV 可能提示物料账期已打开或者期间不连续。第二个维度是汇总的行数。如果处理记录中的成功次数是 20 且没有报错行,那么这一次批量操作就算完整跑完。如果只有 19 条成功记录,说明有一条脚本被执行时系统跳过或终止,需要根据失败序号回查数据源对应行。
后台执行模式不会弹出业务操作屏幕,意味着你看不到中间过程。用只显示错误模式重跑一遍失败的那轮脚本,能直接看到停在哪个屏幕、哪个字段被系统校验拒绝,这个排查思路对后续大批量脚本的稳定执行很重要。
另外还要记得:此时创建的 SHDB 记录尚未保存。如果跑批过程中发现脚本本身有问题,修改后执行成功,要回到 SHDB 记录概览界面把记录保存下来,名称可定义为 Z_MMPV_OPEN_PERIOD。保存后的记录可以在后续重复使用时直接导入,不必重新录屏。保存记录也会将导入的批量脚本内容一并保存,下次想再次执行同样批处理时,只需进入 SHDB 加载记录并直接处理即可。
4. LSMW 从零到一:源结构目标结构到字段映射的完整十四步流程
LSMW 的功能复杂度明显高于 SHDB,它是一套完整的数据迁移框架。用 LSMW 做批处理时,核心价值在于把外部文件(Excel、TXT、CSV)通过映射规则转换成 SAP 标准数据格式,再调用事务代码或 BAPI 写入系统。它不只是录屏回放,还包含了数据清洗、格式校验、映射转换、批量导入的完整闭环。
4.1 项目树与 14 步标准流程对比:为什么 4.71 是 20 步而 ECC 6.0 是 14 步
进入 LSMW 后首先看到的是管理界面,需要依次输入 Project、Subproject、Object 三个层级来唯一定位一个导入对象。这套三层结构是 LSMW 的组织方式,Project 通常是业务线名称,Subproject 是数据类型分类,Object 是具体要导入的实体。每个 Object 下维护了从文件定义到字段映射的完整配置集。
在分步操作界面中,SAP IDES 4.71 环境显示 20 个步骤,而 ECC 6.0 标准只有 14 个步骤。差异原因是 4.71 拆分了两步式维护结构,把部分定义步骤细分了,总体逻辑一致。做项目时先点选择用户菜单按钮,把不需要的 6 个菜单项取消勾选,留下标准的 14 个步骤,减少误操作的可能性。
14 个步骤可以分成 5 个阶段:准备数据(Excel 整理)、对象属性定义(Project 设置)、源数据结构定义(文件字段布局)、目标结构映射(SAP 字段匹配与转换规则)、执行(读文件、显示转换、传输)。下面按实际项目操作顺序展开。
4.2 源结构、源字段与文件前导记录:文件格式定义的关键细节
定义源结构时,要给每列字段起一个逻辑名,映射到文件里的物理列位置。源结构中的字段顺序与文件列顺序一一对应,这一步定错了,后面所有映射都会跟着错,而且错误往往到执行阶段才暴露。一般来说:
源结构:ZMMPV_SRC(自定义) 源字段列表(示例,对应MMPV文件): - VBUKR 公司代码(位置1,字符4) - LFGJA 年份(位置2,数字4,前导零保留) - LFMON 月份(位置3,数字2,前导零保留)接文件定义时选择文件类型为 PC 文件(本地文本),再定义文件格式为固定位置还是分隔符。分隔符场景下要指定分隔符类型,常见的有 TAB、分号、逗号。注意 SAP 系统里分号并不是默认支持的合法分隔符,如果你 Excel 导出 CSV 时选择分号分隔,文件读取阶段会报错识别不了字段边界。建议统一用 TAB 分隔,Excel 另存为时选择文本(Tab 分隔)格式。
还要定义文件前导记录(Header Line)是否存在。比如你 Excel 第一行是列标题,那么前导记录数量要设为 1,系统读取数据文件时会跳过第一行,不然列名会被当作第一条数据传入字段映射,导致转换失败。
4.3 源结构到目标结构映射:字段转换规则怎么设日期和去零
映射阶段是 LSMW 里投入工作量最大的环节。SAP 事务录屏生成的目标字段结构可以通过 SHDB 录制 BMPP 事务获得,然后在 LSMW 的映射界面中把源字段(Excel 列对应字段)与目标字段(屏幕字段)建立对应关系。映射规则不仅仅是一对一赋值,还支持常量、公式和转换例程。
以一个真实映射为例:
目标字段 I_VBUKR <- 源字段 VBUKR(直传,无需转换) 目标字段 I_LFGJA <- 源字段 LFGJA(直传,值为四位数年份) 目标字段 I_LFMON <- 源字段 LFMON(直传,注意前导零)常见的转换坑点在这里就出现了。Excel 里的月份列如果格式是常规,5 月会存成 5,但 SHDB 录屏脚本要求精度为 2 字节的字段值 05。LSMW 字段转换规则里可以设置输出格式,对源字段定义时就要指定数据类型 NUM 与长度 2,系统会在转换时自动补零。如果忘了指定长度,直接映射后导入,系统报错或在后台执行静默写入错误数据,排查起来比较麻烦。
日期转换规则同理。源 Excel 里日期可能是 1998/04/01 这样的字符串,目标 SAP 日期字段需要标准格式 19980401。在字段映射里可创建转换规则:CONVERT_DATE_TO_INTERNAL。这个规则会把外部格式转换成 SAP 内部存储格式,比手工用 SUBSTRING 拼接更不容易出错。
文件读取前的数据格式表通过维护 File 前导记录后的文件格式界面登记:
文件示例(TAB分隔,无前导记录,三列): 0001 1998 05 0001 1998 06 ...这里要注意,公司代码是字符字段,前导零是否保留取决于内部设置。SAP 中公司代码一般以字符存储,如果 Excel 输入的是 1 而不是 0001,映射时系统可能不自动补零,这会导致运行时报公司代码不存在错误。关于这类问题,在源字段定义时可以设置 Format 属性,但更保险的做法是直接在 Excel 里把所有单据代码都做文本格式处理——这是很多人最容易忽视的环节。
4.4 读取数据与转换执行:显示转换结果到底在看什么
完成映射并点执行读取数据后,系统从文件中读取记录并按源结构解析成内部表。显示已读取数据界面可以验证文件解析是否正确,比如字段长度是否正确截取、前导零是否保留、有没有因为分隔符识别错误导致列错位。这里的检查方式很简单:对比 Excel 源文件的行数据和 LSMW 界面里显示的数据是否一致,不一致逐列排查。
预转换环节点执行转换数据,系统按照映射规则将源记录转换为 SAP 目标事务的 BDC 表或 BAPI 参数表。转换后要立刻点显示转换数据,检查转换结果中关键字段的值。这里出现的问题通常不是映射逻辑错误,而是数据类型转换造成的值变异。
再往后就是执行实际转换,这里可以选择处理模式(前台/后台)、更新模式(同步/异步)、测试运行指示器等。首轮请务必选择测试运行,系统会模拟写入但不提交数据库,可以把潜在错误挡在最终执行之前。测试运行通过后取消测试运行勾选,正式执行,并通过事务代码 SM35 查看批处理会话日志。
4.5 BDC 会话与批输入状态:SM35 查看会话处理结果的方法
LSMW 最终执行方式有两种:一种是直接调用事务代码执行(适用于前台操作型事务),另一种是生成批输入会话(Batch Input Session),在 SM35 中处理。后者更推荐,因为会话可以统一管理、错误定位、选择性重跑。SM35 界面显示会话列表,包括会话名称、状态(已生成/已处理/错误)、记录数等信息。
处理会话时选择处理模式:前台、后台、出错时前台。批量数据建议选出错时前台,一旦某条记录出错,系统会停在出错屏幕显示问题字段,便于即时排查。处理完成回到 SM35 查看会话日志,若会话状态为已完成,说明全部记录成功;若为已完成但有错误,需要进入会话详细列表查看每条记录的处理结果消息。常见错误类型包括字段过长、必填字段缺失、外部键不匹配、权限对象检查失败等。
会话处理完毕记得检查后台输出和应用程序日志,比如物料账期打开这类操作,可以通过 MMPV 界面或表 T001W 的期间字段验证最终状态。对账务数据,建议使用 TCODE SE16N 查看对应表的实际数据,确认业务结果而非只盯会话状态。
5. 避坑手册:SHDB 录屏与 LSMW 文件导入的八条血泪经验
5.1 录屏时拖动滚动条导致脚本执行中断:未知屏幕操作命令引发的短路
现象:做 MMPV 录屏时,为了查看结果明细,用鼠标拖动了垂直滚动条。保存记录后前台执行,脚本在第二个屏幕处提示未知屏幕操作,终止执行。
原因:录屏记录的不是业务操作意图,而是具体的 GUI 交互命令。滚动条拖拽被记录为屏幕控件 set_scrollbar 命令,批量执行时该命令与目标屏幕的控件状态不匹配,系统无法解释该操作。
解决:所有翻页操作一律使用 PageUp/PageDown,录屏完成后立即查看脚本,出现 set_scrollbar、set_submenu 等命令的,重新录制该段操作,不要手工删减脚本,因为删减可能导致后续 BDC_FIELD 顺序错乱。
5.2 邮件合并生成的文本文件第一行解析失败:文件编码 BOM 头惹的祸
现象:Word 邮件合并另存为文本后,导入 SHDB 时提示第一行语句无法被解析,第一轮执行的首屏字段全部丢失,后续屏幕字段正常。
原因:Word 另存为文本时默认使用 UTF-8 带 BOM 格式保存,而 SHDB 的文本导入解析器不识别 BOM 头,把 BOM 字符当作脚本语句首字符,导致语法解析失败。
解决:批量脚本文件另存时选择 ANSI 编码,或使用 Notepad++ / VS Code 打开文件后转为 ANSI/GB2312 再保存。导入后检查第一条记录是否以 BDC_OKCODE 起始,而不是以不可见字符起始。
5.3 前导零丢失导致公司代码不存在错误:Excel 自动格式化是最大幕后黑手
现象:LSMW 读取 Excel 数据导入公司代码时,数据源中 0001 被显示为 1,进入系统报错:公司代码 1 不存在。
原因:Excel 单元格默认将纯数字型字符串转为数字格式,去掉前导零,而且 LSMW 源字段定义中设置了数字类型,无法自动补充前导零。
解决:Excel 中对所有 SAP 代码类字段(公司代码、工厂、库存地点、物料号等)统一设置单元格格式为文本,或输入前加单引号强制文本。LSMW 源字段定义时同样设置数据类型为 CHAR 而非 NUM,保持原值精度。
5.4 SHDB 未保存记录,会话断开后一切重来
现象:录完 MMPV 脚本后没有保存记录,直接去排 Excel 数据表,期间 SAP 会话因超时断开,重新登录后 SHDB 里找不到刚才录制的记录。
原因:SHDB 的录制内容在保存前存于会话内存中,注销系统或会话超时即被释放。
解决:录制完成后养成即时保存的习惯,在 SHDB 记录概览界面点击保存按钮。保存后的记录可反复加载使用,后续通过邮件合并且重新生成的脚本也会以记录形式存储。
5.5 LSMW 文件读取时列错位:TAB 分隔符与全角字符混合导致字段错乱
现象:LSMW 读取包含备注信息的文本文件时,某些行的备注字段中包含了半角 TAB 字符,导致该行之后的字段整体错位,转换时报必填字段缺失。
原因:备注字段内容不干净,含有和分隔符相同的字符,LSMW 无法区分这是数据内容还是字段分隔标志。
解决:在 Excel 数据准备阶段,对所有备注类字段做清理,查找替换 TAB 字符为空格。更通用的做法是文件格式改为固定列宽,字段在文件中的位置由列数决定,不受分隔符干扰,但修改固定宽度后源字段定义要和列宽一致。
5.6 LSMW 测试运行通过正式执行却报错:数据新产生的有缺陷记录绕过了映射规则
现象:LSMW 测试运行显示全部通过,取消测试运行后正式执行,发现部分记录报错,错误信息是字段值不合法。
原因:测试运行时数据库尚未提交,一些依赖数据库唯一性校验的业务规则还未触发。正式运行时系统执行了相同的检查,但这些检查依赖当前数据库状态,而测试运行后其它后台任务写入的数据影响了唯一性判断。
解决:正式执行前再做一次数据源与 SAP 系统现有数据的一致性检查,特别是唯一键字段、时间区间字段是否有重叠。某些场景下可把正式执行改为按分包处理,每包 100-200 条,错误范围可控,也方便逐包排查。
5.7 SHDB 录屏进入后台维护视图中断:SM30 维护操作无法录制
现象:尝试录制 SM30 维护视图操作,SHDB 提示不支持在此模式下录制。
原因:SHDB 设计上限制了对后台配置事务的录屏支持,SM30、SM34 这些表维护事务在前台模式的屏幕逻辑与普通业务事务不同,录屏识别不了维护视图的屏幕控制流程。
解决:将后台配置操作转成前台操作或使用维护视图定制业务事务(TCODE 可自定义),或者改用 LSMW 配合调用 BAPI / 函数完成配置数据的写入。如果单次操作量不大,直接手工维护 SM30 可能是最快的路径。
5.8 BDC 脚本执行顺序错乱造成数据覆盖:20 次执行后只保留了最后一次期间
现象:批量脚本执行完 20 次打开物料账期后,实际系统中账期只开到了 1999 年 12 月,中间月份没有逐个打开。
原因:MMPV 操作依赖于物料账期顺延关系,必须按时间顺序逐月打开。脚本按 Excel 行顺序执行,但 Excel 数据行被按年份分组排列,1998 年的月份在最后一行,系统先执行 1999 年 12 月,后续再执行 1998 年 1 月就报错跳过了。
解决:邮件合并前在 Excel 中排序确保月份严格递增。更稳妥的做法是在生成脚本时,用一个文本处理脚本校验脚本中 I_LFGJA 和 I_LFMON 的值序列是否为连续递增,发现逆序直接终止生成:
# -*- coding: utf-8 -*- # 校验 MMPV_BATH.txt 中年份月份是否为递增序列 import re last_year = None last_month = None with open('MMPV_BATH.txt', 'r', encoding='ansi') as f: for line in f: m_year = re.search(r"BDC_FIELD \(I_LFGJA\) '(\d+)'", line) m_month = re.search(r"BDC_FIELD \(I_LFMON\) '(\d+)'", line) if m_year: last_year = m_year.group(1) if m_month: last_month = m_month.group(1) # 这里只是提取,实际判断逻辑用顺序比较这个校验脚本并不复杂,关键价值在于工具化的数据检查意识。对涉及业务顺序依赖的批处理,批次内容检查应该成为执行前的固定动作。
6. 进阶:用脚本自动生成 LSMW 映射表和 SHDB 执行文件的双通道批处理方案
当数据量来到几千上万条,或者要反复处理相似业务对象时,纯手工的录屏加邮件合并开始力不从心。这个阶段可以升级成双通道方案:SHDB 用于前台操作型的快速批量动作,LSMW 用于结构化数据迁移,两者共用同一套数据预处理逻辑。
我的习惯是用 Python 脚本统一完成数据源标准化。比如生成 MMPV 批量脚本,上一章的 Python 校验脚本稍加扩展,直接读 Excel 数据生成可执行的 BDC 脚本文件,比邮件合并稳定得多。这个思路的转换关键点在于理解 SHDB 脚本的文本格式本质:它就是若干字段-值对的顺序排列,控制命令穿插其间。你可以通过字符串模板实现批量生成:
# -*- coding: utf-8 -*- # 从 Excel 数据源生成 SHDB 批量脚本,替代邮件合并 import csv template = """BDC_OKCODE /ENTER BDC_CURSOR I_LFMON BDC_FIELD (I_VBUKR) '0001' BDC_FIELD (I_LFMON) '{month}' BDC_FIELD (I_LFGJA) '{year}' BDC_OKCODE /ENTER BDC_OKCODE /F3 """ with open('mmpv_dates.csv', 'r') as f: reader = csv.DictReader(f) blocks = [] for row in reader: blocks.append(template.format(month=row['month'].zfill(2), year=row['year'])) # 拼接所有块,写入 txt 文件 with open('MMPV_BATH.txt', 'w', encoding='ansi') as out: out.write('\n'.join(blocks))这个脚本把 Excel 里按列存放的年月数据,循环替换到模板块中,按月自动补零,生成的文本直接可以导入 SHDB 执行。因为跳过 Word 邮件合并环节,编码控制和字段顺序错误都一并规避了。推荐把模板块放在独立文本文件中维护,这样修改屏幕字段时不需要动 Python 代码。对于 LSMW,用脚本做映射表的辅助生成同样可行,但注意 LSMW 的字段映射保存在系统表内,脚本主要解决文件侧的数据准备问题,减轻人工在 Excel 里做 VLOOKUP 和格式调整的负担。
这套双通道方案在实际项目中帮我节省了一大半重复劳动时间。关键教训有三条:一是 SHDB 录屏时绝不碰鼠标滚动条,翻页只用键盘;二是所有 Excel 数据源一律文本格式处理再谈后续映射,前导零丢失这种问题在源头就直接杜绝;三是不管 BDC 还是 LSMW,第一批数据必须走测试运行加前台看屏,别一上来就是后台跑几百条,翻车了你连错在哪都不知道。从那以后我每次做批处理,都会强制走一遍数据预检、测试运行、正式执行的固定节奏。希望这套思路能帮你在 SAP 批处理里少踩几个坑。
本文还有配套的精品资源,点击获取