动态移动类型列显示物料移动
REPORT Z_BARRY_TEST_FIELDSYMOLS.
TYPE-POOLS: SLIS.
TABLES: MSEG,
MKPF.
DATA: GD_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
DATA: SLA TYPE SLIS_LAYOUT_ALV,
IVARIANT LIKE DISVARIANT,
I_REPID LIKE SY-REPID,
I_EXCLUDING TYPE SLIS_T_EXTAB.
TYPES: BEGIN OF TY_SUM ,
WERKS LIKE MSEG-WERKS,
MATNR LIKE MSEG-MATNR,
LGORT LIKE MSEG-LGORT,
BWART LIKE MSEG-BWART,
MENGE LIKE MSEG-MENGE,
END OF TY_SUM.
DATA : ITAB TYPE STANDARD TABLE OF TY_SUM WITH HEADER LINE .
DATA : HS_SUM TYPE HASHED TABLE OF TY_SUM WITH UNIQUE KEY WERKS MATNR LGORT BWART WITH HEADER LINE .
DATA : ITAB_SUM TYPE STANDARD TABLE OF TY_SUM WITH HEADER LINE .
TYPES: BEGIN OF TY_BWART ,
BWART LIKE MSEG-BWART,
END OF TY_BWART.
DATA : HS_BWART TYPE HASHED TABLE OF TY_BWART WITH UNIQUE KEY BWART WITH HEADER LINE .
DATA : ITAB_BWART TYPE STANDARD TABLE OF TY_BWART WITH HEADER LINE .
FIELD-SYMBOLS: <F_FS1> ,
<F_OUT> TYPE STANDARD TABLE,
<F_OUT_WA> .
DATA: MAX_COUNT TYPE I,
DY_OUT TYPE REF TO DATA,
DY_OUT_WA TYPE REF TO DATA,
XFC TYPE LVC_S_FCAT,
IFC TYPE LVC_T_FCAT.
DATA: C(2) TYPE N,
TXT(20) TYPE C.
SELECT-OPTIONS:
S_MATNR FOR MSEG-MATNR,
S_MBLNR FOR MSEG-MBLNR,
S_BUDAT FOR MKPF-BUDAT.
PARAMETERS: P_SUM AS CHECKBOX .
START-OF-SELECTION.
PERFORM GETDATA.
PERFORM FIXDATA.
IF P_SUM = 'X'.
PERFORM OUTDATA.
ELSE.
PERFORM OUTDATA2.
ENDIF.
*&---------------------------------------------------------------------*
*& Form GETDATA
*&---------------------------------------------------------------------*
FORM GETDATA.
SELECT
WERKS
MATNR
LGORT
BWART
MENGE
INTO TABLE ITAB
FROM MKPF
INNER JOIN MSEG ON MKPF~MBLNR = MSEG~MBLNR
AND MKPF~MJAHR = MSEG~MJAHR
WHERE MKPF~MBLNR IN S_MBLNR
AND MKPF~BUDAT IN S_BUDAT
AND MSEG~MATNR IN S_MATNR.
ENDFORM. " GETDATA
*&---------------------------------------------------------------------*
*& Form FIXDATA
*&---------------------------------------------------------------------*
FORM FIXDATA.
DATA: INDEX LIKE SY-TABIX .
LOOP AT ITAB.
HS_SUM = ITAB."汇总成唯一值
COLLECT HS_SUM.
HS_BWART = ITAB-BWART ."所有的唯一移动类型
COLLECT HS_BWART.
ENDLOOP.
SORT HS_BWART.
ITAB_BWART[] = HS_BWART[]."赋值给标准表
ITAB_SUM[] = HS_SUM[]."赋值给标准表
PERFORM CREAT_ITAB_OUT."动态列的构造
LOOP AT ITAB_SUM.
ASSIGN COMPONENT 'WERKS' OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
<F_FS1> = ITAB_SUM-WERKS.
ASSIGN COMPONENT 'MATNR' OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
<F_FS1> = ITAB_SUM-MATNR.
ASSIGN COMPONENT 'LGORT' OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
<F_FS1> = ITAB_SUM-LGORT.
READ TABLE ITAB_BWART WITH KEY BWART = ITAB_SUM-BWART .
INDEX = SY-TABIX + 3."查找到的位置加3就是当前写入的位置
ASSIGN COMPONENT INDEX OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
<F_FS1> = ITAB_SUM-MENGE.
ASSIGN COMPONENT 'LINE_SUM' OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
<F_FS1> = ITAB_SUM-MENGE.
COLLECT <F_OUT_WA> INTO <F_OUT> .
CLEAR <F_OUT_WA>.
ENDLOOP.
ENDFORM. " FIXDATA
*&---------------------------------------------------------------------*
*& Form outdata
*&---------------------------------------------------------------------*
FORM OUTDATA.
PERFORM FIELDCAT_INIT .
SLA-COLWIDTH_OPTIMIZE = 'X'.
SLA-ZEBRA = 'X'.
I_REPID = SY-REPID.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = I_REPID
IT_FIELDCAT = GD_FIELDCAT[]
I_SAVE = 'A'
IS_VARIANT = IVARIANT
IS_LAYOUT = SLA
IT_EXCLUDING = I_EXCLUDING
* i_callback_user_command = 'USER_COMMAND'
TABLES
T_OUTTAB = ITAB_SUM
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
ENDFORM. " outdata
*---------------------------------------------------------------------*
* FORM fieldcat_init *
*---------------------------------------------------------------------*
FORM FIELDCAT_INIT .
PERFORM FRM_CATLG_SET USING:
'WERKS' 'WERKS' 'X' ,
'MATNR' 'MATNR' 'X' ,
'LGORT' 'LGORT' 'X' ,
'BWART' 'BWART' '' ,
'MENGE' 'MENGE' '' .
ENDFORM. "fieldcat_init
*---------------------------------------------------------------------*
* FORM frm_catlg_set *
*---------------------------------------------------------------------*
FORM FRM_CATLG_SET USING
P_FIELD
P_TEXT
P_KEY.
DATA: LS_FIELDCAT TYPE SLIS_FIELDCAT_ALV.
LS_FIELDCAT-FIELDNAME = P_FIELD.
LS_FIELDCAT-SELTEXT_L = P_TEXT.
LS_FIELDCAT-KEY = P_KEY.
IF P_FIELD = 'LINE_SUM'.
LS_FIELDCAT-EMPHASIZE = 'C700'.
ENDIF.
APPEND LS_FIELDCAT TO GD_FIELDCAT .
CLEAR LS_FIELDCAT .
ENDFORM. "frm_catlg_set
*&--------------------------------------------------------------------*
*& Form user_command
*&--------------------------------------------------------------------*
*FORM user_command USING r_ucomm LIKE sy-ucomm
* rs_selfield TYPE slis_selfield.
* READ TABLE itab INDEX rs_selfield-tabindex.
* CASE r_ucomm.
* WHEN '&IC1'. "双击
*
* WHEN 'EXIT'.
* LEAVE PROGRAM.
* ENDCASE.
** rs_selfield-refresh = 'X'. "自动刷新
*ENDFORM. "user_com
*---------------------------------------------------------------------*
* FORM outdata2 *
*---------------------------------------------------------------------*
FORM OUTDATA2.
PERFORM FIELDCAT_INIT2 .
SLA-COLWIDTH_OPTIMIZE = 'X'.
SLA-ZEBRA = 'X'.
I_REPID = SY-REPID.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = I_REPID
IT_FIELDCAT = GD_FIELDCAT[]
I_SAVE = 'A'
IS_VARIANT = IVARIANT
IS_LAYOUT = SLA
IT_EXCLUDING = I_EXCLUDING
TABLES
T_OUTTAB = <F_OUT>
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
ENDFORM. " outdata
*---------------------------------------------------------------------*
* FORM fieldcat_init2 *
*---------------------------------------------------------------------*
FORM FIELDCAT_INIT2 .
CLEAR C .
PERFORM FRM_CATLG_SET USING:
'WERKS' 'WERKS' 'X' ,
'MATNR' 'MATNR' 'X' ,
'LGORT' 'LGORT' 'X' .
LOOP AT HS_BWART .
C = C + 1.
CONCATENATE 'MENGE' C INTO TXT.
PERFORM FRM_CATLG_SET USING: TXT HS_BWART-BWART '' .
ENDLOOP.
PERFORM FRM_CATLG_SET USING: 'LINE_SUM' 'SUM' '' .
ENDFORM. "fieldcat_init
*---------------------------------------------------------------------*
* FORM creat_itab_out *
*---------------------------------------------------------------------*
FORM CREAT_ITAB_OUT.
CLEAR C."C是字符数字型累加的
"前面三列是固定的
PERFORM BUILD_ITAB_STRU USING:
'WERKS' 'MSEG' 'WERKS' ,
'MATNR' 'MSEG' 'MATNR' ,
'LGORT' 'MSEG' 'LGORT' .
"动态列
LOOP AT HS_BWART.
C = C + 1.
CONCATENATE 'MENGE' C INTO TXT.
PERFORM BUILD_ITAB_STRU USING: TXT 'MSEG' 'MENGE' .
ENDLOOP.
"汇总数
PERFORM BUILD_ITAB_STRU USING: 'LINE_SUM' 'MSEG' 'MENGE' .
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = IFC
IMPORTING
EP_TABLE = DY_OUT.
ASSIGN DY_OUT->* TO <F_OUT>.
CREATE DATA DY_OUT_WA LIKE LINE OF <F_OUT>.
ASSIGN DY_OUT_WA->* TO <F_OUT_WA>.
ENDFORM.
*---------------------------------------------------------------------*
* FORM build_itab_stru *
*---------------------------------------------------------------------*
FORM BUILD_ITAB_STRU USING FDNAME REF_T REF_F.
XFC-FIELDNAME = FDNAME .
XFC-REF_TABLE = REF_T.
XFC-REF_FIELD = REF_F.
APPEND XFC TO IFC.
TYPE-POOLS: SLIS.
TABLES: MSEG,
MKPF.
DATA: GD_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
DATA: SLA TYPE SLIS_LAYOUT_ALV,
IVARIANT LIKE DISVARIANT,
I_REPID LIKE SY-REPID,
I_EXCLUDING TYPE SLIS_T_EXTAB.
TYPES: BEGIN OF TY_SUM ,
WERKS LIKE MSEG-WERKS,
MATNR LIKE MSEG-MATNR,
LGORT LIKE MSEG-LGORT,
BWART LIKE MSEG-BWART,
MENGE LIKE MSEG-MENGE,
END OF TY_SUM.
DATA : ITAB TYPE STANDARD TABLE OF TY_SUM WITH HEADER LINE .
DATA : HS_SUM TYPE HASHED TABLE OF TY_SUM WITH UNIQUE KEY WERKS MATNR LGORT BWART WITH HEADER LINE .
DATA : ITAB_SUM TYPE STANDARD TABLE OF TY_SUM WITH HEADER LINE .
TYPES: BEGIN OF TY_BWART ,
BWART LIKE MSEG-BWART,
END OF TY_BWART.
DATA : HS_BWART TYPE HASHED TABLE OF TY_BWART WITH UNIQUE KEY BWART WITH HEADER LINE .
DATA : ITAB_BWART TYPE STANDARD TABLE OF TY_BWART WITH HEADER LINE .
FIELD-SYMBOLS: <F_FS1> ,
<F_OUT> TYPE STANDARD TABLE,
<F_OUT_WA> .
DATA: MAX_COUNT TYPE I,
DY_OUT TYPE REF TO DATA,
DY_OUT_WA TYPE REF TO DATA,
XFC TYPE LVC_S_FCAT,
IFC TYPE LVC_T_FCAT.
DATA: C(2) TYPE N,
TXT(20) TYPE C.
SELECT-OPTIONS:
S_MATNR FOR MSEG-MATNR,
S_MBLNR FOR MSEG-MBLNR,
S_BUDAT FOR MKPF-BUDAT.
PARAMETERS: P_SUM AS CHECKBOX .
START-OF-SELECTION.
PERFORM GETDATA.
PERFORM FIXDATA.
IF P_SUM = 'X'.
PERFORM OUTDATA.
ELSE.
PERFORM OUTDATA2.
ENDIF.
*&---------------------------------------------------------------------*
*& Form GETDATA
*&---------------------------------------------------------------------*
FORM GETDATA.
SELECT
WERKS
MATNR
LGORT
BWART
MENGE
INTO TABLE ITAB
FROM MKPF
INNER JOIN MSEG ON MKPF~MBLNR = MSEG~MBLNR
AND MKPF~MJAHR = MSEG~MJAHR
WHERE MKPF~MBLNR IN S_MBLNR
AND MKPF~BUDAT IN S_BUDAT
AND MSEG~MATNR IN S_MATNR.
ENDFORM. " GETDATA
*&---------------------------------------------------------------------*
*& Form FIXDATA
*&---------------------------------------------------------------------*
FORM FIXDATA.
DATA: INDEX LIKE SY-TABIX .
LOOP AT ITAB.
HS_SUM = ITAB."汇总成唯一值
COLLECT HS_SUM.
HS_BWART = ITAB-BWART ."所有的唯一移动类型
COLLECT HS_BWART.
ENDLOOP.
SORT HS_BWART.
ITAB_BWART[] = HS_BWART[]."赋值给标准表
ITAB_SUM[] = HS_SUM[]."赋值给标准表
PERFORM CREAT_ITAB_OUT."动态列的构造
LOOP AT ITAB_SUM.
ASSIGN COMPONENT 'WERKS' OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
<F_FS1> = ITAB_SUM-WERKS.
ASSIGN COMPONENT 'MATNR' OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
<F_FS1> = ITAB_SUM-MATNR.
ASSIGN COMPONENT 'LGORT' OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
<F_FS1> = ITAB_SUM-LGORT.
READ TABLE ITAB_BWART WITH KEY BWART = ITAB_SUM-BWART .
INDEX = SY-TABIX + 3."查找到的位置加3就是当前写入的位置
ASSIGN COMPONENT INDEX OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
<F_FS1> = ITAB_SUM-MENGE.
ASSIGN COMPONENT 'LINE_SUM' OF STRUCTURE <F_OUT_WA> TO <F_FS1>.
<F_FS1> = ITAB_SUM-MENGE.
COLLECT <F_OUT_WA> INTO <F_OUT> .
CLEAR <F_OUT_WA>.
ENDLOOP.
ENDFORM. " FIXDATA
*&---------------------------------------------------------------------*
*& Form outdata
*&---------------------------------------------------------------------*
FORM OUTDATA.
PERFORM FIELDCAT_INIT .
SLA-COLWIDTH_OPTIMIZE = 'X'.
SLA-ZEBRA = 'X'.
I_REPID = SY-REPID.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = I_REPID
IT_FIELDCAT = GD_FIELDCAT[]
I_SAVE = 'A'
IS_VARIANT = IVARIANT
IS_LAYOUT = SLA
IT_EXCLUDING = I_EXCLUDING
* i_callback_user_command = 'USER_COMMAND'
TABLES
T_OUTTAB = ITAB_SUM
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
ENDFORM. " outdata
*---------------------------------------------------------------------*
* FORM fieldcat_init *
*---------------------------------------------------------------------*
FORM FIELDCAT_INIT .
PERFORM FRM_CATLG_SET USING:
'WERKS' 'WERKS' 'X' ,
'MATNR' 'MATNR' 'X' ,
'LGORT' 'LGORT' 'X' ,
'BWART' 'BWART' '' ,
'MENGE' 'MENGE' '' .
ENDFORM. "fieldcat_init
*---------------------------------------------------------------------*
* FORM frm_catlg_set *
*---------------------------------------------------------------------*
FORM FRM_CATLG_SET USING
P_FIELD
P_TEXT
P_KEY.
DATA: LS_FIELDCAT TYPE SLIS_FIELDCAT_ALV.
LS_FIELDCAT-FIELDNAME = P_FIELD.
LS_FIELDCAT-SELTEXT_L = P_TEXT.
LS_FIELDCAT-KEY = P_KEY.
IF P_FIELD = 'LINE_SUM'.
LS_FIELDCAT-EMPHASIZE = 'C700'.
ENDIF.
APPEND LS_FIELDCAT TO GD_FIELDCAT .
CLEAR LS_FIELDCAT .
ENDFORM. "frm_catlg_set
*&--------------------------------------------------------------------*
*& Form user_command
*&--------------------------------------------------------------------*
*FORM user_command USING r_ucomm LIKE sy-ucomm
* rs_selfield TYPE slis_selfield.
* READ TABLE itab INDEX rs_selfield-tabindex.
* CASE r_ucomm.
* WHEN '&IC1'. "双击
*
* WHEN 'EXIT'.
* LEAVE PROGRAM.
* ENDCASE.
** rs_selfield-refresh = 'X'. "自动刷新
*ENDFORM. "user_com
*---------------------------------------------------------------------*
* FORM outdata2 *
*---------------------------------------------------------------------*
FORM OUTDATA2.
PERFORM FIELDCAT_INIT2 .
SLA-COLWIDTH_OPTIMIZE = 'X'.
SLA-ZEBRA = 'X'.
I_REPID = SY-REPID.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = I_REPID
IT_FIELDCAT = GD_FIELDCAT[]
I_SAVE = 'A'
IS_VARIANT = IVARIANT
IS_LAYOUT = SLA
IT_EXCLUDING = I_EXCLUDING
TABLES
T_OUTTAB = <F_OUT>
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
ENDFORM. " outdata
*---------------------------------------------------------------------*
* FORM fieldcat_init2 *
*---------------------------------------------------------------------*
FORM FIELDCAT_INIT2 .
CLEAR C .
PERFORM FRM_CATLG_SET USING:
'WERKS' 'WERKS' 'X' ,
'MATNR' 'MATNR' 'X' ,
'LGORT' 'LGORT' 'X' .
LOOP AT HS_BWART .
C = C + 1.
CONCATENATE 'MENGE' C INTO TXT.
PERFORM FRM_CATLG_SET USING: TXT HS_BWART-BWART '' .
ENDLOOP.
PERFORM FRM_CATLG_SET USING: 'LINE_SUM' 'SUM' '' .
ENDFORM. "fieldcat_init
*---------------------------------------------------------------------*
* FORM creat_itab_out *
*---------------------------------------------------------------------*
FORM CREAT_ITAB_OUT.
CLEAR C."C是字符数字型累加的
"前面三列是固定的
PERFORM BUILD_ITAB_STRU USING:
'WERKS' 'MSEG' 'WERKS' ,
'MATNR' 'MSEG' 'MATNR' ,
'LGORT' 'MSEG' 'LGORT' .
"动态列
LOOP AT HS_BWART.
C = C + 1.
CONCATENATE 'MENGE' C INTO TXT.
PERFORM BUILD_ITAB_STRU USING: TXT 'MSEG' 'MENGE' .
ENDLOOP.
"汇总数
PERFORM BUILD_ITAB_STRU USING: 'LINE_SUM' 'MSEG' 'MENGE' .
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = IFC
IMPORTING
EP_TABLE = DY_OUT.
ASSIGN DY_OUT->* TO <F_OUT>.
CREATE DATA DY_OUT_WA LIKE LINE OF <F_OUT>.
ASSIGN DY_OUT_WA->* TO <F_OUT_WA>.
ENDFORM.
*---------------------------------------------------------------------*
* FORM build_itab_stru *
*---------------------------------------------------------------------*
FORM BUILD_ITAB_STRU USING FDNAME REF_T REF_F.
XFC-FIELDNAME = FDNAME .
XFC-REF_TABLE = REF_T.
XFC-REF_FIELD = REF_F.
APPEND XFC TO IFC.
ENDFORM.