ALV动态列内表实现

【博主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...的方式列输出,则取值和赋值逻辑会更加复杂,不过实现原理依然是一样的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ABAP 中,可以使用 ALV Grid 控件的合并单元格功能来实现多行同组的字段内容拼接。 首先,需要使用 CL_SALV_TABLE 类来创建 ALV Grid 控件,例如: ``` DATA(lo_alv) = NEW cl_salv_table( ). ``` 然后,使用 SET_TABLE_FOR_FIRST_DISPLAY 方法将内表传递给 ALV Grid 控件,并设置需要拼接的字段: ``` lo_alv->set_table_for_first_display( EXPORTING i_structure_name = 'TY_TABLE' CHANGING it_outtab = lt_table EXCEPTIONS invalid_parameter_combination = 1 program_error = 2 too_many_lines = 3 OTHERS = 4 ). lo_alv->get_columns( )->set_column_merging( columnname = 'FIELD1' ). lo_alv->get_columns( )->set_column_merging( columnname = 'FIELD2' ). ``` 在以上示例中,TY_TABLE 是需要拼接的内表类型,lt_table 是实际的内表数据。使用 get_columns 方法获取 ALV Grid 控件的列属性,然后使用 set_column_merging 方法设置需要合并单元格的列。在本例中,需要合并 field1 和 field2 两列。 最后,使用 DISPLAY 方法显示 ALV Grid 控件: ``` lo_alv->display( ). ``` 在显示 ALV Grid 控件时,如果有多行同组的数据,ALV Grid 控件会自动将同组的数据合并到一行,并将需要拼接的字段内容拼接成一个字符串,显示在合并后的单元格中。 注意:以上示例中使用了 CL_SALV_TABLE 类来创建 ALV Grid 控件,这是一种比较新的方法,需要在代码中引入相应的类库。在旧的方法中,可以使用 REUSE_ALV_GRID_DISPLAY 函数来显示 ALV Grid 控件,具体实现方式与以上示例类似。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值