因爲movement type到底有多少種是不確定的,所以這個時候就用到了Dynamic Columns Display in ALV
Source code:
REPORT yiris_dynamic_alv4.
TYPE-POOLS: slis.
TABLES: mseg, mkpf.
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.
TYPES: BEGIN OF ty_bwart,
bwart LIKE mseg-bwart,
END OF ty_bwart.
DATA: it_tab TYPE TABLE OF ty_sum,
wa_tab TYPE ty_sum,
hash_it_sum TYPE HASHED TABLE OF ty_sum
WITH UNIQUE KEY werks matnr lgort bwart,
wa_sum TYPE ty_sum,
itab_sum TYPE TABLE OF ty_sum.
DATA: hash_it_bwart TYPE HASHED TABLE OF ty_bwart
WITH UNIQUE KEY bwart ,
wa_hs_bwart TYPE ty_bwart,
itab_bwart TYPE TABLE OF ty_bwart.
DATA: gv_no(2) TYPE n,
txt(20) TYPE c ,
wa_fcat TYPE lvc_s_fcat,
it_fcat TYPE lvc_t_fcat.
DATA: dy_table TYPE REF TO data,
dy_line TYPE REF TO data.
FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
<dyn_wa>,
<dyn_field>.
DATA: gd_fieldcat TYPE slis_t_fieldcat_alv.
SELECT-OPTIONS: s_mblnr FOR mseg-mblnr,"Material Document No.
s_budat FOR mkpf-budat."Posting Date
START-OF-SELECTION.
PERFORM get_data.
PERFORM fix_data.
PERFORM fieldcat_init."整 理 下 fieldcat 進 行 顯 示
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
it_fieldcat = gd_fieldcat[]
TABLES
t_outtab = <dyn_table>
EXCEPTIONS
program_error = 1
OTHERS = 2.
FORM get_data .
SELECT werks matnr lgort bwart "Movement Type
menge "Quantity
INTO TABLE it_tab
FROM mkpf INNER JOIN mseg ON
mkpf~mblnr = mseg~mblnr "Material Document No.
AND mkpf~mjahr = mseg~mjahr "Material Document Year
WHERE mkpf~mblnr IN s_mblnr
AND mkpf~budat IN s_budat.
ENDFORM. " get_data
FORM fix_data .
DATA: index TYPE sy-tabix.
LOOP AT it_tab INTO wa_tab.
*計 算 同 一 個 工 廠、 物 料、storage loaction,不 同 的movement type 的 quantity 的 SUM
wa_sum = wa_tab.
COLLECT wa_sum INTO hash_it_sum.
*無 重 復 的 獲 得 movement type都 有 哪 些
wa_hs_bwart = wa_tab-bwart.
COLLECT wa_hs_bwart INTO hash_it_bwart.
ENDLOOP.
SORT hash_it_bwart.
itab_bwart[] = hash_it_bwart[].
itab_sum[] = hash_it_sum[].
PERFORM create_itab_out.
LOOP AT itab_sum INTO wa_sum..
ASSIGN COMPONENT 'WERKS' OF STRUCTURE <dyn_wa> TO <dyn_field>.
<dyn_field> = wa_sum-werks.
ASSIGN COMPONENT 'MATNR' OF STRUCTURE <dyn_wa> TO <dyn_field>.
<dyn_field> = wa_sum-matnr.
ASSIGN COMPONENT 'LGORT' OF STRUCTURE <dyn_wa> TO <dyn_field>.
<dyn_field> = wa_sum-lgort.
*在 不 確 定 列 名 的 時 候 ,可 以 用 index 來 訪 問 該 列
READ TABLE itab_bwart TRANSPORTING NO FIELDS WITH KEY bwart =
wa_sum-bwart.
index = sy-tabix + 3.
ASSIGN COMPONENT index OF STRUCTURE <dyn_wa> TO <dyn_field>.
<dyn_field> = wa_sum-menge.
ASSIGN COMPONENT 'LINE_SUM' OF STRUCTURE <dyn_wa> TO <dyn_field>.
<dyn_field> = wa_sum-menge.
COLLECT <dyn_wa> INTO <dyn_table>.
CLEAR: <dyn_wa>.
ENDLOOP.
ENDFORM. " fix_data
FORM create_itab_out .
CLEAR: gv_no .
PERFORM build_itab_stru USING: 'WERKS' 'MSEG' 'WERKS' ,
'MATNR' 'MSEG' 'MATNR' ,
'LGORT' 'MSEG' 'LGORT' .
LOOP AT hash_it_bwart INTO wa_hs_bwart.
gv_no = gv_no + 1.
CONCATENATE 'MENGE' gv_no 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 = it_fcat
IMPORTING
ep_table = dy_table.
*如 果 定 義 時 沒 有 指 定 類 型 或 者 結 構 ,那 麼 REF 必 須 ASSIGN
*到 另 外 一 個 FS 裏 間 接 使 用
ASSIGN dy_table->* TO <dyn_table>.
CREATE DATA dy_line LIKE LINE OF <dyn_table>.
ASSIGN dy_line->* TO <dyn_wa>.
ENDFORM. " create_itab_out
FORM build_itab_stru USING fdname ref_t ref_f.
wa_fcat-fieldname = fdname .
wa_fcat-ref_table = ref_t.
wa_fcat-ref_field = ref_f.
APPEND wa_fcat TO it_fcat.
ENDFORM. "build_itab_stru
FORM fieldcat_init .
CLEAR gv_no .
PERFORM frm_catlg_set USING: 'WERKS' 'Plant' 'X' ,
'MATNR' 'Material No.' 'X' ,
'LGORT' 'Storage Location' 'X' .
LOOP AT itab_bwart INTO wa_hs_bwart .
gv_no = gv_no + 1.
CONCATENATE 'MENGE' gv_no INTO txt.
PERFORM frm_catlg_set USING: txt wa_hs_bwart-bwart '' .
ENDLOOP.
PERFORM frm_catlg_set USING: 'LINE_SUM' 'SUM' '' .
ENDFORM. " fieldcat_init
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
Output: