转载: 内表行列转换 -- 动态内表结构

把内表的行列转换,网上的例子很多,但是新人想看懂,几乎很难,所以总结下我是怎么完成的。

比如:你的内表如图:

你想让内表最后展示成这样:如图:

那么完成之后会是这样:

完成这个过程,得用到动态内表。看代码:

[plain] view plaincopy

  1. DATA:BEGIN OF itab8 OCCURS 0, 
  2.      bezei       LIKE zchannel-bezei,         "销售办事处 
  3.      zdate       LIKE zchannel-zdate,         "日期 
  4.      salesamount LIKE zchannel-salesamount,   "总额 
  5.   END OF itab8. 

先排序:

[plain] view plaincopy

  1. SORT itab8 BY bezei zdate DESCENDING. 

要以日期作为列,得先取得唯一的日期。

[plain] view plaincopy

  1. DATA TDATE LIKE SY-DATUM OCCURS 0 WITH HEADER LINE. 
  2. LOOP AT itab8. 
  3.     TDATE = ITAB8-ZDATE. 
  4.     COLLECT TDATE. 
  5.   ENDLOOP. 

下面构建动态内表结构

[plain] view plaincopy

  1.   DATA: dy_table TYPE REF TO data, 
  2.         dy_wa TYPE REF TO data, 
  3.         it_str TYPE lvc_t_fcat,  "是Table Type 
  4.         wa_str TYPE lvc_s_fcat.  "是一个Structure  用于存储即将构建的动态内表结构 
  5.   FIELD-SYMBOLS: <dyn_table> TYPE table,  "是一个标志,可以理解为一个指针,将来创建的内表就要通过它们来访问 
  6.                  <dyn_wa> TYPE ANY, 
  7.                  <FS> TYPE ANY. 
  8.   wa_str-fieldname = 'BEZEI'. 
  9.   wa_str-col_pos = 1. 
  10.   wa_str-inttype = 'CHAR'. 
  11.   wa_str-intlen = 20. 
  12.   APPEND wa_str TO it_str. 
  13.   CLEAR wa_str. 
  14.   wa_str-fieldname = 'SELFI'. 
  15.   wa_str-col_pos = 1. 
  16.   wa_str-inttype = 'CHAR'. 
  17.   wa_str-intlen = 20. 
  18.   APPEND wa_str TO it_str. 
  19.   CLEAR wa_str. 
  20.   REFRESH fieldcat. 
  21.   PERFORM input_fieldcat  USING 'BEZEI'  '销售办事处'  ''  '' '' '' ''. 
  22.   LOOP AT TDATE. 
  23.         wa_str-fieldname = TDATE. 
  24.         wa_str-col_pos = 1. 
  25.         wa_str-inttype = 'CHAR'. 
  26.         wa_str-intlen = 20. 
  27.         APPEND wa_str TO it_str. 
  28.         CLEAR wa_str. 
  29.      PERFORM input_fieldcat  USING TDATE  TDATE  ''  '' '' '' ''. 
  30.   ENDLOOP. 
  31. *此方法用于构建动态内表,输入=构建的结构,输出=dy_table 
  32.   CALL METHOD cl_alv_table_create=>create_dynamic_table 
  33.     EXPORTING 
  34.       it_fieldcatalog = it_str 
  35.     IMPORTING 
  36.       ep_table        = dy_table. 
  37.   ASSIGN dy_table->* TO <dyn_table>. 
  38.   CREATE DATA dy_wa LIKE LINE OF <dyn_table>. 
  39.   ASSIGN dy_wa->* TO <dyn_wa>. 

下面往结构里写数

DATA FIELDNAME(20). 

  1. LOOP AT ITAB8. 
  2.    ASSIGN COMPONENT 'BEZEI' OF STRUCTURE <dyn_wa> TO <FS>.  "<span style="color: rgb(128, 128, 128); font-family: 微软雅黑; font-size: 10pt;">分配结构里的销售办事处,用FS字段 指向它</span>  
    注sophy: 这里就是为什么要用到reference。如果直接用field symbol这里会报错说没有这个component。现在用reference,在前面执行到的时候有create data这里在运行时根据 like line of <kyn_table> 动态赋予了表结构。
  3.    <FS> = ITAB8-BEZEI.    
  4.    FIELDNAME = ITAB8-ZDATE. "这里把日期类型定义为char型,因为用DATS报错。 
  5.    ASSIGN COMPONENT FIELDNAME OF STRUCTURE <dyn_wa> TO <FS>. "分配结构的日期,将FS指向它 
  6.    <FS> = ITAB8-SALESAMOUNT. 
  7.    AT END OF BEZEI. 
  8.       APPEND <dyn_wa> TO <dyn_table>. 
  9.    ENDAT. 
  10. ENDLOOP. 
原文地址:https://www.cnblogs.com/sophyzhu/p/3502969.html