一个PS报表中的需求,要求求销售订单的计划成本,其中就包括计划物料成本,比较确准的计算主法就是遍历BOM,求出物料成本. 如果在创建销售订单时项目BOM可以产生,且用户进行了成本估算,则完全可以从系统表中取出系统计算的计划成本,此法简单且快,但可惜不是所有的销售订单都能满足. 代码如下:
DATA: v_vbeln LIKE vbap-vbeln, v_posnr LIKE vbap-posnr, v_matnr LIKE vbap-matnr, v_plcst LIKE vbap-netwr, v_plcst2 LIKE vbap-netwr, v_menge LIKE stpo-menge. " 数量初始变量 v_vbeln = '0002000008'. v_posnr = '000010'. v_matnr = 'FT820'. "v_menge = 1. PERFORM calc_plncst_b USING v_vbeln v_posnr v_matnr v_menge CHANGING v_plcst. * 总成本 固定成本 可变成本 * 货物制造成本 133,680.99 32,756.59 100,924.40 CNY WRITE: 'BOM成本:' ,v_plcst. *&---------------------------------------------------------------------* *& Form calc_plncst_b *&---------------------------------------------------------------------* * 遍历BOM计算计划物料成本,因为在生产本报表时基本上已经都存在项目BOM了, * 故此法虽慢,却可满足所有情况. *----------------------------------------------------------------------* FORM calc_plncst_b USING p_vbeln p_posnr p_matnr p_menge CHANGING p_plcst. " 订议BOM展开的结构 DATA: BEGIN OF wa_bom, idnrk LIKE stpo-idnrk, " 物料号 menge LIKE stpo-menge, " 用量 END OF wa_bom. DATA: it_bom_fst LIKE TABLE OF wa_bom, it_bom_temp LIKE TABLE OF wa_bom. DATA: v_stlnr LIKE kdst-stlnr, * v_cst_tmp LIKE vbap-netwr, " 临时成本变量 v_stprs LIKE mbew-stprs. " 物料标准价格 SELECT SINGLE stlnr INTO v_stlnr FROM kdst WHERE vbeln = p_vbeln AND vbpos = p_posnr AND matnr = p_matnr. IF sy-subrc <> 0. "没找到记录,说明是叶子节点 SELECT SINGLE stprs INTO v_stprs FROM mbew WHERE matnr = p_matnr. p_plcst = p_plcst + p_menge * v_stprs. ELSE. "找到了,接着走(递归) SELECT idnrk menge INTO CORRESPONDING FIELDS OF TABLE it_bom_fst FROM stpo WHERE stlnr = v_stlnr. FIELD-SYMBOLS: <wa> LIKE wa_bom. LOOP AT it_bom_fst ASSIGNING <wa>. PERFORM calc_plncst_b USING p_vbeln p_posnr <wa>-idnrk <wa>-menge CHANGING p_plcst. ENDLOOP. ENDIF. ENDFORM. " calc_plncst_b