# SAP交货单删除拦截:外部系统已处理的单据,怎么不让用户乱删?

📅 发布时间:2026/8/13 9:16:32
# SAP交货单删除拦截:外部系统已处理的单据,怎么不让用户乱删?
## 一、业务痛点上了WMS之后SAP和WMS两套系统并行最头疼的就是数据一致性。一张交货单已经推到WMS仓库都拣货发货了结果SAP这边有人手滑给删了。WMS数据还在SAP没了两边对账对不上事后排查半天。内向交货单也一样WMS都收货上架了SAP端还能改还能删库存直接乱套。核心问题**SAP标准功能不关心外部系统状态想删就删**。怎么让SAP删单之前先去WMS问一句处理了没处理了就不让删## 二、整体思路两个隐式增强打配合PBO打开单据 → 调WMS接口查状态 → 写入内存ID↓用户点删除 → 读内存ID → 已处理→ 拦截 提示为什么两个增强PBO阶段能拿完整数据调接口但管不了操作PAI能拦截操作但调接口又慢。分工协作各干擅长的。## 三、增强点怎么找两个增强点都在 SAPMV50A 的Include里- **PBO拉状态**Include MV50AF0B_BELEG_LESEN_SIMPLEFORM beleg_lesen_simple 里在 ENHANCEMENT-POINT mv50af0b_beleg_lesen_simple_01 SPOTS es_sapmv50a STATIC 之后。单据读取完成时触发能拿到完整的 LIKP/LIPS 数据。- **删除拦截**Include MV50AF0F_FUNKTION_AUSFUEHRENFORM funktion_ausfuehren 的最开头。功能码执行前触发能拿到当前 fcode 并修改。找增强点的思路VL02N里 /h 进调试设断点 SY-UCOMM LOESCH_TA顺着调用栈找到处理功能码的Form再看Form里有没有 ENHANCEMENT-POINT 或隐式增强点。也可以SE80看程序的增强点列表直接搜 ES_SAPMV50A 这个增强点。## 四、PBO拉状态在 beleg_lesen_simple 的增强点里先判断单据类型再查WMS处理状态结果塞到内存IDabapFORM load_ext_status USING uv_delnr TYPE vbeln_vluv_doctp TYPE vbtyp.DATA: lv_locked TYPE flag.CHECK NOT uv_delnr IS INITIAL.IF uv_doctp J. 外向交货看推送日志里有没有记录SELECT SINGLE lifex INTO DATA(lv_refno)FROM ztmm_log_001WHERE vbeln uv_delnn.IF sy-subrc 0 AND lv_refno IS NOT INITIAL.lv_locked abap_true.ENDIF.ELSEIF uv_doctp 7. 内向交货调RFC去WMS查PERFORM rfc_wms_query USING uv_delnr CHANGING lv_locked.ENDIF.EXPORT lv_locked TO MEMORY ID ZMM_DEL_LOCK_FLAG.ENDFORM.WMS那边用RFC函数去查具体实现各家不一样核心是把能不能删的布尔值带回来就行。## 五、删除拦截在 funktion_ausfuehren 最开头的增强点里先看一眼功能码是不是删除是就去内存里取状态abapFORM prevent_delete CHANGING cv_okcode TYPE sy-ucomm.DATA: lv_lock TYPE flag.CHECK cv_okcode LOESCH_TAOR cv_okcode /ELOESCH_TA.IMPORT lv_lock FROM MEMORY ID ZMM_DEL_LOCK_FLAG.CHECK sy-subrc 0.CHECK lv_lock abap_true. 关键把功能码清空等于这次操作没发生CLEAR cv_okcode.MESSAGE s004(zmm01) DISPLAY LIKE E.EXIT.ENDFORM.核心就这招 **CLEAR fcode**。SAP的PAI是靠功能码驱动的你把功能码清了标准程序就不知道该干啥了等于操作被取消。再配个 MESSAGE S ... DISPLAY LIKE ES类消息不会把程序搞死但显示出来是红色的错误样式用户一看就明白。## 六、小结两个隐式增强几十行代码就实现了跨系统的操作控制。思路很朴素**PBO拉状态存内存操作时读内存拦截**。隐式增强的好处是灵活 — 想在哪插就在哪插能拿到标准程序里的所有变量。对于这种标准功能没出口业务又必须要的场景就是最实用的选择。