1. SAP BDC 回放总失败?先把 BDC_OKCODE 和 BDC_CURSOR 这两个字段吃透
如果你在用 SHDB 录制完一段 PA30、ME21N 或者 MIRO 的批输入,回放时却卡在某个屏幕报「字段未找到」「光标位置无效」,八成不是数据填错了,而是 BDC_OKCODE 和 BDC_CURSOR 没配对。SAP BDC(Batch Data Communication)本质上是把一次事务代码的屏幕流,拆成「屏幕号 + 字段名 + 值」的二维表,再通过 CALL TRANSACTION 按顺序喂给系统。它适合谁?适合做批量主数据维护、批量创建合同、批量过账的 ABAP 开发者,以及需要把 Excel 数据灌进标准事务的顾问。
我试过最典型的一个坑:录制 PA30 新增信息类型 0016,SHDB 里跑得好好的,程序里一执行就停在初始屏幕不动。后来把 BDC_OKCODE 从/00改成=INS,再把 BDC_CURSOR 指到RP50G-PERNR,才顺利往下走。这篇就把 BDC_OKCODE、BDC_CURSOR 的取值逻辑,以及 SHDB 录制回放的配置骨架讲清楚,代码可以直接复制改。
2. TaoToken 前置:把模型对话和接入文档放在手边
写 BDC 这种「屏幕流 + 字段名」的活,最烦的是记不住某个事务的 OKCODE 到底该用=UPD还是=SAVE。我的做法是开一个模型对话窗口,把 SHDB 录出来的字段列表贴进去,让它帮我比对 OKCODE 语义;同时把接入文档放在另一个标签页,随时查 API 参数格式。
如果你也想用这种方式辅助排查,可以先在 TaoToken 模型对话 里描述你的屏幕流,再把生成的字段骨架贴回 ABAP。需要拿 Key 的话走 API Keys 页面,接入细节看 接入文档。官网入口在 taotoken.net。
注意:模型对话只用来辅助理解 OKCODE 语义和字段命名,不要让它替你决定生产环境的事务流,最终以 SHDB 录制结果为准。
3. 可复制配置:BDC 参数骨架与 SHDB 录制步骤
3.1 BDC 参数体系速查
BDC 的数据结构核心是BDCDATA内表,每一行代表一个屏幕操作。关键字段如下:
| 字段名 | 作用 | 典型取值 |
|---|---|---|
| BDC_OKCODE | 当前屏幕要执行的操作码 | /00、=INS、=UPD、=SAVE、=BACK |
| BDC_CURSOR | 光标定位到哪个字段 | RP50G-PERNR、P0016-CTEDT |
| BDC_DYNP | 屏幕号,配合程序名 | SAPMP50A+1000 |
| 业务字段 | 实际赋值 | RP50G-PERNR、P0016-BEGDA |
BDC_OKCODE的取值逻辑要分清三类:一类是功能码,比如/00回车、=INS新增行、=UPD更新、=SAVE保存;一类是退出码,比如=BACK、=EXIT;还有一类是列表操作,比如=P+下一页、=P++末页。录 SHDB 时系统会自动填,但回放失败往往是因为你手动改错了。
BDC_CURSOR更微妙。它决定光标停在哪个字段,而某些屏幕的 PAI 逻辑依赖光标位置来判断「用户到底在操作哪一行」。比如 PA30 的信息类型列表,光标停在RP50G-CHOIC和停在RP50G-PERNR,后续分支完全不同。
3.2 SHDB 录制步骤
第一步,事务码SHDB进入录制界面,点「新建记录」,输入事务代码比如PA30,记录名随便起一个ZPA30_TEST。
第二步,开始录制后,按你正常操作走一遍:输入工号、选信息类型、填日期、保存。每一步系统都会记下屏幕号、字段名、OKCODE 和光标位置。
第三步,停止录制,在 SHDB 里点「回放」,确认能跑通。跑不通就先在 SHDB 里调,别急着写代码。
第四步,导出代码。SHDB 可以生成 ABAP 调用样例,但通常需要你手动整理成BDCDATA内表形式。
3.3 可复制的 BDC 骨架
下面这段是 PA30 新增信息类型 0016 的骨架,字段名来自 SHDB 录制结果,你可以按自己事务替换:
DATA: gt_bdcdata TYPE TABLE OF bdcdata, gs_bdcdata TYPE bdcdata, gt_msg TYPE TABLE OF bdcmsgcoll. FORM fill_bdc_data USING p_pernr TYPE pernr_d p_begda TYPE begda p_endda TYPE endda. CLEAR gt_bdcdata. " 初始屏幕 1000 PERFORM bdc_dynpro USING 'SAPMP50A' '1000'. PERFORM bdc_field USING 'BDC_CURSOR' 'RP50G-PERNR'. PERFORM bdc_field USING 'BDC_OKCODE' '/00'. PERFORM bdc_field USING 'RP50G-PERNR' p_pernr. PERFORM bdc_field USING 'RP50G-CHOIC' '0016'. " 信息类型列表,进入新增 PERFORM bdc_dynpro USING 'SAPMP50A' '1000'. PERFORM bdc_field USING 'BDC_CURSOR' 'RP50G-CHOIC'. PERFORM bdc_field USING 'BDC_OKCODE' '=INS'. " 信息类型 0016 明细屏幕 PERFORM bdc_dynpro USING 'MP321100' '2000'. PERFORM bdc_field USING 'BDC_CURSOR' 'P0016-CTEDT'. PERFORM bdc_field USING 'BDC_OKCODE' '=UPD'. PERFORM bdc_field USING 'P0016-BEGDA' p_begda. PERFORM bdc_field USING 'P0016-ENDDA' p_endda. PERFORM bdc_field USING 'P0016-CTTYP' '10'. PERFORM bdc_field USING 'P0016-CTEDT' p_begda. " 保存 PERFORM bdc_dynpro USING 'SAPMP50A' '1000'. PERFORM bdc_field USING 'BDC_OKCODE' '=SAVE'. ENDFORM. FORM bdc_dynpro USING p_program TYPE any p_dynpro TYPE any. CLEAR gs_bdcdata. gs_bdcdata-program = p_program. gs_bdcdata-dynpro = p_dynpro. gs_bdcdata-dynbegin = 'X'. APPEND gs_bdcdata TO gt_bdcdata. ENDFORM. FORM bdc_field USING p_fnam TYPE any p_fval TYPE any. CLEAR gs_bdcdata. gs_bdcdata-fnam = p_fnam. gs_bdcdata-fval = p_fval. APPEND gs_bdcdata TO gt_bdcdata. ENDFORM.回放调用:
CALL TRANSACTION 'PA30' USING gt_bdcdata MODE 'N' UPDATE 'S' MESSAGES INTO gt_msg.MODE参数控制是否显示屏幕:A全屏显示、E出错才显示、N不显示。调试阶段建议用A,生产用N。UPDATE用S表示同步更新,方便立刻拿到消息。
4. 验证请求与成功结果
写完骨架后,先别急着批量跑。用单条数据在 SE38 里执行,把MODE设成A,观察屏幕流是否和 SHDB 录制一致。如果屏幕一闪而过直接到保存,说明 OKCODE 和 CURSOR 都对上了。
成功的结果是gt_msg里出现S类型消息,比如「人员 xxx 的信息类型 0016 已创建」。如果出现E类型,先看消息文本,再回到 SHDB 对比字段名。常见的是字段名大小写或屏幕号写错,比如把MP321100写成SAPMP3211。
批量跑的时候,建议加一个日志表,把每条数据的PERNR和gt_msg存下来,方便回溯哪条失败。
5. 本篇常见错排查
错误一:回放停在初始屏幕不动。检查BDC_OKCODE是不是/00,以及BDC_CURSOR是否指向了必输字段。如果初始屏幕有多个必输项,光标位置会影响 PAI 校验顺序。
错误二:报「字段 P0016-XXX 未找到」。说明屏幕号或程序名不对。用 SHDB 重新录一遍,把BDC_DYNP的 program 和 dynpro 原样抄下来,别凭记忆写。
错误三:新增变成修改,或者重复创建。这是=INS和=UPD用混了。列表屏幕用=INS进新增,明细屏幕用=UPD保存当前记录。如果明细屏幕用=INS,系统可能当成再插一行。
错误四:保存后没反应。检查最后一步的BDC_OKCODE是不是=SAVE,有些事务保存码是=BU或=POST,以 SHDB 录制为准。
错误五:BDC_CURSOR指向的字段在当前屏幕不存在。比如列表屏幕的光标字段是RP50G-CHOIC,你写成了明细屏幕的P0016-CTEDT,系统直接报错。每个BDC_DYNP后面跟的 CURSOR 必须属于该屏幕。
提示:排查时把
MODE设成A,配合 SHDB 的「回放」功能逐屏对比,比看代码快得多。
6. 继续深入:把 BDC 接入和编码辅助串起来
BDC 的字段体系摸清后,下一步通常是把它封装成通用函数,或者接到批量上传流程里。如果你在写更复杂的 Agent 式编码任务,比如自动生成 BDC 骨架、自动比对 SHDB 录制结果,可以走 Coding Plan 来管理长期编码会话。需要看控制台用量和 Key 状态就去 Console。
最后留一个我踩过的坑:SHDB 录制时如果中间弹了确认框,一定要把确认框那一步的 OKCODE 也录进去,否则回放时系统会停在那里等确认。很多人以为确认框是系统自动跳过的,其实它也是一个独立屏幕,需要单独的BDC_DYNP和BDC_OKCODE。