把內表的行列轉換,網上的例子很多,但是新人想看懂,幾乎很難,所以總結下我是怎么完成的。
比如:你的內表如圖:
你想讓內表最后展示成這樣:如圖:
那么完成之后會是這樣:
完成這個過程,得用到動態內表。看代碼:
DATA:BEGIN OF itab8 OCCURS 0, bezei LIKE zchannel-bezei, "銷售辦事處 zdate LIKE zchannel-zdate, "日期 salesamount LIKE zchannel-salesamount, "總額 END OF itab8.
先排序:
SORT itab8 BY bezei zdate DESCENDING.
要以日期作為列,得先取得唯一的日期。
DATA TDATE LIKE SY-DATUM OCCURS 0 WITH HEADER LINE. LOOP AT itab8. TDATE = ITAB8-ZDATE. COLLECT TDATE. ENDLOOP.
下面構建動態內表結構
DATA: dy_table TYPE REF TO data, dy_wa TYPE REF TO data, it_str TYPE lvc_t_fcat, "是Table Type wa_str TYPE lvc_s_fcat. "是一個Structure 用於存儲即將構建的動態內表結構 FIELD-SYMBOLS: <dyn_table> TYPE table, "是一個標志,可以理解為一個指針,將來創建的內表就要通過它們來訪問 <dyn_wa> TYPE ANY, <FS> TYPE ANY. wa_str-fieldname = 'BEZEI'. wa_str-col_pos = 1. wa_str-inttype = 'CHAR'. wa_str-intlen = 20. APPEND wa_str TO it_str. CLEAR wa_str. wa_str-fieldname = 'SELFI'. wa_str-col_pos = 1. wa_str-inttype = 'CHAR'. wa_str-intlen = 20. APPEND wa_str TO it_str. CLEAR wa_str. REFRESH fieldcat. PERFORM input_fieldcat USING 'BEZEI' '銷售辦事處' '' '' '' '' ''. LOOP AT TDATE. wa_str-fieldname = TDATE. wa_str-col_pos = 1. wa_str-inttype = 'CHAR'. wa_str-intlen = 20. APPEND wa_str TO it_str. CLEAR wa_str. PERFORM input_fieldcat USING TDATE TDATE '' '' '' '' ''. ENDLOOP. *此方法用於構建動態內表,輸入=構建的結構,輸出=dy_table CALL METHOD cl_alv_table_create=>create_dynamic_table EXPORTING it_fieldcatalog = it_str IMPORTING ep_table = dy_table. ASSIGN dy_table->* TO <dyn_table>. CREATE DATA dy_wa LIKE LINE OF <dyn_table>. ASSIGN dy_wa->* TO <dyn_wa>.
下面往結構里寫數
DATA FIELDNAME(20). LOOP AT ITAB8. ASSIGN COMPONENT 'BEZEI' OF STRUCTURE <dyn_wa> TO <FS>. "分配結構里的銷售辦事處,用FS字段 指向它
<FS> = ITAB8-BEZEI. FIELDNAME = ITAB8-ZDATE. "這里把日期類型定義為char型,因為用DATS報錯。 ASSIGN COMPONENT FIELDNAME OF STRUCTURE <dyn_wa> TO <FS>. "分配結構的日期,將FS指向它 <FS> = ITAB8-SALESAMOUNT. AT END OF BEZEI. APPEND <dyn_wa> TO <dyn_table>. ENDAT. ENDLOOP.