*&---------------------------------------------------------------------*
*& Report ZMMR102
*&---------------------------------------------------------------------*
*& Author : NathanSun
*& Create Date : 2020-01-03
*& Program Type : Report
*& Description : 零件预测需求报表
*&---------------------------------------------------------------------*
REPORT ZPPR010C.
*&---------------------------------------------------------------------*
*& 包含 YN_TEST02_TOP
*&---------------------------------------------------------------------*
TABLES:MARA,STKO,MARC.
TYPE-POOLS:SLIS,T001W.
DATA: NUM TYPE I .
"定义ALV输出所需变量
DATA: S_LAYOUT TYPE LVC_S_LAYO,
GT_FIELDCAT TYPE LVC_T_FCAT,
IS_VARIANT TYPE DISVARIANT.
DATA: GV_FIELDNAME TYPE C LENGTH 20 .
DATA: GV_DESCRIPTION TYPE C LENGTH 20 .
DATA: GV_ZQUAN TYPE ZQUAN .
DATA: MRP_ITEMS LIKE BAPI_MRP_ITEMS OCCURS 0 WITH HEADER LINE .
DATA: MRP_ITEMS_C LIKE BAPI_MRP_ITEMS OCCURS 0 WITH HEADER LINE .
DATA: MRP_IND_LINES LIKE BAPI_MRP_IND_LINES OCCURS 0 WITH HEADER LINE .
DATA: MRP_IND_LINES_C LIKE BAPI_MRP_IND_LINES OCCURS 0 WITH HEADER LINE .
DATA: GT_MARC TYPE TABLE OF MARC WITH HEADER LINE.
DATA: GT_MARC_A TYPE TABLE OF MARC WITH HEADER LINE.
DATA: GT_MARA TYPE TABLE OF MARA WITH HEADER LINE.
DATA: GT_MAKT TYPE TABLE OF MAKT WITH HEADER LINE.
DATA: LV_YEAR TYPE NUMC4.
DATA: LV_MONTH1 TYPE NUMC2.
DATA: LV_DATS TYPE DATS.
DATA: LV_DATSA TYPE DATS.
"定义指针
FIELD-SYMBOLS :<FT_VB> TYPE STANDARD TABLE, "内表
<FS_VB> TYPE ANY, "结构
<DYN_FIELD> TYPE ANY, "字段
<DYN_FIELDA> TYPE ANY, "字段
<DYN_FIELDB> TYPE ANY, "字段
<DYN_FIELDC> TYPE ANY, "字段
<DYN_FIELDD> TYPE ANY. "字段
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
SELECT-OPTIONS: S_WERKS FOR MARC-WERKS MODIF ID C1 OBLIGATORY. "工厂
SELECT-OPTIONS: S_MATNR FOR MARC-MATNR MODIF ID C1 . "物料
SELECT-OPTIONS: S_DISPO FOR MARC-DISPO MODIF ID C1 . "MRP控制员
SELECT-OPTIONS: S_ERSDA FOR MARA-ERSDA MODIF ID C1 OBLIGATORY. "日期(选择日期的当月)
*PARAMETERS: P_ERSDA LIKE MARA-ERSDA MODIF ID C1 OBLIGATORY. "起始日期(选择日期的当月)
*PARAMETERS: P_NUM TYPE CHAR2 MODIF ID C1 OBLIGATORY. "查询月数
PARAMETERS: CH_01 AS CHECKBOX DEFAULT ''. "工厂合并查询
SELECTION-SCREEN END OF BLOCK B1.
AT SELECTION-SCREEN.
LOOP AT S_ERSDA.
IF S_ERSDA-HIGH IS INITIAL .
S_ERSDA-HIGH = S_ERSDA-LOW .
ENDIF.
S_ERSDA-LOW+6(2) = '01' .
S_ERSDA-HIGH+6(2) = '27'.
S_ERSDA-HIGH = S_ERSDA-HIGH + 6.
S_ERSDA-HIGH+6(2) = '01'.
S_ERSDA-HIGH = S_ERSDA-HIGH - 1.
MODIFY S_ERSDA .
ENDLOOP.
LV_YEAR = S_ERSDA-HIGH+0(4) - S_ERSDA-LOW+0(4) .
LV_MONTH1 = S_ERSDA-HIGH+4(2) - S_ERSDA-LOW+4(2) + LV_YEAR * 12 .
NUM = LV_MONTH1 + 1.
IF NUM > 12.
MESSAGE '日期范围不可超过12个月!' TYPE 'E'.
ENDIF.
FORM FOM_GETDATA .
DATA: GV_FIELDNAME TYPE C LENGTH 20 .
CLEAR GT_MARC[].
SELECT WERKS MATNR DISPO INTO CORRESPONDING FIELDS OF TABLE GT_MARC[] FROM MARC
WHERE WERKS IN S_WERKS
AND MATNR IN S_MATNR
AND DISPO IN S_DISPO
.
IF CH_01 IS INITIAL.
SORT GT_MARC[] BY WERKS MATNR DISPO .
DELETE ADJACENT DUPLICATES FROM GT_MARC[] COMPARING WERKS MATNR .
LOOP AT GT_MARC.
CLEAR GT_MAKT.
SELECT SINGLE MAKTX INTO GT_MAKT-MAKTX FROM MAKT
WHERE MATNR = GT_MARC-MATNR
.
CLEAR GT_MARA.
SELECT SINGLE MEINS INTO GT_MARA-MEINS FROM MARA
WHERE MATNR = GT_MARC-MATNR
.
ASSIGN COMPONENT 'MATNR' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
<DYN_FIELD> = GT_MARC-MATNR .
ENDIF .
ASSIGN COMPONENT 'MAKTX' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
<DYN_FIELD> = GT_MAKT-MAKTX .
ENDIF .
ASSIGN COMPONENT 'WERKS' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
<DYN_FIELD> = GT_MARC-WERKS .
ENDIF .
ASSIGN COMPONENT 'DISPO' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
<DYN_FIELD> = GT_MARC-DISPO .
ENDIF .
ASSIGN COMPONENT 'MEINS' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
<DYN_FIELD> = GT_MARA-MEINS .
ENDIF .
ASSIGN COMPONENT 'ERSDA' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
<DYN_FIELD> = SY-DATUM .
ENDIF .
CLEAR MRP_ITEMS[].
CLEAR MRP_IND_LINES[].
CALL FUNCTION 'BAPI_MATERIAL_STOCK_REQ_LIST'
EXPORTING
MATERIAL_LONG = GT_MARC-MATNR
PLANT = GT_MARC-WERKS
GET_ITEM_DETAILS = 'X'
TABLES
MRP_ITEMS = MRP_ITEMS[]
MRP_IND_LINES = MRP_IND_LINES[].
LOOP AT MRP_IND_LINES WHERE AVAIL_DATE IN S_ERSDA.
*.按物料+工厂+月份 汇总物料数量为负的需求数
IF MRP_IND_LINES-MRP_ELEMNT = 'Stock' OR MRP_IND_LINES-MRP_ELEMNT = 'CustSt'.
ASSIGN COMPONENT 'ZKYKC' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
<DYN_FIELD> = <DYN_FIELD> + MRP_IND_LINES-AVAIL_QTY1 .
ENDIF .
ELSE.
*按物料+工厂+月份 汇总物料数量>0的供给数 计算为具体月份的:XX月MRP供给
IF MRP_IND_LINES-REC_REQD_QTY > 0.
CONCATENATE MRP_IND_LINES-SORT_DATE+(6) '_MONTM' INTO GV_FIELDNAME .
ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
<DYN_FIELD> = <DYN_FIELD> + MRP_IND_LINES-REC_REQD_QTY .
ENDIF .
ELSE.
*XX月份预测 计算逻辑A: 已取得当月需求数(正数)
MRP_IND_LINES-REC_REQD_QTY = MRP_IND_LINES-REC_REQD_QTY * -1.
CONCATENATE MRP_IND_LINES-SORT_DATE+(6) '_MONTX' INTO GV_FIELDNAME .
ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
<DYN_FIELD> = <DYN_FIELD> + MRP_IND_LINES-REC_REQD_QTY .
ENDIF .
ENDIF.
ENDIF.
CLEAR MRP_IND_LINES .
ENDLOOP.
" 月份
LV_DATS = S_ERSDA-LOW.
CLEAR GV_ZQUAN.
*库存结存数 初始值
ASSIGN COMPONENT 'ZKYKC' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
GV_ZQUAN = <DYN_FIELD> .
ENDIF .
DO 12 TIMES .
IF LV_DATS <= S_ERSDA-HIGH.
IF LV_DATS(6) = S_ERSDA-LOW(6) .
*首月:当月需求数(正数)-可用库存数
*当月需求数(正数)
CONCATENATE LV_DATS(6) '_MONTX' INTO GV_FIELDNAME .
ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELDA> .
IF SY-SUBRC = 0 .
*可用库存数
ASSIGN COMPONENT 'ZKYKC' OF STRUCTURE <FS_VB> TO <DYN_FIELDB> .
IF SY-SUBRC = 0 .
*XX月份预测
CONCATENATE LV_DATS(6) '_MONTH' INTO GV_FIELDNAME .
ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0.
<DYN_FIELD> = <DYN_FIELDA> - <DYN_FIELDB> .
ENDIF.
ENDIF.
*库存结存数 = 库存结存数-(本月需求数*-1)
GV_ZQUAN = GV_ZQUAN - <DYN_FIELDA> .
ENDIF .
ELSE .
LV_DATSA = LV_DATS.
LV_DATSA+6(2) = '01'.
LV_DATSA = LV_DATSA - 1.
*XX月份预测 计算逻辑: 当月需求数(正数)+查询月份范围内的前月份需求数汇总数-可用库存数-查询月份范围内的前月份XX月份预测数汇总数
*当月需求数(正数)
CONCATENATE LV_DATS(6) '_MONTX' INTO GV_FIELDNAME .
ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELDA> .
IF SY-SUBRC = 0 .
*可用库存数
* ASSIGN COMPONENT 'ZKYKC' OF STRUCTURE <FS_VB> TO <DYN_FIELDB> .
* IF SY-SUBRC = 0 .
**查询月份范围内的前月份需求数汇总数
* CONCATENATE LV_DATSA(6) '_MONTX' INTO GV_FIELDNAME .
* ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELDC> .
* IF SY-SUBRC = 0.
*
**查询月份范围内的前月份XX月份预测数汇总数
* CONCATENATE LV_DATSA(6) '_MONTH' INTO GV_FIELDNAME .
* ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELDD> .
* IF SY-SUBRC = 0.
*XX月份预测
CONCATENATE LV_DATS(6) '_MONTH' INTO GV_FIELDNAME .
ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0.
*if 库存结存数 -(本月需求数*-1)>0
IF GV_ZQUAN - <DYN_FIELDA> > 0.
*本月预测数=(本月需求数*-1 )- 库存结存数变量
<DYN_FIELD> = <DYN_FIELDA> - GV_ZQUAN.
ELSE.
*第二个月预测数 = 第二个月需求数*-1
<DYN_FIELD> = <DYN_FIELDA> .
ENDIF.
ENDIF.
* ENDIF.
* ENDIF.
* ENDIF.
*库存结存数 = 库存结存数-(本月需求数*-1)
GV_ZQUAN = GV_ZQUAN - <DYN_FIELDA> .
ENDIF .
ENDIF.
ENDIF.
LV_DATS+6(2) = '27'.
LV_DATS = LV_DATS + 6.
LV_DATS+6(2) = '01'.
ENDDO.
APPEND <FS_VB> TO <FT_VB> .
CLEAR <FS_VB> .
CLEAR GT_MARC .
ENDLOOP.
ELSE .
GT_MARC_A[] = GT_MARC[].
SORT GT_MARC[] BY MATNR .
DELETE ADJACENT DUPLICATES FROM GT_MARC[] COMPARING MATNR .
LOOP AT GT_MARC.
CLEAR GT_MAKT.
SELECT SINGLE MAKTX INTO GT_MAKT-MAKTX FROM MAKT
WHERE MATNR = GT_MARC-MATNR
.
CLEAR GT_MARA.
SELECT SINGLE MEINS INTO GT_MARA-MEINS FROM MARA
WHERE MATNR = GT_MARC-MATNR
.
ASSIGN COMPONENT 'MATNR' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
<DYN_FIELD> = GT_MARC-MATNR .
ENDIF .
ASSIGN COMPONENT 'MAKTX' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
<DYN_FIELD> = GT_MAKT-MAKTX .
ENDIF .
ASSIGN COMPONENT 'DISPO' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
<DYN_FIELD> = GT_MARC-DISPO .
ENDIF .
ASSIGN COMPONENT 'MEINS' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
<DYN_FIELD> = GT_MARA-MEINS .
ENDIF .
ASSIGN COMPONENT 'ERSDA' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
<DYN_FIELD> = SY-DATUM .
ENDIF .
CLEAR MRP_ITEMS[].
CLEAR MRP_IND_LINES[].
LOOP AT GT_MARC_A WHERE MATNR = GT_MARC-MATNR .
CLEAR MRP_ITEMS_C[].
CLEAR MRP_IND_LINES_C[].
CALL FUNCTION 'BAPI_MATERIAL_STOCK_REQ_LIST'
EXPORTING
MATERIAL_LONG = GT_MARC-MATNR
PLANT = GT_MARC_A-WERKS
GET_ITEM_DETAILS = 'X'
TABLES
MRP_ITEMS = MRP_ITEMS_C[]
MRP_IND_LINES = MRP_IND_LINES_C[].
APPEND LINES OF MRP_ITEMS_C[] TO MRP_ITEMS[] .
APPEND LINES OF MRP_IND_LINES_C[] TO MRP_IND_LINES[] .
ENDLOOP.
LOOP AT MRP_IND_LINES WHERE AVAIL_DATE IN S_ERSDA.
*.按物料+工厂+月份 汇总物料数量为负的需求数
IF MRP_IND_LINES-MRP_ELEMNT = 'Stock' OR MRP_IND_LINES-MRP_ELEMNT = 'CustSt'.
ASSIGN COMPONENT 'ZKYKC' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
<DYN_FIELD> = <DYN_FIELD> + MRP_IND_LINES-AVAIL_QTY1 .
ENDIF .
ELSE.
*按物料+工厂+月份 汇总物料数量>0的供给数 计算为具体月份的:XX月MRP供给
IF MRP_IND_LINES-REC_REQD_QTY > 0.
CONCATENATE MRP_IND_LINES-SORT_DATE+(6) '_MONTM' INTO GV_FIELDNAME .
ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
<DYN_FIELD> = <DYN_FIELD> + MRP_IND_LINES-REC_REQD_QTY .
ENDIF .
ELSE.
*当月需求数(正数)
MRP_IND_LINES-REC_REQD_QTY = MRP_IND_LINES-REC_REQD_QTY * -1.
CONCATENATE MRP_IND_LINES-SORT_DATE+(6) '_MONTX' INTO GV_FIELDNAME .
ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
<DYN_FIELD> = <DYN_FIELD> + MRP_IND_LINES-REC_REQD_QTY .
ENDIF .
ENDIF.
ENDIF.
CLEAR MRP_IND_LINES .
ENDLOOP.
" 月份
LV_DATS = S_ERSDA-LOW.
CLEAR GV_ZQUAN.
*库存结存数 初始值
ASSIGN COMPONENT 'ZKYKC' OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0 .
GV_ZQUAN = <DYN_FIELD> .
ENDIF .
DO 12 TIMES .
IF LV_DATS <= S_ERSDA-HIGH.
IF LV_DATS(6) = S_ERSDA-LOW(6) .
*首月:当月需求数(正数)-可用库存数
*当月需求数(正数)
CONCATENATE LV_DATS(6) '_MONTX' INTO GV_FIELDNAME .
ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELDA> .
IF SY-SUBRC = 0 .
*可用库存数
ASSIGN COMPONENT 'ZKYKC' OF STRUCTURE <FS_VB> TO <DYN_FIELDB> .
IF SY-SUBRC = 0 .
*XX月份预测
CONCATENATE LV_DATS(6) '_MONTH' INTO GV_FIELDNAME .
ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0.
<DYN_FIELD> = <DYN_FIELDA> - <DYN_FIELDB> .
ENDIF.
ENDIF.
*库存结存数 = 库存结存数-(本月需求数*-1)
GV_ZQUAN = GV_ZQUAN - <DYN_FIELDA> .
ENDIF .
ELSE .
LV_DATSA = LV_DATS.
LV_DATSA+6(2) = '01'.
LV_DATSA = LV_DATSA - 1.
*XX月份预测 计算逻辑: 当月需求数(正数)+查询月份范围内的前月份需求数汇总数-可用库存数-查询月份范围内的前月份XX月份预测数汇总数
*当月需求数(正数)
CONCATENATE LV_DATS(6) '_MONTX' INTO GV_FIELDNAME .
ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELDA> .
IF SY-SUBRC = 0 .
*可用库存数
* ASSIGN COMPONENT 'ZKYKC' OF STRUCTURE <FS_VB> TO <DYN_FIELDB> .
* IF SY-SUBRC = 0 .
**查询月份范围内的前月份需求数汇总数
* CONCATENATE LV_DATSA(6) '_MONTX' INTO GV_FIELDNAME .
* ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELDC> .
* IF SY-SUBRC = 0.
*
**查询月份范围内的前月份XX月份预测数汇总数
* CONCATENATE LV_DATSA(6) '_MONTH' INTO GV_FIELDNAME .
* ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELDD> .
* IF SY-SUBRC = 0.
*XX月份预测
CONCATENATE LV_DATS(6) '_MONTH' INTO GV_FIELDNAME .
ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE <FS_VB> TO <DYN_FIELD> .
IF SY-SUBRC = 0.
*if 库存结存数 -(本月需求数*-1)>0
IF GV_ZQUAN - <DYN_FIELDA> > 0.
*本月预测数=(本月需求数*-1 )- 库存结存数变量
<DYN_FIELD> = <DYN_FIELDA> - GV_ZQUAN.
ELSE.
*第二个月预测数 = 第二个月需求数*-1
<DYN_FIELD> = <DYN_FIELDA> .
ENDIF.
ENDIF.
* ENDIF.
* ENDIF.
* ENDIF.
*库存结存数 = 库存结存数-(本月需求数*-1)
GV_ZQUAN = GV_ZQUAN - <DYN_FIELDA> .
ENDIF .
ENDIF.
ENDIF.
LV_DATS+6(2) = '27'.
LV_DATS = LV_DATS + 6.
LV_DATS+6(2) = '01'.
ENDDO.
APPEND <FS_VB> TO <FT_VB> .
CLEAR <FS_VB> .
CLEAR GT_MARC .
ENDLOOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FOM_SETFIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FOM_SETFIELDCAT .
DELETE GT_FIELDCAT[] WHERE FIELDNAME+6(6) = '_MONTX'.
IF CH_01 IS NOT INITIAL.
DELETE GT_FIELDCAT[] WHERE FIELDNAME = 'WERKS' OR FIELDNAME = 'DISPO'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY .
CLEAR S_LAYOUT.
S_LAYOUT-ZEBRA = 'X'.
* S_LAYOUT-CWIDTH_OPT = 'X'.
S_LAYOUT-CTAB_FNAME = 'CELLCOLOR'. "单元格颜色内表字段
S_LAYOUT-STYLEFNAME = 'STYLE'. "内部表字段的字段名称
* s_layout-box_fieldname = 'BOX'.
* W_EVENTS-NAME = 'CALLER_EXIT'. "slis_ev_caller_exit_at_start事件
* W_EVENTS-FORM = 'FM_BUTTON'.
* APPEND W_EVENTS TO I_EVENTS .
CLEAR IS_VARIANT .
IS_VARIANT-REPORT = SY-REPID.
IS_VARIANT-HANDLE = '1'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_SAVE = 'A'
IS_VARIANT = IS_VARIANT
IS_LAYOUT_LVC = S_LAYOUT
IT_FIELDCAT_LVC = GT_FIELDCAT
I_CALLBACK_PROGRAM = SY-REPID
* IT_EVENTS = I_EVENTS
I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
* i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
TABLES
T_OUTTAB = <FT_VB>.
ENDFORM.
FORM FRM_FILL_FIELD .
DATA: WA_FIELDCAT TYPE LVC_T_FCAT WITH HEADER LINE.
DEFINE FILL_FIELD.
WA_FIELDCAT-FIELDNAME = &1.
WA_FIELDCAT-SCRTEXT_L = &2.
WA_FIELDCAT-REF_TABLE = &3.
WA_FIELDCAT-REF_FIELD = &4.
WA_FIELDCAT-OUTPUTLEN = &5.
IF WA_FIELDCAT-FIELDNAME = 'ZKYKC'.
WA_FIELDCAT-SCRTEXT_S = WA_FIELDCAT-SCRTEXT_L(2).
WA_FIELDCAT-SCRTEXT_M = WA_FIELDCAT-SCRTEXT_L(6).
ELSE.
WA_FIELDCAT-SCRTEXT_S = WA_FIELDCAT-SCRTEXT_L(4).
WA_FIELDCAT-SCRTEXT_M = WA_FIELDCAT-SCRTEXT_L(7).
ENDIF.
APPEND WA_FIELDCAT TO GT_FIELDCAT.
CLEAR WA_FIELDCAT.
END-OF-DEFINITION.
DATA LV_MONTH TYPE N LENGTH 2 .
FILL_FIELD 'MATNR' '物料' 'MARC' 'MATNR' '20'.
FILL_FIELD 'MAKTX' '物料描述' 'MAKT' 'MAKTX' '20'.
IF CH_01 IS INITIAL.
FILL_FIELD 'WERKS' '工厂' 'MARC' 'WERKS' '10'.
ENDIF.
FILL_FIELD 'DISPO' 'MRP控制员' 'MARC' 'DISPO' '10'.
FILL_FIELD 'ERSDA' '查询日期' 'MARA' 'ERSDA' '10'.
FILL_FIELD 'MEINS' '库存单位' 'MARA' 'MEINS' '10'.
FILL_FIELD 'ZKYKC' '可用库存' 'ZTFIELD' 'ZQUAN' '15'.
" 月份
LV_DATS = S_ERSDA-LOW.
DO 12 TIMES .
IF LV_DATS <= S_ERSDA-HIGH.
CLEAR GV_FIELDNAME .
CLEAR GV_DESCRIPTION .
CONCATENATE LV_DATS+(6) '_MONTH' INTO GV_FIELDNAME .
CONCATENATE LV_DATS+(4) '年' LV_DATS+4(2) '月预测' INTO GV_DESCRIPTION .
FILL_FIELD GV_FIELDNAME GV_DESCRIPTION 'ZTFIELD' 'ZQUAN' '20' .
ENDIF.
LV_DATS+6(2) = '27'.
LV_DATS = LV_DATS + 6.
LV_DATS+6(2) = '01'.
ENDDO.
LV_DATS = S_ERSDA-LOW.
DO 12 TIMES .
IF LV_DATS <= S_ERSDA-HIGH.
CLEAR GV_FIELDNAME .
CLEAR GV_DESCRIPTION .
CONCATENATE LV_DATS+(6) '_MONTX' INTO GV_FIELDNAME .
CONCATENATE LV_DATS+(4) '年' LV_DATS+4(2) '月需求' INTO GV_DESCRIPTION .
FILL_FIELD GV_FIELDNAME GV_DESCRIPTION 'ZTFIELD' 'ZQUAN' '20' .
ENDIF.
LV_DATS+6(2) = '27'.
LV_DATS = LV_DATS + 6.
LV_DATS+6(2) = '01'.
ENDDO.
LV_DATS = S_ERSDA-LOW.
DO 12 TIMES .
IF LV_DATS <= S_ERSDA-HIGH.
CLEAR GV_FIELDNAME .
CLEAR GV_DESCRIPTION .
CONCATENATE LV_DATS+(6) '_MONTM' INTO GV_FIELDNAME .
CONCATENATE LV_DATS+(4) '年' LV_DATS+4(2) 'MRP供给' INTO GV_DESCRIPTION .
FILL_FIELD GV_FIELDNAME GV_DESCRIPTION 'ZTFIELD' 'ZQUAN' '20'.
ENDIF.
LV_DATS+6(2) = '27'.
LV_DATS = LV_DATS + 6.
LV_DATS+6(2) = '01'.
ENDDO.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form BUILD_DYNMIC_TABLE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
* 创建动态内表
FORM BUILD_DYNAMIC_TABLE . "调用静态方法 :CREATE_DYNAMIC_TABLE
DATA LT_NEW_TABLE TYPE REF TO DATA .
DATA LS_NEW_LINE TYPE REF TO DATA .
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
* I_STYLE_TABLE =
IT_FIELDCATALOG = GT_FIELDCAT "输入FIELDCATALOG 将返回一个动态内表
* I_LENGTH_IN_BYTE =
IMPORTING
EP_TABLE = LT_NEW_TABLE "获取返回的动态内表 (类)
* E_STYLE_FNAME =
EXCEPTIONS
GENERATE_SUBPOOL_DIR_FULL = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
EXIT.
* Implement suitable error handling here
ENDIF.
ASSIGN LT_NEW_TABLE->* TO <FT_VB> . "LT_NEW_TABLE 中的所有都被指向<FT_VB>(动态内表)
CREATE DATA LS_NEW_LINE LIKE LINE OF <FT_VB> .
ASSIGN LS_NEW_LINE->* TO <FS_VB> . "LS_NEW_LINE 中的所有都被指向<FS_VB> (动态内表结构)
ENDFORM. " BUILD_DYNMIC_TABLE
FORM PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.
FORM USER_COMMAND USING I_UCOMM LIKE SY-UCOMM
IS_SELFIELD TYPE SLIS_SELFIELD.
DATA: REF TYPE REF TO CL_GUI_ALV_GRID.
DATA : LV_STABLE TYPE LVC_S_STBL. "刷新稳定性
RANGES: L_WERKS FOR T001W-WERKS.
RANGES: L_MATNR FOR MARA-MATNR.
DATA:L_BUKRS TYPE T001K-BUKRS.
LV_STABLE-ROW = '1'.
LV_STABLE-COL = '1'.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = REF.
CALL METHOD REF->CHECK_CHANGED_DATA.
CASE I_UCOMM.
WHEN '&IC1'."表示双击
WHEN 'POST_T'.
ENDCASE.
CALL METHOD REF->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LV_STABLE.
ENDFORM.
INITIALIZATION .
START-OF-SELECTION.
PERFORM FRM_FILL_FIELD .
PERFORM BUILD_DYNAMIC_TABLE .
PERFORM FOM_GETDATA .
PERFORM FOM_SETFIELDCAT .
PERFORM FRM_DISPLAY.