跨工厂展开BOM函数
1.根据预测物料+供货工厂,展开该预测物料的多层BOM表取得子件单个用量 ,子件清单中包含预测物料本身,预测物料供货工厂
展开BOM子件过滤条件:
A.固定标记FMENG为空
B.终止组NFEAG为空
C.优先级ALPRF为空或者为1
2.根据BOM展开的特殊采购类型做以下判断
A.如果特殊采购类型为空的子件不做处理
B.如特殊采购类型为31,则子件供货工厂=1202,该子件需到1202 工厂继续展开BOM得到该子件的BOM多层展开物料清单
C.如特殊采购类型不为空且不等于31,则通过子件供货工厂+特殊采购类型到表T460A获取WRK02转储工厂
如转储工厂不为空,则更新子件发货工厂为转储工厂;
再根据该子件+子件发货工厂到生产版本表MAKL 取出有效期范围包含查询日期 且 可选BOM STALT 不为空数据行
如果有数据,则根据子件+子件供货工厂 继续展开BOM,得到下一层的
FUNCTION ZFCS_BOM_EXPL_MAT.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_MATNR) TYPE MATNR
*" VALUE(I_WERKS) TYPE WERKS_D
*" VALUE(I_EMENG) TYPE BASMN
*" TABLES
*" STB STRUCTURE STPOX OPTIONAL
*"----------------------------------------------------------------------
DATA:TOPMAT LIKE CSTMAT .
DATA:DSTST LIKE CSDATA-XFELD .
DATA:STB_L LIKE STPOX OCCURS 0 WITH HEADER LINE .
DATA:LV_T460A TYPE T460A .
DATA:LV_MKAL TYPE MKAL .
DATA:LV_MARC TYPE MARC .
DATA:LV_FLAG TYPE C .
DATA:MATCAT LIKE CSCMAT OCCURS 0 WITH HEADER LINE .
CLEAR STB[] .
CLEAR MATCAT[] .
CLEAR TOPMAT .
CLEAR DSTST .
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
CAPID = 'PP01'
DATUV = SY-DATUM
MTNRV = I_MATNR
MEHRS = ''
WERKS = I_WERKS "
EMENG = I_EMENG "需求数量
RNDKZ = '1'
IMPORTING
TOPMAT = TOPMAT
DSTST = DSTST
TABLES
STB = STB "展开的BOM存放在该内表
* MATCAT = 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.
* CALL FUNCTION 'ZFCS_BOM_EXPL_MAT_SUB'
* EXPORTING
* I_MATNR = I_MATNR
* I_WERKS = I_WERKS
* I_EMENG = I_EMENG
* TABLES
* STB = STB[].
DELETE STB WHERE FMENG IS NOT INITIAL
OR NFEAG IS NOT INITIAL
OR ( ALPRF <> 1 AND ALPRF <> '' )
.
LOOP AT STB WHERE ZFLAGL IS INITIAL.
* CLEAR lv_marc .
* SELECT SINGLE sobsl INTO lv_marc-sobsl FROM marc
* WHERE werks = stb-werks
* AND matnr = stb-idnrk
* .
IF STB-SOBSL IS NOT INITIAL.
CLEAR LV_FLAG .
IF STB-SOBSL <> '31'.
CLEAR LV_T460A .
SELECT SINGLE WRK02 INTO LV_T460A-WRK02 FROM T460A
WHERE WERKS = STB-WERKS
AND SOBSL = STB-SOBSL
.
IF LV_T460A-WRK02 IS NOT INITIAL.
STB-WERKS = LV_T460A-WRK02.
CLEAR LV_MKAL .
SELECT SINGLE * INTO CORRESPONDING FIELDS OF LV_MKAL FROM MKAL
WHERE MATNR = STB-IDNRK
AND WERKS = STB-WERKS
AND BDATU >= SY-DATUM
AND ADATU <= SY-DATUM
AND STLAL <> ''
.
* IF LV_MKAL IS NOT INITIAL.
* LV_FLAG = 'X'.
* ENDIF.
ENDIF.
ENDIF.
ENDIF.
* IF lv_flag IS INITIAL.
CLEAR STB_L[] .
CLEAR TOPMAT .
CLEAR DSTST .
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
CAPID = 'PP01'
DATUV = SY-DATUM
MTNRV = STB-IDNRK
MEHRS = ''
WERKS = STB-WERKS "
EMENG = STB-MNGLG "需求数量
RNDKZ = '1'
IMPORTING
TOPMAT = TOPMAT
DSTST = DSTST
TABLES
STB = STB_L[] "展开的BOM存放在该内表
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.
* CALL FUNCTION 'ZFCS_BOM_EXPL_MAT_SUB'
* EXPORTING
* I_MATNR = STB-IDNRK
* I_WERKS = STB-WERKS
* I_EMENG = STB-MNGLG
* TABLES
* STB = STB_L[].
IF STB_L[] IS NOT INITIAL.
DELETE STB_L WHERE FMENG IS NOT INITIAL
OR NFEAG IS NOT INITIAL
OR ( ALPRF <> 1 AND ALPRF <> '' )
.
APPEND LINES OF STB_L TO STB.
ENDIF.
IF STB-SOBSL = '31'.
IF STB-WERKS <> '1202'.
STB-WERKS = '1202'.
APPEND STB.
STB-ZFLAGL1 = 'X'.
ENDIF.
ENDIF.
STB-ZFLAGL = 'X'.
MODIFY STB .
CLEAR STB.
ENDLOOP.
DELETE STB WHERE ZFLAGL1 IS NOT INITIAL .
LOOP AT STB .
CLEAR STB-ZFLAGL.
MODIFY STB TRANSPORTING ZFLAGL.
CLEAR STB.
ENDLOOP.
ENDFUNCTION.