【博主SAP/ABAP交流群53144545】
ALV输出里有时会碰到输出列事先无法确定的情况,这时会需要用到动态内表的方法。
以下程序实现从VBAK表中取得若干VBELN销售订单号,然后把这些销售订单号作为列输出,其中有多少VBELN是从屏幕上由用户选择的。
只列举跟动态有关的部分代码:
* 动态内表定义部分
DATA DYN_TABLE TYPE REF TO DATA,
DATA DYN_LINE TYPE REF TO DATA.
FIELD-SYMBOLS <IT_DYN> TYPE STANDARD TABLE,
FIELD-SYMBOLS <WA_DYN> TYPE ANY.
* 从屏幕选择VBELN
SELECT VBELN
FROM VBAK
INTO CORRESPONDING FIELDS OF TABLE IT_TAB
WHERE VBELN IN S_VBELN.
* 往FIELDCAT内表填数据
SORT IT_TAB BY VBELN ASCENDING.
DESCRIBE TABLE IT_TAB LINES G_LINES.
DO G_LINES TIMES.
CONCATENATE 'VBELN' G_NO INTO L_VBELN. ”为字段取名VBELN01, VBELN02,VBELN03…
L_TABNAME = L_VBELN. "为字段标签取名VBELN01, VBELN02,VBELN03…
PERFORM FILL_ALV_FLIELCAT_SUB USING L_VBELN L_TABNAME L_POS L_OUTLEN '' '' '' ''. "此FORM为APPEND数据到FLIELCAT,具体内容此处省略
G_NO = G_NO + 1.
ENDDO.
* 根据FLIELCAT创建动态内表(类似做转置)
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = IT_FIELDCAT
IMPORTING
EP_TABLE = DYN_TABLE
EXCEPTIONS
GENERATE_SUBPOOL_DIR_FULL = 1
OTHERS = 2.
* Internal Table
ASSIGN DYN_TABLE->* TO <IT_DYN>.”动态内表的FS
* Line Structure
CREATE DATA DYN_LINE LIKE LINE OF <IT_DYN>.
ASSIGN DYN_LINE->* TO <WA_DYN>.”动态内表行的FS
* 根据IT_TAB的内容为动态内表IT_DYN赋值
LOOP AT IT_TAB ASSIGNING <WA_TAB>.
CONCATENATE 'VBELN' G_NO INTO L_VBELN. ”像之前那样拼接字段
ASSIGN COMPONENT L_VBELN OF STRUCTURE <WA_DYN> TO <FS1>.
<FS1> = <WA_TAB>-VBELN.
G_NO = G_NO + 1.
ENDLOOP.
APPEND <WA_DYN> TO <IT_DYN>.
输出结果:
此程序实现了一个最基本的ALV动态列输出,如果有更复杂的要求,比如说从VBAP中取得VBELN和MATNR,统计同一VBELN的MATNR数量,并以VBELN,MATNR01,MATNR02,MATNR03...的方式列输出,则取值和赋值逻辑会更加复杂,不过实现原理依然是一样的。