1. SAP BDC 回放总失败先把 BDC_OKCODE 和 BDC_CURSOR 这两个字段吃透如果你在用 SHDB 录制完一段 PA30、ME21N 或者 MIRO 的批输入回放时却卡在某个屏幕报「字段未找到」「光标位置无效」八成不是数据填错了而是 BDC_OKCODE 和 BDC_CURSOR 没配对。SAP BDCBatch Data Communication本质上是把一次事务代码的屏幕流拆成「屏幕号 字段名 值」的二维表再通过 CALL TRANSACTION 按顺序喂给系统。它适合谁适合做批量主数据维护、批量创建合同、批量过账的 ABAP 开发者以及需要把 Excel 数据灌进标准事务的顾问。我试过最典型的一个坑录制 PA30 新增信息类型 0016SHDB 里跑得好好的程序里一执行就停在初始屏幕不动。后来把 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、BACKBDC_CURSOR光标定位到哪个字段RP50G-PERNR、P0016-CTEDTBDC_DYNP屏幕号配合程序名SAPMP50A1000业务字段实际赋值RP50G-PERNR、P0016-BEGDABDC_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。
