tcode cs12 可以展开BOM
程序展开BOM 的函数则是 CS_BOM_EXPL_MAT_V2
实现多级展开实例--
* - 1 取物料BOM信息
SELECT stko~stlty
stko~stlnr
stko~labor
stko~stktx
mast~matnr
mast~werks
mast~stlan
mast~stlal
stko~stlst
stko~bmeng
stko~bmein
INTO CORRESPONDING FIELDS OF TABLE it_stpu
FROM mast
JOIN mara ON mast~matnr = mara~matnr
INNER JOIN stko ON mast~stlnr = stko~stlnr AND mast~stlal = stko~stlal
WHERE mast~werks EQ p_werks
AND mast~matnr IN s_matnr
AND mast~stlan = p_stlan
AND mara~mtart = 'FG'
AND stko~stlst IN s_stlst
AND stko~stlty EQ 'M'
AND stko~datuv <= p_datuv.
循环第一层物料,针对第一个物料M1 展开BOM 放进内表A,loop A表,逐个展开中物料追加到A表,直到M1下级完全展开,再进行物料M2
逐步扩大A表。
2,逐个物料展开 追加到内表
n1 = 1.
LOOP AT it_stpu. “
*- BOM展开
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
auskz = 'X'
emeng = it_stpu-bmeng
capid = 'PP01' " Application ID
datuv = p_datuv " Validity date
werks = p_werks " Plant
mtnrv = it_stpu-matnr " Material
stlan = p_stlan " BOM usage
mehrs = '' "l_mehrs " Multi-level explosion
TABLES
stb = it_stpox
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.
IF sy-subrc = 0.
LOOP AT it_stpox.
n1 = sy-tabix.
CLEAR gt_maktx.
READ TABLE gt_maktx WITH KEY matnr = it_stpox-idnrk BINARY SEARCH.
IF gt_maktx-mtart = 'COMP' AND gt_maktx-werks <> ''."半成品取自制件工厂BOM
it_stpox-werks = gt_maktx-werks.
MODIFY it_stpox.
ENDIF.
"取下阶
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
auskz = 'X'
emeng = it_stpox-mnglg
capid = 'PP01' " Application ID
datuv = p_datuv " Validity date
werks = it_stpox-werks " Plant
mtnrv = it_stpox-idnrk " Material
stlan = p_stlan " BOM usage
mehrs = '' "l_mehrs " Multi-level explosion
TABLES
stb = it_stpox1
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.
LOOP AT it_stpox1.
n1 = n1 + 1.
it_stpox1-stufe = it_stpox-stufe + 1.
INSERT it_stpox1 INTO it_stpox INDEX n1.
ENDLOOP.
MOVE-CORRESPONDING it_stpox TO itab.
MOVE : it_stpu-matnr TO itab-matnr,
it_stpu-bmeng TO itab-bmeng,
it_stpu-bmein TO itab-bmein,
it_stpox-ojtxp TO itab-makta,"组件物料描述
it_stpox-matkl TO itab-matkl,
it_stpox-stufe TO itab-stufe.
IF it_stpox-alpgr = ''.
itab-ewahr = 100.
ENDIF.
IF it_stpox1[] IS NOT INITIAL.
itab-nexts = 1."有下阶
ENDIF.
itab-menge = it_stpox-mnglg."MNGLG包含报废 * ( 1 + it_stpox-ausch / 100 )."考虑报废率
APPEND itab.
CLEAR r_matnr.
r_matnr(3) = 'IEQ'.
r_matnr-low = it_stpox-idnrk.
COLLECT r_matnr.
CLEAR it_stpox1[].
CLEAR : itab, it_stpox.
ENDLOOP.
ENDIF.
CLEAR: it_stpox[].
ENDLOOP.
IF itab[] IS INITIAL.
MESSAGE i208(00) WITH '没有符合条件的数据,请重新输入!'.
STOP.
ENDIF.