*&---------------------------------------------------------------------*
*& Report ZMMR003
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZMMR003 .
TYPE-POOLS :SLIS .
TABLES :MAST , MARA , STKO , MAKT , AFKO , AFPO , AUFK .
DATA :STB LIKE STPOX OCCURS 0 WITH HEADER LINE .
DATA : BEGIN OF MATCAT OCCURS 0 .
INCLUDE STRUCTURE CSCMAT .
DATA : END OF MATCAT .
DATA : BEGIN OF MATS .
INCLUDE STRUCTURE CSCMAT .
DATA : END OF MATS .
DATA : BEGIN OF SELPOOL .
INCLUDE STRUCTURE CSTMAT .
DATA : END OF SELPOOL .
DATA : DSTST_FLG LIKE CSDATA -XFELD .
DATA : LAYOUT TYPE SLIS_LAYOUT_ALV ,
GS_LAYOUT TYPE SLIS_LAYOUT_ALV ,
G_REPID LIKE SY -REPID .
DATA : WA_ALV_FIELD TYPE SLIS_FIELDCAT_ALV , "列描述内表,列清单
WA_ALV_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV , "定义内表
G_USER_COMMAND TYPE SLIS_FORMNAME VALUE 'USER_COMMAND' .
DATA : BEGIN OF WA_DATA ,
WERKS LIKE AUFK -WERKS ,
AUFNR LIKE AFKO -AUFNR ,
OBJNR LIKE AUFK -OBJNR ,
PLNBEZ LIKE AFKO -PLNBEZ ,
GAMNG LIKE AFKO -GAMNG ,
END OF WA_DATA .
DATA : IT_DATA LIKE WA_DATA OCCURS 0 WITH HEADER LINE .
DATA : ITAB TYPE TABLE OF ZMMSF003 WITH HEADER LINE .
DATA : IT_OUT TYPE TABLE OF ZMMSF003 WITH HEADER LINE .
DATA :IT_OBJNR TYPE TABLE OF JEST WITH HEADER LINE .
DATA : BEGIN OF WA_BATCH ,
WERKS TYPE MCHB -WERKS ,
MATNR TYPE MCHB -MATNR ,
LGORT TYPE MCHB -LGORT ,
CHARG TYPE MCHB -CHARG ,
CLABS TYPE MCHB -CLABS ,
END OF WA_BATCH .
DATA : IT_BATCH LIKE TABLE OF WA_BATCH WITH HEADER LINE .
SELECTION-SCREEN BEGIN OF BLOCK BLOCK1 WITH FRAME TITLE TEXT - 001 .
SELECT-OPTIONS : S_WERKS FOR AUFK -WERKS ,
S_AUFNR FOR AFKO -AUFNR ,
S_MATNR FOR AFKO -PLNBEZ .
"PARAMETERS: S_AUART LIKE AUFK-AUART.
SELECTION-SCREEN END OF BLOCK BLOCK1 .
INITIALIZATION .
G_REPID = SY -REPID .
START-OF-SELECTION .
PERFORM GETDATA .
PERFORM DISPLAYDATA .
PERFORM LAYOUT_INIT CHANGING GS_LAYOUT .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' "调用ALV 显示表单数据
EXPORTING
I_CALLBACK_PROGRAM = SY -REPID
"i_callback_top_of_page = 'TOP_OF_PAGE'
IT_FIELDCAT = WA_ALV_FIELDCAT
IS_LAYOUT = GS_LAYOUT
I_CALLBACK_USER_COMMAND = G_USER_COMMAND
TABLES
T_OUTTAB = IT_OUT
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2 .
IF SY -SUBRC <> 0 .
MESSAGE ID SY -MSGID TYPE SY -MSGTY NUMBER SY -MSGNO
WITH SY -MSGV1 SY -MSGV2 SY -MSGV3 SY -MSGV4 .
ENDIF .
*&---------------------------------------------------------------------*
*& Form getdata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM GETDATA .
SELECT
AUFK ~WERKS
AUFK ~AUFNR
AUFK ~OBJNR
AFKO ~PLNBEZ
AFKO ~GAMNG
INTO CORRESPONDING FIELDS OF TABLE IT_DATA
FROM AUFK inner JOIN AFKO ON AUFK ~AUFNR = AFKO ~AUFNR WHERE AUFK ~WERKS IN S_WERKS AND AFKO ~AUFNR IN S_AUFNR AND AFKO ~PLNBEZ IN S_MATNR AND AUFK ~AUART = 'PP01' .
SORT IT_DATA BY AUFNR PLNBEZ .
DELETE IT_DATA WHERE PLNBEZ IS INITIAL .
LOOP AT IT_DATA INTO WA_DATA .
SELECT * INTO CORRESPONDING FIELDS OF TABLE IT_OBJNR FROM JEST WHERE OBJNR = WA_DATA -OBJNR AND STAT = 'I0002' AND INACT = '' .
IF IT_OBJNR[] IS NOT INITIAL . "工单已下达
SELECT SINGLE LGORT INTO ITAB -LGORT FROM AFPO WHERE AUFNR = WA_DATA -AUFNR .
SELECT SINGLE MAKTX INTO ITAB -MAKTX FROM MAKT WHERE MATNR = WA_DATA -PLNBEZ .
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
CAPID = 'PP01' "BOM 应用程序
DATUV = SY -DATUM "有效起始日
" emeng = p_emeng " 基本数量 Required quantity STKO-BMENG
MTNRV = WA_DATA -PLNBEZ "成品号或半成品号
STLAN = '1' "BOM 用途,1 代表生产
STLAL = '' "可选BOM
MKTLS = 'X'
MEHRS = 'X' "是否多层展开,'X' 代表多层
RNDKZ = '1' "Round off: ' '=always, '1'=never, '2'=only levels > 1 是否取整
WERKS = WA_DATA -WERKS "工厂
IMPORTING
TOPMAT = SELPOOL "开始BOM 展开的物料显示
DSTST = DSTST_FLG "BOM 帮助字段
TABLES
STB = STB
MATCAT = MATCAT "下面含有组件的物料存放在该内表对应 STB-TTIDX 在类别表内的索引﹐标志直属哪个物料下的 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
OTHERS = 8 .
DELETE STB WHERE MTART <> 'ROH' .
SORT STB BY IDNRK .
DATA : S_IDNRK LIKE STPOX -IDNRK .
S_IDNRK = '' .
IF STB[] IS NOT INITIAL .
LOOP AT STB .
DATA : S_MMEIN ( 2 ) TYPE C .
IF S_IDNRK <> STB -IDNRK .
ITAB -WERKS = STB -WERKS .
ITAB -IDNRK = STB -IDNRK . "组件
ITAB -MNGKO = STB -MNGKO * WA_DATA -GAMNG . "用量
IF STB -MMEIN = 'ST' . "ST单位变为PC
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
EXPORTING
INPUT = STB -MMEIN
IMPORTING
OUTPUT = S_MMEIN
EXCEPTIONS
UNIT_NOT_FOUND = 1
OTHERS = 2 .
ITAB -MMEIN = S_MMEIN .
ELSE .
ITAB -MMEIN = STB -MMEIN . "基本计量单位
ENDIF .
ITAB -MATNR = WA_DATA -PLNBEZ .
ITAB -AUFNR = WA_DATA -AUFNR .
APPEND ITAB .
S_IDNRK = STB -IDNRK .
ELSE .
ITAB -MNGKO = ITAB -MNGKO + STB -MNGKO * WA_DATA -GAMNG .
SY -TABIX = SY -TABIX - 1 .
MODIFY ITAB INDEX SY -TABIX .
ENDIF .
ENDLOOP .
ENDIF .
ENDIF .
ENDLOOP .
LOOP AT ITAB .
DATA : SUMQTY LIKE MCHB -CLABS .
SUMQTY = 0 .
DATA : MESS ( 20 ) TYPE C .
SELECT SINGLE SUM ( CLABS ) INTO SUMQTY FROM MCHB WHERE WERKS = ITAB -WERKS AND MATNR = ITAB -MATNR GROUP BY WERKS MATNR .
" IF sumqty = 0.
" CONCATENATE '物料' itab-matnr '没有库存' INTO mess.
" MESSAGE:mess TYPE 'I'.
" ELSE.
IF SUMQTY > 0 .
SELECT MATNR WERKS LGORT CHARG CLABS INTO CORRESPONDING FIELDS OF TABLE IT_BATCH FROM MCHB WHERE
MATNR = ITAB -IDNRK AND WERKS = ITAB -WERKS AND CLABS > 0 .
SORT IT_BATCH BY WERKS MATNR CHARG ASCENDING .
DATA : SYSL LIKE AFKO -GAMNG , FPSL LIKE AFKO -GAMNG , YFPSL LIKE AFKO -GAMNG .
SYSL = 0 . "剩余数量
FPSL = 0 . "分配数量
YFPSL = 0 . "已分配数量
LOOP AT IT_BATCH .
IF YFPSL = 0 AND ITAB -MNGKO <= IT_BATCH -CLABS . "该条记录第一次分配批次库存,第一个批次库存满足要求
FPSL = ITAB -MENGE .
YFPSL = YFPSL + FPSL .
IT_OUT -WERKS = ITAB -WERKS .
IT_OUT -AUFNR = ITAB -AUFNR .
IT_OUT -MATNR = ITAB -MATNR .
IT_OUT -LGORT = ITAB -LGORT .
IT_OUT -MAKTX = ITAB -MAKTX .
IT_OUT -IDNRK = ITAB -IDNRK .
IT_OUT -MNGKO = ITAB -MNGKO .
IT_OUT -MMEIN = ITAB -MMEIN .
IT_OUT -CHARG = IT_BATCH -CHARG .
IT_OUT -MENGE = FPSL .
IT_OUT -UMLGO = IT_BATCH -LGORT .
APPEND IT_OUT .
EXIT .
ELSEIF YFPSL = 0 AND ITAB -MNGKO >= IT_BATCH -CLABS . "该条记录第一次分配库存,并且第一个批次库存不够需求量
FPSL = IT_BATCH -CLABS .
YFPSL = YFPSL + FPSL .
IT_OUT -WERKS = ITAB -WERKS .
IT_OUT -AUFNR = ITAB -AUFNR .
IT_OUT -MATNR = ITAB -MATNR .
IT_OUT -LGORT = ITAB -LGORT .
IT_OUT -MAKTX = ITAB -MAKTX .
IT_OUT -IDNRK = ITAB -IDNRK .
IT_OUT -MNGKO = ITAB -MNGKO .
IT_OUT -MMEIN = ITAB -MMEIN .
IT_OUT -CHARG = IT_BATCH -CHARG .
IT_OUT -MENGE = FPSL .
IT_OUT -UMLGO = IT_BATCH -LGORT .
APPEND IT_OUT .
SYSL = ITAB -MNGKO - YFPSL .
ELSEIF YFPSL <> 0 AND SYSL <= IT_BATCH -CLABS . "该条记录已经分配批次库存了,在这次批次库存分配中批次库存满足剩余需要的数量
FPSL = SYSL .
YFPSL = YFPSL + SYSL .
IT_OUT -WERKS = ITAB -WERKS .
IT_OUT -AUFNR = ITAB -AUFNR .
IT_OUT -MATNR = ITAB -MATNR .
IT_OUT -LGORT = ITAB -LGORT .
IT_OUT -MAKTX = ITAB -MAKTX .
IT_OUT -IDNRK = ITAB -IDNRK .
IT_OUT -MNGKO = ITAB -MNGKO .
IT_OUT -MMEIN = ITAB -MMEIN .
IT_OUT -CHARG = IT_BATCH -CHARG .
IT_OUT -MENGE = FPSL .
IT_OUT -UMLGO = IT_BATCH -LGORT .
APPEND IT_OUT .
EXIT .
ELSE . "该条记录已经分配库存了,在这次分配中批次库存不满足需要的剩余数量,需要再次分配
FPSL = IT_BATCH -CLABS .
YFPSL = YFPSL + FPSL .
IT_OUT -WERKS = ITAB -WERKS .
IT_OUT -AUFNR = ITAB -AUFNR .
IT_OUT -MATNR = ITAB -MATNR .
IT_OUT -LGORT = ITAB -LGORT .
IT_OUT -MAKTX = ITAB -MAKTX .
IT_OUT -IDNRK = ITAB -IDNRK .
IT_OUT -MNGKO = ITAB -MNGKO .
IT_OUT -MMEIN = ITAB -MMEIN .
IT_OUT -CHARG = IT_BATCH -CHARG .
IT_OUT -MENGE = FPSL .
IT_OUT -UMLGO = IT_BATCH -LGORT .
APPEND IT_OUT .
SYSL = ITAB -MNGKO - YFPSL .
ENDIF .
ENDLOOP .
ENDIF .
ENDLOOP .
ENDFORM . "getdata
*&---------------------------------------------------------------------*
*& Form displaydata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM DISPLAYDATA .
PERFORM ADD_FIELD USING 'WERKS' ' 工厂' 'C111' 'X' .
PERFORM ADD_FIELD USING 'MATNR' ' 成品物料号' 'C111' 'X' .
PERFORM ADD_FIELD USING 'MAKTX' ' 物料描述' 'C111' 'X' .
PERFORM ADD_FIELD USING 'AUFNR' ' 生产订单号' 'C111' 'X' .
PERFORM ADD_FIELD USING 'LGORT' ' 仓库' 'C111' 'X' .
PERFORM ADD_FIELD USING 'IDNRK' ' 物料组件' 'C111' 'X' .
PERFORM ADD_FIELD USING 'MMEIN' ' 单位' 'C111' 'X' .
PERFORM ADD_FIELD USING 'MNGKO' ' 组件需求数' 'C111' 'X' .
PERFORM ADD_FIELD USING 'CHARG' ' 批次号' 'C111' 'X' .
PERFORM ADD_FIELD USING 'MENGE' ' 分配批次数' 'C111' 'X' .
PERFORM ADD_FIELD USING 'UMLGO' ' 仓位' 'C111' 'X' .
ENDFORM . "displaydata
*&---------------------------------------------------------------------*
*& Form add_field
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->I_FIELDNAME text
* -->I_TEXT text
* -->I_NO text
* -->I_ZERO text
*----------------------------------------------------------------------*
FORM ADD_FIELD USING I_FIELDNAME TYPE SLIS_FIELDNAME I_TEXT TYPE STRING I_NO TYPE C I_ZERO TYPE C .
CLEAR WA_ALV_FIELD .
WA_ALV_FIELD -FIELDNAME = I_FIELDNAME .
WA_ALV_FIELD -TABNAME = 'IT_OUT' .
WA_ALV_FIELD -DDICTXT = 'L' .
"wa_alv_field-no_zero = i_zero.
WA_ALV_FIELD -SELTEXT_L = I_TEXT .
APPEND WA_ALV_FIELD TO WA_ALV_FIELDCAT .
ENDFORM . "add_field
*&---------------------------------------------------------------------*
*& Form user_command
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->R_UCOMM text
* -->RS_SELFIELD text
*----------------------------------------------------------------------*
FORM USER_COMMAND USING R_UCOMM LIKE SY -UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD .
CASE R_UCOMM .
WHEN '&IC1' . " SAP STANDARD CODE FOR DOUBLE-CLICKING
IF RS_SELFIELD -SEL_TAB_FIELD = 'IT_OUT-MATNR' .
SET PARAMETER ID 'MAT' FIELD RS_SELFIELD - VALUE .
CALL TRANSACTION 'CS03' AND SKIP FIRST SCREEN .
ENDIF .
IF RS_SELFIELD -SEL_TAB_FIELD = 'IT_OUT-IDNRK' .
SET PARAMETER ID 'MAT' FIELD RS_SELFIELD - VALUE .
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN .
ENDIF .
ENDCASE .
ENDFORM . "user_command
*&---------------------------------------------------------------------*
*& Form layout_init
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->RS_LAYOUT text
*----------------------------------------------------------------------*
FORM LAYOUT_INIT CHANGING RS_LAYOUT TYPE SLIS_LAYOUT_ALV . "自动调整列宽
RS_LAYOUT -COLWIDTH_OPTIMIZE = 'X' .
"rs_layout-box_fieldname = 'SEL'.
"rs_layout-zebra = 'X'.
"rs_layout-detail_popup = 'X'.
ENDFORM . "layout_init
*& Report ZMMR003
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZMMR003 .
TYPE-POOLS :SLIS .
TABLES :MAST , MARA , STKO , MAKT , AFKO , AFPO , AUFK .
DATA :STB LIKE STPOX OCCURS 0 WITH HEADER LINE .
DATA : BEGIN OF MATCAT OCCURS 0 .
INCLUDE STRUCTURE CSCMAT .
DATA : END OF MATCAT .
DATA : BEGIN OF MATS .
INCLUDE STRUCTURE CSCMAT .
DATA : END OF MATS .
DATA : BEGIN OF SELPOOL .
INCLUDE STRUCTURE CSTMAT .
DATA : END OF SELPOOL .
DATA : DSTST_FLG LIKE CSDATA -XFELD .
DATA : LAYOUT TYPE SLIS_LAYOUT_ALV ,
GS_LAYOUT TYPE SLIS_LAYOUT_ALV ,
G_REPID LIKE SY -REPID .
DATA : WA_ALV_FIELD TYPE SLIS_FIELDCAT_ALV , "列描述内表,列清单
WA_ALV_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV , "定义内表
G_USER_COMMAND TYPE SLIS_FORMNAME VALUE 'USER_COMMAND' .
DATA : BEGIN OF WA_DATA ,
WERKS LIKE AUFK -WERKS ,
AUFNR LIKE AFKO -AUFNR ,
OBJNR LIKE AUFK -OBJNR ,
PLNBEZ LIKE AFKO -PLNBEZ ,
GAMNG LIKE AFKO -GAMNG ,
END OF WA_DATA .
DATA : IT_DATA LIKE WA_DATA OCCURS 0 WITH HEADER LINE .
DATA : ITAB TYPE TABLE OF ZMMSF003 WITH HEADER LINE .
DATA : IT_OUT TYPE TABLE OF ZMMSF003 WITH HEADER LINE .
DATA :IT_OBJNR TYPE TABLE OF JEST WITH HEADER LINE .
DATA : BEGIN OF WA_BATCH ,
WERKS TYPE MCHB -WERKS ,
MATNR TYPE MCHB -MATNR ,
LGORT TYPE MCHB -LGORT ,
CHARG TYPE MCHB -CHARG ,
CLABS TYPE MCHB -CLABS ,
END OF WA_BATCH .
DATA : IT_BATCH LIKE TABLE OF WA_BATCH WITH HEADER LINE .
SELECTION-SCREEN BEGIN OF BLOCK BLOCK1 WITH FRAME TITLE TEXT - 001 .
SELECT-OPTIONS : S_WERKS FOR AUFK -WERKS ,
S_AUFNR FOR AFKO -AUFNR ,
S_MATNR FOR AFKO -PLNBEZ .
"PARAMETERS: S_AUART LIKE AUFK-AUART.
SELECTION-SCREEN END OF BLOCK BLOCK1 .
INITIALIZATION .
G_REPID = SY -REPID .
START-OF-SELECTION .
PERFORM GETDATA .
PERFORM DISPLAYDATA .
PERFORM LAYOUT_INIT CHANGING GS_LAYOUT .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' "调用ALV 显示表单数据
EXPORTING
I_CALLBACK_PROGRAM = SY -REPID
"i_callback_top_of_page = 'TOP_OF_PAGE'
IT_FIELDCAT = WA_ALV_FIELDCAT
IS_LAYOUT = GS_LAYOUT
I_CALLBACK_USER_COMMAND = G_USER_COMMAND
TABLES
T_OUTTAB = IT_OUT
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2 .
IF SY -SUBRC <> 0 .
MESSAGE ID SY -MSGID TYPE SY -MSGTY NUMBER SY -MSGNO
WITH SY -MSGV1 SY -MSGV2 SY -MSGV3 SY -MSGV4 .
ENDIF .
*&---------------------------------------------------------------------*
*& Form getdata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM GETDATA .
SELECT
AUFK ~WERKS
AUFK ~AUFNR
AUFK ~OBJNR
AFKO ~PLNBEZ
AFKO ~GAMNG
INTO CORRESPONDING FIELDS OF TABLE IT_DATA
FROM AUFK inner JOIN AFKO ON AUFK ~AUFNR = AFKO ~AUFNR WHERE AUFK ~WERKS IN S_WERKS AND AFKO ~AUFNR IN S_AUFNR AND AFKO ~PLNBEZ IN S_MATNR AND AUFK ~AUART = 'PP01' .
SORT IT_DATA BY AUFNR PLNBEZ .
DELETE IT_DATA WHERE PLNBEZ IS INITIAL .
LOOP AT IT_DATA INTO WA_DATA .
SELECT * INTO CORRESPONDING FIELDS OF TABLE IT_OBJNR FROM JEST WHERE OBJNR = WA_DATA -OBJNR AND STAT = 'I0002' AND INACT = '' .
IF IT_OBJNR[] IS NOT INITIAL . "工单已下达
SELECT SINGLE LGORT INTO ITAB -LGORT FROM AFPO WHERE AUFNR = WA_DATA -AUFNR .
SELECT SINGLE MAKTX INTO ITAB -MAKTX FROM MAKT WHERE MATNR = WA_DATA -PLNBEZ .
CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
CAPID = 'PP01' "BOM 应用程序
DATUV = SY -DATUM "有效起始日
" emeng = p_emeng " 基本数量 Required quantity STKO-BMENG
MTNRV = WA_DATA -PLNBEZ "成品号或半成品号
STLAN = '1' "BOM 用途,1 代表生产
STLAL = '' "可选BOM
MKTLS = 'X'
MEHRS = 'X' "是否多层展开,'X' 代表多层
RNDKZ = '1' "Round off: ' '=always, '1'=never, '2'=only levels > 1 是否取整
WERKS = WA_DATA -WERKS "工厂
IMPORTING
TOPMAT = SELPOOL "开始BOM 展开的物料显示
DSTST = DSTST_FLG "BOM 帮助字段
TABLES
STB = STB
MATCAT = MATCAT "下面含有组件的物料存放在该内表对应 STB-TTIDX 在类别表内的索引﹐标志直属哪个物料下的 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
OTHERS = 8 .
DELETE STB WHERE MTART <> 'ROH' .
SORT STB BY IDNRK .
DATA : S_IDNRK LIKE STPOX -IDNRK .
S_IDNRK = '' .
IF STB[] IS NOT INITIAL .
LOOP AT STB .
DATA : S_MMEIN ( 2 ) TYPE C .
IF S_IDNRK <> STB -IDNRK .
ITAB -WERKS = STB -WERKS .
ITAB -IDNRK = STB -IDNRK . "组件
ITAB -MNGKO = STB -MNGKO * WA_DATA -GAMNG . "用量
IF STB -MMEIN = 'ST' . "ST单位变为PC
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
EXPORTING
INPUT = STB -MMEIN
IMPORTING
OUTPUT = S_MMEIN
EXCEPTIONS
UNIT_NOT_FOUND = 1
OTHERS = 2 .
ITAB -MMEIN = S_MMEIN .
ELSE .
ITAB -MMEIN = STB -MMEIN . "基本计量单位
ENDIF .
ITAB -MATNR = WA_DATA -PLNBEZ .
ITAB -AUFNR = WA_DATA -AUFNR .
APPEND ITAB .
S_IDNRK = STB -IDNRK .
ELSE .
ITAB -MNGKO = ITAB -MNGKO + STB -MNGKO * WA_DATA -GAMNG .
SY -TABIX = SY -TABIX - 1 .
MODIFY ITAB INDEX SY -TABIX .
ENDIF .
ENDLOOP .
ENDIF .
ENDIF .
ENDLOOP .
LOOP AT ITAB .
DATA : SUMQTY LIKE MCHB -CLABS .
SUMQTY = 0 .
DATA : MESS ( 20 ) TYPE C .
SELECT SINGLE SUM ( CLABS ) INTO SUMQTY FROM MCHB WHERE WERKS = ITAB -WERKS AND MATNR = ITAB -MATNR GROUP BY WERKS MATNR .
" IF sumqty = 0.
" CONCATENATE '物料' itab-matnr '没有库存' INTO mess.
" MESSAGE:mess TYPE 'I'.
" ELSE.
IF SUMQTY > 0 .
SELECT MATNR WERKS LGORT CHARG CLABS INTO CORRESPONDING FIELDS OF TABLE IT_BATCH FROM MCHB WHERE
MATNR = ITAB -IDNRK AND WERKS = ITAB -WERKS AND CLABS > 0 .
SORT IT_BATCH BY WERKS MATNR CHARG ASCENDING .
DATA : SYSL LIKE AFKO -GAMNG , FPSL LIKE AFKO -GAMNG , YFPSL LIKE AFKO -GAMNG .
SYSL = 0 . "剩余数量
FPSL = 0 . "分配数量
YFPSL = 0 . "已分配数量
LOOP AT IT_BATCH .
IF YFPSL = 0 AND ITAB -MNGKO <= IT_BATCH -CLABS . "该条记录第一次分配批次库存,第一个批次库存满足要求
FPSL = ITAB -MENGE .
YFPSL = YFPSL + FPSL .
IT_OUT -WERKS = ITAB -WERKS .
IT_OUT -AUFNR = ITAB -AUFNR .
IT_OUT -MATNR = ITAB -MATNR .
IT_OUT -LGORT = ITAB -LGORT .
IT_OUT -MAKTX = ITAB -MAKTX .
IT_OUT -IDNRK = ITAB -IDNRK .
IT_OUT -MNGKO = ITAB -MNGKO .
IT_OUT -MMEIN = ITAB -MMEIN .
IT_OUT -CHARG = IT_BATCH -CHARG .
IT_OUT -MENGE = FPSL .
IT_OUT -UMLGO = IT_BATCH -LGORT .
APPEND IT_OUT .
EXIT .
ELSEIF YFPSL = 0 AND ITAB -MNGKO >= IT_BATCH -CLABS . "该条记录第一次分配库存,并且第一个批次库存不够需求量
FPSL = IT_BATCH -CLABS .
YFPSL = YFPSL + FPSL .
IT_OUT -WERKS = ITAB -WERKS .
IT_OUT -AUFNR = ITAB -AUFNR .
IT_OUT -MATNR = ITAB -MATNR .
IT_OUT -LGORT = ITAB -LGORT .
IT_OUT -MAKTX = ITAB -MAKTX .
IT_OUT -IDNRK = ITAB -IDNRK .
IT_OUT -MNGKO = ITAB -MNGKO .
IT_OUT -MMEIN = ITAB -MMEIN .
IT_OUT -CHARG = IT_BATCH -CHARG .
IT_OUT -MENGE = FPSL .
IT_OUT -UMLGO = IT_BATCH -LGORT .
APPEND IT_OUT .
SYSL = ITAB -MNGKO - YFPSL .
ELSEIF YFPSL <> 0 AND SYSL <= IT_BATCH -CLABS . "该条记录已经分配批次库存了,在这次批次库存分配中批次库存满足剩余需要的数量
FPSL = SYSL .
YFPSL = YFPSL + SYSL .
IT_OUT -WERKS = ITAB -WERKS .
IT_OUT -AUFNR = ITAB -AUFNR .
IT_OUT -MATNR = ITAB -MATNR .
IT_OUT -LGORT = ITAB -LGORT .
IT_OUT -MAKTX = ITAB -MAKTX .
IT_OUT -IDNRK = ITAB -IDNRK .
IT_OUT -MNGKO = ITAB -MNGKO .
IT_OUT -MMEIN = ITAB -MMEIN .
IT_OUT -CHARG = IT_BATCH -CHARG .
IT_OUT -MENGE = FPSL .
IT_OUT -UMLGO = IT_BATCH -LGORT .
APPEND IT_OUT .
EXIT .
ELSE . "该条记录已经分配库存了,在这次分配中批次库存不满足需要的剩余数量,需要再次分配
FPSL = IT_BATCH -CLABS .
YFPSL = YFPSL + FPSL .
IT_OUT -WERKS = ITAB -WERKS .
IT_OUT -AUFNR = ITAB -AUFNR .
IT_OUT -MATNR = ITAB -MATNR .
IT_OUT -LGORT = ITAB -LGORT .
IT_OUT -MAKTX = ITAB -MAKTX .
IT_OUT -IDNRK = ITAB -IDNRK .
IT_OUT -MNGKO = ITAB -MNGKO .
IT_OUT -MMEIN = ITAB -MMEIN .
IT_OUT -CHARG = IT_BATCH -CHARG .
IT_OUT -MENGE = FPSL .
IT_OUT -UMLGO = IT_BATCH -LGORT .
APPEND IT_OUT .
SYSL = ITAB -MNGKO - YFPSL .
ENDIF .
ENDLOOP .
ENDIF .
ENDLOOP .
ENDFORM . "getdata
*&---------------------------------------------------------------------*
*& Form displaydata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM DISPLAYDATA .
PERFORM ADD_FIELD USING 'WERKS' ' 工厂' 'C111' 'X' .
PERFORM ADD_FIELD USING 'MATNR' ' 成品物料号' 'C111' 'X' .
PERFORM ADD_FIELD USING 'MAKTX' ' 物料描述' 'C111' 'X' .
PERFORM ADD_FIELD USING 'AUFNR' ' 生产订单号' 'C111' 'X' .
PERFORM ADD_FIELD USING 'LGORT' ' 仓库' 'C111' 'X' .
PERFORM ADD_FIELD USING 'IDNRK' ' 物料组件' 'C111' 'X' .
PERFORM ADD_FIELD USING 'MMEIN' ' 单位' 'C111' 'X' .
PERFORM ADD_FIELD USING 'MNGKO' ' 组件需求数' 'C111' 'X' .
PERFORM ADD_FIELD USING 'CHARG' ' 批次号' 'C111' 'X' .
PERFORM ADD_FIELD USING 'MENGE' ' 分配批次数' 'C111' 'X' .
PERFORM ADD_FIELD USING 'UMLGO' ' 仓位' 'C111' 'X' .
ENDFORM . "displaydata
*&---------------------------------------------------------------------*
*& Form add_field
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->I_FIELDNAME text
* -->I_TEXT text
* -->I_NO text
* -->I_ZERO text
*----------------------------------------------------------------------*
FORM ADD_FIELD USING I_FIELDNAME TYPE SLIS_FIELDNAME I_TEXT TYPE STRING I_NO TYPE C I_ZERO TYPE C .
CLEAR WA_ALV_FIELD .
WA_ALV_FIELD -FIELDNAME = I_FIELDNAME .
WA_ALV_FIELD -TABNAME = 'IT_OUT' .
WA_ALV_FIELD -DDICTXT = 'L' .
"wa_alv_field-no_zero = i_zero.
WA_ALV_FIELD -SELTEXT_L = I_TEXT .
APPEND WA_ALV_FIELD TO WA_ALV_FIELDCAT .
ENDFORM . "add_field
*&---------------------------------------------------------------------*
*& Form user_command
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->R_UCOMM text
* -->RS_SELFIELD text
*----------------------------------------------------------------------*
FORM USER_COMMAND USING R_UCOMM LIKE SY -UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD .
CASE R_UCOMM .
WHEN '&IC1' . " SAP STANDARD CODE FOR DOUBLE-CLICKING
IF RS_SELFIELD -SEL_TAB_FIELD = 'IT_OUT-MATNR' .
SET PARAMETER ID 'MAT' FIELD RS_SELFIELD - VALUE .
CALL TRANSACTION 'CS03' AND SKIP FIRST SCREEN .
ENDIF .
IF RS_SELFIELD -SEL_TAB_FIELD = 'IT_OUT-IDNRK' .
SET PARAMETER ID 'MAT' FIELD RS_SELFIELD - VALUE .
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN .
ENDIF .
ENDCASE .
ENDFORM . "user_command
*&---------------------------------------------------------------------*
*& Form layout_init
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->RS_LAYOUT text
*----------------------------------------------------------------------*
FORM LAYOUT_INIT CHANGING RS_LAYOUT TYPE SLIS_LAYOUT_ALV . "自动调整列宽
RS_LAYOUT -COLWIDTH_OPTIMIZE = 'X' .
"rs_layout-box_fieldname = 'SEL'.
"rs_layout-zebra = 'X'.
"rs_layout-detail_popup = 'X'.
ENDFORM . "layout_init