资讯详情

资讯详情

SAP预留批量创建:BAPI_RESERVATION_CREATE1增强字段

1. 先把需求拆开MB21 手工建预留和批量自动建预留差在哪儿做了几年 SAP 后勤模块的同学大概都有过这样的经历业务部门跑来说他们每天要在 MB21 里手工敲几十甚至上百条预留物料、工厂、库存地点、需求日期、成本中心全靠眼睛对、手敲错一条就要 MB22 回去改改完还得让财务重新核对。这时候最直接的诉求就是——能不能给个 Excel 模板一上传就把预留建好最好还能顺带把我们自己加的 ZZ 字段一起写进去。这个需求落到 ABAP 侧就是标题里的三件事MB21 对应的预留创建逻辑、用 BAPI 替代录屏、把附加的增强字段一起带进 RESB。先说结论让不同基础的同学快速定位MB21 是预留的手工创建事务码底层落到 RKPF抬头和 RESB行项目两张表要批量自动化最稳的路线是调用标准 BAPI 里的BAPI_RESERVATION_CREATE1它支持抬头、行项目以及EXTENSIONIN扩展参数而增强字段能不能写进去取决于 RESB 上的客户附加结构常见就是 CI_RSADD 这类 append有没有被对应的 BAPI 扩展结构BAPI_TE_RESB带进来。这篇内容适合三类人看正在做预留批量导入的 ABAP 开发、被增强字段丢值折磨过的后勤顾问、以及想搞清楚 BAPI 扩展机制到底怎么运转的技术负责人。2. 方案选型录屏、BAPI、直连数据库三条路怎么挑2.1 三条路线的真实差距我见过项目上一上来就写 BDC 的也见过直接 UPDATE RESB 的这两种在短期 Demo 里都跑得通但上线之后的问题完全不一样。BDC 的本质是模拟人在屏幕上的键盘输入它对屏幕字段的顺序、必输校验、弹窗提示高度敏感只要打了一个小补丁、多了一个消息框、或者用户默认参数里配了个库存地点自动带出录屏就会以各种莫名其妙的方式失败。它的优势也明确MB21 屏幕上能填的字段包括你自己加在屏幕上的自定义子屏幕字段BDC 都能填这点是 BAPI 比不了的。BAPI 路线正好相反。BAPI_RESERVATION_CREATE1走的是函数内部逻辑不依赖屏幕速度快、稳定性高、批量一千条也就几十秒返回结构规范错误信息还能逐条解析。代价是它只认函数签名里定义的参数屏幕上有但函数没有的字段你就得另想办法而且标准 BAPI 对内表附加字段append不做任何业务校验值填错了它照收不误。直接 UPDATE RKPF/RESB 这条我建议直接放弃。预留号来自内部编号范围你在程序里根本算不出来就算你抢到了号抬头的状态字段、行项目的预留标识、后续 MB1A/MB1B 冲销要用的关联信息都得自己维护维护漏一个业务在 MIGO 里就会报预留不存在或者数量对不上。真正需要补写字段的时候也是在 BAPI 成功返回之后、以标准接口为主、补写为辅。2.2 我的一般选型原则场景推荐路线理由纯标准字段、批量导入、无自定义屏幕逻辑BAPI_RESERVATION_CREATE1稳定、快、易维护有增强字段且增强结构已在 BAPI_TE_RESB 里BAPI EXTENSIONIN一次调用搞定字段同 LUW 提交增强字段挂在自定义子屏幕且带自定义校验/派生逻辑BDC 到 MB21或 BAPI 创建后再补写屏幕逻辑只有录屏能完整复现已有 BAPI 但需要在保存前做复杂派生BAPI CMOD 增强MB 系列出口让派生逻辑跟标准入口绑定避免每个调用点重复写这里有个判断标准很实用增强字段的赋值逻辑是否依赖屏幕上的其他字段联动。如果只是Excel 里有一列 ZZ 值原样写进去走 EXTENSIONIN如果 ZZ 的值要根据移动类型、物料组、成本中心实时算出来那算的逻辑最好放到增强出口里不要散落在每个导入程序里。2.3 增强字段到底挂在哪一层很多同学一开始就想歪了为了存几个自定义字段自己去建一张 Z 表用预留号做外键关联。能用但后患无穷——MB23 看不见、MB22 改不了、报表要额外 JOIN、预留被删了 Z 表还留着垃圾数据。正确的做法是给 RESB 加客户附加结构append structure字段和表在同一个数据记录里MB23 的明细、标准的预留查询都能读到需要把字段加到屏幕或 ALV 才可见。这里要分清三个增强概念混在一起最容易翻车DDIC 层RESB 的 append例如 CI_RSADD决定字段存在哪张表、什么类型接口层BAPI_TE_RESB这类扩展结构决定 BAPI 能不能接住这个字段交互层MB21/MB23 屏幕上的自定义子屏幕或 ALV 列决定用户能不能看见和手工维护。三者缺一个都会出现程序写得没错但业务看不到或者界面填了值接口写不进去的情况。做之前先去 SE11 把 RESB 和BAPI_TE_RESB两个结构打开对一眼五分钟的事能省两天排查。3. BAPI_RESERVATION_CREATE1 的参数地图与字段规则3.1 抬头参数能少填就少填BAPI_RESERVATION_CREATE1的抬头参数结构是BAPI2093_RES_HEAD。我的一般做法是抬头只填必要的关联信息比如ORDERID如果预留要挂在某个订单上预留号本身留空交给系统按编号范围取号。为什么不建议自己指定预留号因为RKPF-RSNUM用的是内部编号范围除非对应编号范围被明确配成外部编号否则你填进去的值会被忽略或者直接报错而且你没法保证不撞号。真要指定先去 SPRO 的预留编号范围配置里确认别在代码里赌。另外提醒一句抬头字段和行项目字段存在重复比如成本中心、订单号在抬头和行项目里都有对应字段。实际项目里我发现真正参与过账判断的通常是行项目那一份抬头填了不一定生效。稳妥的做法是先把值都放在行项目上跑通之后如果发现某个字段确实是抬头级别生效的再补到抬头用 SE37 单步测试对比一下两种填法的结果。3.2 行项目参数条件必输才是真正的坑行项目结构是BAPI2093_RES_ITEM这是个表参数。下表是我在实际项目里最常用到的字段值得说明的是字段名以 SE11 里BAPI2093_RES_ITEM的实际定义为准不同版本可能有细微差别字段含义必输性备注RES_ITEM行号必输从 1 开始连续不要跳号MATERIAL物料号必输必须做前导零转换PLANT工厂必输必须存在且物料在该工厂有视图STGE_LOC库存地点条件必输移动类型涉及库存时必须有MOVE_TYPE移动类型必输决定后面哪些字段必输ENTRY_QNT需求数量必输必须是数值正数ENTRY_UOM输入单位必输要做单位格式转换REQUIREMENT_DATE需求日期必输内部格式 YYYYMMDDCOSTCENTER成本中心条件必输201、261 类领用场景通常要ORDERID关联订单条件必输261/281 等生产领用场景要WBS_ELEMWBS 元素条件必输项目类预留要注意格式转换ITEM_TEXT行文本可选建议填业务单号便于事后追溯BATCH批次可选批次管理物料才需要条件必输这件事最有代表性的就是移动类型。举几个我实际踩过的移动类型 201成本中心领用没有成本中心报错通常在提交后才出移动类型 261生产订单领用不给订单号BAPI 会直接返回订单号必输移动类型 411/412特殊库存转移还需要供应商/客户相关的特殊库存标识。一个省事的自检办法是用 MB21 手工建一条同移动类型的预留看屏幕上哪些字段自动变成了必输项打勾或变灰那个清单就是你的最小必填集。3.3 X 结构少一个标记字段就等于没写BAPI 世界里有个通用规律有值结构就往往有一个对应的 X 结构X 结构里放的是这个字段要不要参与更新的标记。创建类 BAPI 里这个问题没那么明显反正整行都是新增的但一旦你的程序里混入了修改场景不填 X 就会出大问题——标准逻辑会把没打 X 的字段当成用户没打算改直接忽略。新建预留时我的习惯是把行项目的 X 标记统一置位整行一起参与更新。如果你看到的 X 结构是逐字段的每个字段一个 X那就对齐着一个个置 X如果是单个BAPIUPDATE字段标识整行那就一行置一个 X。这个细节一定要在 SE37 里点开参数结构看一眼别照着别人的代码抄——不同 SAP 版本和不同 BAPI 家族比如采购订单那边的BAPI_PO_CHANGE用的是POITEMX 逐字段 X差别不小。3.4 三个必须做的格式转换前导零物料号在MARA-MATNR里是带前导零的 CHAR18用户从 Excel 上传的往往是12345这种短号。直接塞进 BAPI系统会告诉你物料不存在。必须在调用前走CONVERSION_EXIT_ALPHA_INPUT。计量单位Excel 里用户写的是KG、PC、个这类外部格式内部是MARA-MEINS那种三字符代码。走CONVERSION_EXIT_CUNIT_INPUT转换注意这个函数在单位不存在时会抛异常一定要用 TRY/CATCH 或者检查 SY-SUBRC然后把错误信息拼回给用户不要直接 DUMP。日期REQUIREMENT_DATE需要内部格式用户传来2024.05.01这种必须先转。另外需求日期如果早于当天部分系统会给警告甚至报错我建议在程序里做一次前置校验把需求日期早于今天的行直接拦下来提示用户比等 BAPI 返回一堆消息再解释清楚得多。 物料前导零 CALL FUNCTION CONVERSION_EXIT_ALPHA_INPUT EXPORTING input lv_matnr IMPORTING output lv_matnr. 单位转换注意异常处理 TRY. CALL FUNCTION CONVERSION_EXIT_CUNIT_INPUT EXPORTING input lv_meins language sy-langu IMPORTING output lv_meins. CATCH cx_sy_conversion_no_number. 记录错误行跳过本条 ENDTRY.4. 增强字段的落地从追加结构到 EXTENSIONIN 的完整链路4.1 追加结构要加在 RESB 上不要加在别处增强字段的载体是 DDIC 追加结构。标准交付里 RESB 的客户包含是 CI_RSADD 这一类你可以直接往里面加字段也可以自己建一个 append 结构再挂上去两种方式效果一样。字段类型建议遵守几条经验数量类的用 QUAN单位单独一个字段存日期用 DATS需要跟外部系统对接的编码用 CHAR长度留够我一般至少 CHAR20吃过亏原来 CHAR6 的字段两年后业务要扩容改长度涉及表结构变更麻烦。加完字段记得激活然后在 SE11 里看一眼 RESB 的实际字段清单确认字段进去了。同时提醒一句加了 append 之后RESB 相关的标准报表、ALV、导出都会多这几个字段的底层字段但默认不显示需要显示就得单独处理界面或布局。4.2 BAPI_TE_RESB 与 BAPIPAREX 的拼接规则EXTENSIONIN是一个BAPIPAREX类型的表参数每一行的结构是字段内容STRUCTURE扩展结构名通常为BAPI_TE_RESBVALUEPART1拼接后的字符串前若干位是关键字段后面跟自定义字段值VALUEPART2~4当 VALUEPART1 的 240 个字符装不下时依次续接拼接顺序是有严格规定的必须先关键字段、后自定义字段顺序跟扩展结构在 DDIC 里的字段顺序一致。这里有几个容易出错的点第一关键字段是预留号 行号。预留号是 CHAR10行号是 CHAR4左补零。但是——新建场景下预留号还没产生你根本填不出来。我的实测经验是这种情况把 10 位预留号填成空格只填行号多数版本能按行号匹配上如果测试发现匹配失败就退化成先创建、提交、再补写的两步法先跑 BAPI 拿到预留号再用 UPDATE 或者再次调用修改类接口把增强字段补上。第二结构名必须大写且严格等于 DDIC 结构名不能带命名空间前缀也不能写成小写。附加结构名写错一个字结果就是增强字段静默丢失——不报错只是没值。第三数值和日期要按内部格式拼接。日期20240501不是2024.05.01数量不要带千分位负数用前置负号。- 之类的符号别混进来。DATA: ls_ext TYPE bapiparex, lt_ext TYPE STANDARD TABLE OF bapiparex, lv_key TYPE char14. 预留号未知时填空格 4 位行号左补零 CONCATENATE lv_rspos_c INTO lv_key. ls_ext-structure BAPI_TE_RESB. CONCATENATE lv_key lv_zzfield1 lv_zzfield2 INTO ls_ext-valuepart1. APPEND ls_ext TO lt_ext.如果自定义字段比较多、拼起来超过 240 个字符就把超出部分按顺序放到VALUEPART2、VALUEPART3。我的建议是尽量把自定义字段控制在 VALUEPART1 能装下的范围内超过 240 字符的增强字段组合维护和排查成本会陡然上升而且字段顺序一旦被后人调整前面所有调用点都可能悄悄失效。4.3 增强字段的 X 标记与校验兜底前面说过标准 BAPI 不校验 append 字段这里要展开说一句这意味着你得替它兜底。至少要做三件事值域检查如果 ZZ 字段有对应的配置表比如自定义的需求来源码表程序里先查一遍非法值直接打回 Excel 行长度检查接口传值超过字段定义长度会截断有时是隐式截断不报错前置检查长度最省事空值策略哪些 ZZ 字段允许为空哪些必须给这条规则只能靠业务约定写进模板说明里程序里做硬校验。需要给 ZZ 字段加下拉帮助F4的话在 MB21/MB23 屏幕上就得靠自定义子屏幕 PROCESS ON VALUE-REQUEST那段逻辑或者在报表里用 Search Help。这块和 BAPI 无关是界面层的活。4.4 提交时机别在 BAPI 返回后就急着补写一个常见误区是BAPI 返回成功后立刻对 RESB 做 UPDATE 补写增强字段。绝大多数情况下这行不通因为BAPI_RESERVATION_CREATE1不自动提交真正的数据库更新在BAPI_TRANSACTION_COMMIT执行时才发生。你在提交前 UPDATE要么锁住一条还没写入的记录、要么在并发场景下拿到脏数据。正确顺序永远是填参数 → 调 BAPI → 检查返回 → 有错误就BAPI_TRANSACTION_ROLLBACK并整单重试 → 无错误才BAPI_TRANSACTION_COMMIT EXPORTING WAIT X。如果用 EXTENSIONIN 走通了增强字段压根不需要补写这一步这也是我更推荐 EXTENSIONIN 的原因字段和数据同一次提交没有中间态。5. 可以直接抄的实现从校验到提交的完整骨架5.1 前置校验把错误挡在 BAPI 之前BAPI 的报错信息通常是给顾问看的业务人员看不懂。我的做法是程序里先做一轮校验把用户能理解的问题提前挑出来物料是否存在、是否在该工厂有视图查MARC或调BAPI_MATERIAL_GET_DETAIL批量场景建议一次SELECT到内表别在循环里单条查工厂、库存地点是否存在T001W、T001L移动类型是否允许预留T156以及是否被冻结权限调用者的权限对象M_MRES_BWA按工厂、M_MRES_WWA按移动类型是否覆盖需求日期、数量是否为正单位是否能转换。校验结果我习惯做成一张返回表行号、字段、错误描述前端一次性展示用户改完再上传。比让 BAPI 返回 100 条 MESSAGE 让业务自己猜要友好得多。5.2 主流程代码骨架FORM create_reservation USING it_input TYPE ty_t_input. DATA: ls_head TYPE bapi2093_res_head, lt_item TYPE STANDARD TABLE OF bapi2093_res_item, lt_itemx TYPE STANDARD TABLE OF bapi2093_res_itemx, ls_item TYPE bapi2093_res_item, ls_itemx TYPE bapi2093_res_itemx, lt_ext TYPE STANDARD TABLE OF bapiparex, ls_ext TYPE bapiparex, lt_return TYPE STANDARD TABLE OF bapiret2, lv_rsnum TYPE resb-rsnum. 1. 抬头一般只带关联订单预留号留空 CLEAR ls_head. 2. 行项目 LOOP AT it_input INTO DATA(ls_in). CLEAR ls_item. ls_item-res_item sy-tabix. ls_item-material ls_in-matnr. ls_item-plant ls_in-werks. ls_item-stge_loc ls_in-lgort. ls_item-move_type ls_in-bwart. ls_item-entry_qnt ls_in-menge. ls_item-entry_uom ls_in-meins. ls_item-requirement_date ls_in-bedat. ls_item-costcenter ls_in-kostl. ls_item-item_text ls_in-text. APPEND ls_item TO lt_item. 3. X 标记 CLEAR ls_itemx. ls_itemx-bapiupdate X. APPEND ls_itemx TO lt_itemx. 4. 增强字段 CLEAR ls_ext. ls_ext-structure BAPI_TE_RESB. CONCATENATE ls_in-rspos_c ls_in-zzfield1 ls_in-zzfield2 INTO ls_ext-valuepart1. APPEND ls_ext TO lt_ext. ENDLOOP. 5. 调用 CALL FUNCTION BAPI_RESERVATION_CREATE1 EXPORTING reservation_header ls_head TABLES reservation_items lt_item reservation_itemsx lt_itemx extensionin lt_ext return lt_return. 6. 结果判断 READ TABLE lt_return TRANSPORTING NO FIELDS WITH KEY type E. IF sy-subrc 0. CALL FUNCTION BAPI_TRANSACTION_ROLLBACK. 解析 lt_return 逐条反馈给用户 ELSE. CALL FUNCTION BAPI_TRANSACTION_COMMIT EXPORTING wait X. 取预留号从抬头结构或返回消息中解析视版本而定 ENDIF. ENDFORM.这段代码里有两处需要你按自己系统的情况确认一是行项目 X 结构的具体字段名BAPIUPDATE还是逐字段 X二是预留号返回的位置有的版本在抬头结构的RESERVATION_NUMBER有的只在返回消息文本里。用 SE37 单步跑一次把参数值 dump 出来看比查文档快。5.3 返回消息解析不要只看有没有错误BAPIRET2表里可能同时有成功消息TYPE S和错误消息TYPE E。只要出现 E 或 A整个 LUW 就不该提交哪怕前面已经有一些 S 消息。我见过有程序只判断lt_return是否为空结果部分成功被当成成功提交了事后对账发现少了一半预留。解析消息建议优先用结构里的MESSAGE字段直接展示需要更友好时再用MESSAGE_V1~V4和ID/NUMBER调FORMAT_MESSAGE或BAPI_MESSAGE_GETDETAIL拼完整文本。批量场景下把出错行号跟消息一起写日志表出问题可以按单号追溯这个习惯我在三个项目里都保留了下来救过我好几次。5.4 写完之后怎么验证增强字段真的进去了验证顺序建议这样走先在 MB23 里输入预留号看行项目明细有没有你的 ZZ 字段如果屏幕上没加就跳过这步然后 SE16N 查 RESB条件RSNUM 刚返回的预留号看 ZZ 字段的值对不对最后再跑一次 MB1A/MB1B 冲销或领用确认这个预留能被正常消耗增强字段不影响标准过账。第三步最容易被忽略但恰恰是最重要的——增强字段如果错误地占用了标准字段的位置或者长度溢出问题往往在后续过账时才暴露。6. 报错排查速查表与踩坑记录6.1 常见报错与根因对照现象/消息大概率根因处理办法物料不存在没做前导零转换或物料在该工厂无视图加 ALPHA_INPUT 转换查 MARC单位无效 / 单位转换异常用了外部单位写法CUNIT_INPUT 转换并处理异常库存地点必输移动类型涉及库存但没给 LGORT按移动类型补齐必输字段成本中心必输移动类型 201 类场景补 COSTCENTER预留号为空 / 取不到号判断逻辑只看 return 是否为空检查 E/A 消息 确认返回字段位置增强字段没值、也不报错结构名拼错、字段顺序错、X 未置位、预留号关键字段填法不对逐项对照 DDIC 顺序与 SE37 参数结构提交后仍查不到数据忘了 COMMIT或者 COMMIT 未加 WAITBAPI_TRANSACTION_COMMITWAIT X6.2 增强字段写不进去的四种典型情况第一种是扩展结构没接住字段。你往 RESB 上加了 append但BAPI_TE_RESB里并没有包含这段 appendBAPI 收到 EXTENSIONIN 也不知道往哪塞。验证方法很直接SE11 打开BAPI_TE_RESB看字段清单里有没有你的 ZZ 字段。第二种是字段顺序对不上。DDIC 结构里字段是 A、B、C你拼成了 C、A、BBAPI 会照单收下然后把值写错位——A 的值写进 C 的字段里。这种错最难查因为不报错、值也有只是全错位。第三种是关键字段匹配失败。新建场景下预留号未知你按空格 行号拼某些版本匹配不上表现就是增强字段全部为空。这时候改成两步法。第四种是长度溢出被截断。ZZ 字段定义是 CHAR10你拼了 15 个字符进去前面的关键字段被挤占了位置值全乱。程序里对每个待拼接字段做长度断言成本极低收益极高。6.3 批量场景的性能与锁一千条以上预留批量创建性能瓶颈通常不在 BAPI 本身而在前置校验。我的一般做法是把物料、工厂、库存地点的校验数据一次性SELECT到内表用FOR ALL ENTRIES注意去重和空表判断循环里只查内存BAPI 调用可以按 100~200 条一批切分每批结束提交一次避免单个 LUW 过大导致更新任务超时或者回滚成本过高。锁的问题也要注意如果预留要挂在同一张生产订单上多个进程并发创建同订单的预留可能出现更新任务里的锁等待。批量作业建议串行跑或者按订单号做分片别让两个作业同时处理同一批订单。6.4 修改类 BAPI 的通用规律拿采购订单改价做个类比创建类 BAPI 相对简单真正容易出事的是修改类。举个大家都熟的例子——采购订单改价格。很多人第一反应是直接BAPI_PO_CHANGE把新价格塞进POITEM结果改完之后发现其他字段比如交货日期、库存地点莫名其妙被清空了。原因就是没先读现状修改类 BAPI 的标准逻辑是你给了什么就改什么但如果 X 结构大面积置位而值结构没对应给值标准逻辑就可能把空值写进去。正确姿势是先调BAPI_PO_GETDETAIL把当前行项目读出来做底稿只改要改的字段并对应置 X条件价格条件相关的还要单独走CONDITIONS参数。价格类字段往往不是直接字段而是条件记录改价格本质上是改条件KOMV那套逻辑所以还可能涉及条件类型的有效性、有效期、是否允许手工修改等限制。如果订单已经有收货或者发票校验改价还会被业务规则拦住——这不是 BAPI 的锅是标准业务约束。把这条规律抽象出来对预留创建同样适用修改类接口先读后写、按需置 X创建类接口一次给全、整体提交。这两句话能解决 80% 的 BAPI 疑难杂症。7. 思路迁移PLAF 和 FAGLL03H 的增强字段取值为什么更容易出问题7.1 PLAF 增强字段值会被 MRP 冲掉PLAF 是计划订单表很多项目会往它上面加 append 存自定义字段比如项目号、客户特殊标识。做了之后普遍会遇到一个现象白天手工维护的值好好的晚上 MRP 跑完值全没了。原因不复杂——MRP 运算在重新生成计划订单时是删除重建的逻辑原有的记录被删掉、新记录插进来你附加字段的值自然跟着一起消失了。所以 PLAF 上的增强字段正确的做法是三条同时上一是把值落到自定义 Z 表用物料 工厂 需求日期或计划订单号做关联键作为事实来源二是在计划订单生成/修改的出口BAdI 或对应增强点里从 Z 表把值重新带进 PLAF 的附加字段三是所有读 PLAF 的报表不要相信附加字段一定有值用 LEFT OUTER JOIN 关联 Z 表兜底。第三条尤其关键我见过太多报表直接读 PLAF 的 ZZ 字段MRP 跑完就全线飘空排查半天才发现是数据被重建了。还有一个延展点计划订单转生产订单或者转采购申请的时候PLAF 的附加字段不会自动传到 AFPO/AUFK 上需要在转换的出口里显式赋值否则计划阶段有值、执行阶段丢值业务会以为是系统 bug。7.2 FAGLL03H 增强字段取值报表增强的通用套路总账行项目报表 FAGLL03H 的增强字段取值是另一个高频话题。这类报表增强和表增强的区别在于字段可能加在输出结构上但值是运行时算出来的不落表。它的一般套路由两部分组成——附加结构负责定义字段报表出口/BAdI 负责在取数完成后、输出之前把值填进内部表。这里最容易犯的错是取值时机。报表增强的时机点通常有三个取数之前准备阶段、取数之后输出之前填充阶段、输出之后太晚。放在第三个位置你会看到首屏有值、翻页或重新排序后值消失或者合计行不参与计算。核心检查点是附加字段必须和主记录同粒度对齐。FAGLL03H 的行项目粒度是凭证 行项目如果你的值是按科目或按客户汇总出来的直接塞进行项目级别就会出现同一行重复计算、合计翻倍的问题。另外注意数据源一致性。新版总账报表读的是 FAGLFLEXA 这类新总账表如果你取值取自旧的 BSEG 或者自定义汇总表两边的口径比如货币、汇率日期、冲销标识可能对不上最终表现为个别凭证有值、大部分为空。做之前先把报表的数据源摸清楚再决定从哪里取值比先写代码再调口径省事得多。7.3 三条共通的判断标准把 RESB、PLAF、FAGLL03H 三件事放在一起看其实判断标准只有三条第一这个值会不会被系统重建会被重建PLAF 遇 MRP就必须设计落库 重灌机制不会被重建RESB 的预留直接写在表上就行。第二写值的动作在不在同一个 LUW 里在同一个 LUW优先用扩展参数EXTENSIONIN 这类跨 LUW就必须先提交再补写并且设计好中间态的数据一致性。第三谁负责校验这些字段标准工具一律不校验附加字段所以校验责任 100% 在你这边。这条想清楚了就不太会出现数据进去了但全是脏值的尴尬场面。8. 一些实际操作中的体会前后做过四五个预留批量创建的活最大的感受是难点从来不在写 BAPI 调用而在字段从哪来、往哪去、什么时候写这三件事上。BAPI 的签名翻来覆去就那么几个参数照着 SE37 填就行真正耗时间的是搞清楚增强字段在 DDIC、接口、界面三层里的对应关系以及提交时机。我现在的固定流程是先手工在 MB21 建一条带增强字段的预留用 SE16N 把 RKPF 和 RESB 的记录看一遍确认值落在哪个字段然后照这份标准答案去写 BAPI写完立刻用 SE37 单步跑一次对比最后才做批量程序和前置校验。这个顺序看着笨但从来没让我在增强字段上返工过。还有一个实用的小技巧把每次 BAPI 调用的完整输入参数和返回消息写进一张日志表含时间戳、调用者、预留号、错误文本上线初期业务反馈问题直接查日志就能定位是数据问题、权限问题还是程序问题不用让用户复现。这张表我原本是为了排查偶发问题建的后来变成了日常对账工具业务自己都会去查。如果后续还要扩展可以在这张日志表上再加一列来源单据号直接跟上游系统对账做月度核对会轻松很多。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →