业务背景介绍:
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会跳回到隐式增强处。