ABAP VA01增强,调整组件数量
业务背景介绍:
VA01创建时,输入成品物料,会自动展开其销售BOM(CS03中BOM用途为5),当下面存在BOM组件有组件报废率时,在销售订单中的数量,需要加上可能报废的数量。
比如组件报废率为5(这里都是百分比的stpox-ausch),则该 销售订单行数量 = 销售订单行数量 + 销售订单行数量 * 0.05。
经过测试,最终写了个隐式增强,打开SE38 -> FV45SFST_STRUKTUR_ANLEGEN_POSI,
这里用的是浮点数算法,另外新建了个接口(接口使用固定点算法)用来计算上面的销售订单行数量。
接口参考:
代码参考:

IF vbak-kunnr EQ '0005000000' . DATA:wa_topmat TYPE cstmat. DATA: lt_stpox LIKE TABLE OF stpox. * GET PARAMETER ID 'BOMPOSNR2' FIELD lv_bomposnr. "该物料在BOM的项目号 READ TABLE xvbap INTO DATA(ls_xvbap) WITH KEY posnr = vbap-uepos."获取上层物料号 IF sy-subrc EQ 0 AND ls_xvbap-pstyv EQ 'ZTAQ'. READ TABLE xvbep INTO DATA(ls_xvbep) WITH KEY posnr = vbap-uepos."获取上层物料号的数量 CALL FUNCTION 'CS_BOM_EXPL_MAT_V2' "展开BOM,获取组件报废率 EXPORTING aufsw = 'X' capid = 'PP01' "checkb "BOM应用 datuv = sy-datum "有效起始日 mtnrv = ls_xvbap-matnr "展开物料号 postp = ' ' "项目类别(物料单) stlan = '5' "BOM用途(销售BOM) stlal = '01' "可选的BOM werks = ls_xvbap-werks "工厂 emeng = ls_xvbep-wmeng "数量 gsmng计划订单总数量 bdmng需求量 mehrs = 'X' IMPORTING topmat = wa_topmat * DSTST = TABLES stb = lt_stpox * MATCAT = EXCEPTIONS alt_not_found = 1 call_invalid = 2 material_not_found = 3 missing_authorization = 4 no_bom_found = 5 no_plant_data = 6 no_suitable_bom_found = 7 conversion_error = 8 OTHERS = 9. READ TABLE lt_stpox INTO DATA(ls_stpox) WITH KEY posnr = xstb-posnr idnrk = vbap-matnr. IF sy-subrc EQ 0. IF ls_stpox-ausch NE 0. * vbap-kwmeng = ls_stpox-mngko * ls_stpox-ausch. * vbap-kwmeng = vbap-kwmeng / '100'. * DATA: lv_formula TYPE string. * lv_formula = |{ ls_stpox-mngko } * { ls_stpox-ausch } / 100|. * CALL FUNCTION 'EVAL_FORMULA' * EXPORTING * formula = lv_formula * IMPORTING * value = vbap-kwmeng * EXCEPTIONS * division_by_zero = 1 * OTHERS = 11. * vbap-kwmeng = ls_stpox-mngko * vbap-kwmeng. CALL FUNCTION 'Z_RFC_SD_VA01' EXPORTING p_mngko = ls_stpox-mngko p_ausch = ls_stpox-ausch IMPORTING p_kwmeng = xstb-MNGLG. xstb-MNGKO = xstb-MNGLG. ENDIF. ENDIF. CLEAR ls_xvbep. ENDIF. ENDIF.
背后延申:
经过这里
,进入该form,最终会进入到出口MV45AFZZ(se38可进),我在
userexit_move_field_to_vbap中试着改过vbap-kwmeng,结果更改后的数量不能再次在va01中手动调整,而且保存之后,数量也会变回未更改的状态,最终选择了上面的隐式增强。隐式增强也是执行到这里时,按F7会跳到一个function,再按F5会跳回到隐式增强处。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)