【转载】基于动态内表的ALV 实例

本文介绍如何在SAP项目中使用动态内表技术实现ALV列的动态显示,包括通过cl_alv_table_create创建动态内表的具体步骤,以及如何根据需求动态生成列目录并赋值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SAP项目有会要动态显示ALV列的需求,就是ALV的列数量不固定,这是就要用到动态内表的技术,动态内表通过cl_alv_table_create=>create_dynamic_table来创建。

完整代码:

ABAP

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

REPORT ZTEST_ALV_DYNAMIC.

*-------------ALV 相关--------------------------

DATA: wa_layo TYPE lvc_s_layo.

DATA: wa_fcat TYPE lvc_s_fcat,

      it_fcat TYPE lvc_t_fcat.

 

DATA  it_scol TYPE lvc_t_scol.

 

DATA: g_grid TYPE REF TO cl_gui_alv_grid.

 

FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,

               <dyn_wa>,

               <dyn_field>.

 

DATA: dy_table TYPE REF TO data,

      dy_line  TYPE REF TO data.

 

DATA: colname(10),

      index(2).

 

* 列数

PARAMETERS: col TYPE i.

 

CLEAR: it_fcat.

* 根据条件动态生成列catalog

DO col TIMES.

  index = index + 1.

  CONCATENATE 'COL' index INTO colname.

  PERFORM frm_add_fcat USING:

         colname 'C' '描述' '100'.

ENDDO.

 

* 根据it_fact生成动态表

CALL METHOD cl_alv_table_create=>create_dynamic_table

  EXPORTING

    it_fieldcatalog = it_fcat

  IMPORTING

    ep_table        = dy_table.

 

ASSIGN dy_table->* TO <dyn_table>.

 

CREATE DATA dy_line LIKE LINE OF <dyn_table>.

 

ASSIGN dy_line->* TO <dyn_wa>.

 

* 给表字段赋值

CLEAR: index.

DO col TIMES.

  index = index + 1.

  CONCATENATE 'COL' index INTO colname.

  ASSIGN COMPONENT colname OF STRUCTURE <dyn_wa>  TO <dyn_field>.

  <dyn_field> = '列数据'.

ENDDO.

APPEND <dyn_wa> TO <dyn_table>.

 

* 相当于给内表放入两条数据

CLEAR: index.

DO col TIMES.

  index = index + 1.

  CONCATENATE 'COL' index INTO colname.

  ASSIGN COMPONENT colname OF STRUCTURE <dyn_wa> TO <dyn_field>.

  <dyn_field> = '列数据'.

ENDDO.

APPEND <dyn_wa> TO <dyn_table>.

 

CLEAR: wa_layo.

wa_layo-zebra = 'X'.

wa_layo-cwidth_opt = 'X'.

 

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'

  EXPORTING

    i_callback_program = sy-repid

    is_layout_lvc      = wa_layo

    it_fieldcat_lvc    = it_fcat

  TABLES

    t_outtab           = <dyn_table>

  EXCEPTIONS

    program_error      = 1

    OTHERS             = 2.

IF sy-subrc <> 0.

  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

  WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

ENDIF.

 

*&---------------------------------------------------------------------*

*&      Form  frm_add_fcat

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*      -->VALUE1     text

*      -->VALUE2     text

*      -->VALUE3     text

*      -->VALUE4     text

*----------------------------------------------------------------------*

FORM frm_add_fcat USING value1 value2 value3 value4.

  wa_fcat-fieldname = value1.

  wa_fcat-inttype = value2.

  wa_fcat-reptext = value3.

  wa_fcat-intlen   = value4.

  APPEND wa_fcat TO it_fcat.

  CLEAR: wa_fcat.

ENDFORM.                    "frm_add_fcat

运行结果:

选择画面上输入alv显示的列数目,

2017-03-06_10-11-07

运行后,

2017-03-06_10-11-39

<think>我们正在讨论SAP ABAP中如何使用ALV展示动态数据。动态是指在程序运行时才确定其结构(字段数量和类型)的内。在SAP中,ALV(ABAP List Viewer)是展示报数据的常用控件,支持动态的展示。 根据引用[1]和引用[2]的内容,我们可以采用以下方案: 1. 使用CL_SALV_TABLE类来展示动态。 2. 使用CL_SALV_HIERSEQ_TABLE(层次顺序)来展示具有复杂头的动态。 步骤: 1. 创建动态:使用RTTS(运行时类型服务)动态创建内结构。 2. 填充动态数据。 3. 使用ALV展示动态。 下面将详细说明如何实现。 ### 1. 创建动态 动态的创建需要以下步骤: - 定义字段目录(Field Catalog),描述每个字段的名称、类型、长度等。 - 根据字段目录创建动态结构,然后根据结构创建动态。 示例代码: ```abap DATA: lt_fieldcat TYPE lvc_t_fcat, ls_fieldcat LIKE LINE OF lt_fieldcat. " 添加字段到字段目录 ls_fieldcat-fieldname = 'FIELD1'. ls_fieldcat-datatype = 'CHAR'. ls_fieldcat-intlen = 10. APPEND ls_fieldcat TO lt_fieldcat. ls_fieldcat-fieldname = 'FIELD2'. ls_fieldcat-datatype = 'INT4'. APPEND ls_fieldcat TO lt_fieldcat. " 创建动态 DATA: lr_struct TYPE REF TO cl_abap_structdescr, lr_table TYPE REF TO cl_abap_tabledescr, lt_dyntab TYPE REF TO data. " 根据字段目录创建结构类型 CALL METHOD cl_alv_table_create=>create_dynamic_table EXPORTING it_fieldcatalog = lt_fieldcat IMPORTING ep_table = lt_dyntab. " 创建动态的引用 FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE. ASSIGN lt_dyntab->* TO <dyn_table>. ``` ### 2. 填充动态 使用字段符号动态分配内行并赋值。 ```abap DATA: lr_line TYPE REF TO data. CREATE DATA lr_line LIKE LINE OF <dyn_table>. ASSIGN lr_line->* TO FIELD-SYMBOL(<line>). " 添加一行 ASSIGN COMPONENT 'FIELD1' OF STRUCTURE <line> TO FIELD-SYMBOL(<field1>). <field1> = 'Value1'. ASSIGN COMPONENT 'FIELD2' OF STRUCTURE <line> TO FIELD-SYMBOL(<field2>). <field2> = 10. APPEND <line> TO <dyn_table>. ``` ### 3. 使用ALV展示动态 使用CL_SALV_TABLE类展示动态。 ```abap TRY. cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_alv) CHANGING t_table = <dyn_table> ). CATCH cx_salv_msg. ENDTRY. " 显示ALV lo_alv->display( ). ``` ### 4. 使用CL_SALV_HIERSEQ_TABLE展示层次顺序(如果需要双头等复杂结构) 引用[2]提到使用cl_salv_hierseq_table来输出具有双头的ALV。但动态通常使用CL_SALV_TABLE即可。如果需要复杂头,可能需要设置层次结构。 注意:动态ALV显示,字段的标题(如field1)默认是字段名,我们可以通过设置字段目录的文本属性(如seltext_m)来设置列标题。 ### 设置字段文本 在创建字段目录时,可以设置字段的文本描述: ```abap ls_fieldcat-reptext = '字段1'. ls_fieldcat-seltext_m = '字段1'. ``` 或者在ALV对象创建后,通过布局设置列标题: ```abap DATA: lr_columns TYPE REF TO cl_salv_columns_table. lr_columns = lo_alv->get_columns( ). lr_columns->set_optimize( abap_true ). " 自动调整列宽 TRY. DATA(lr_column) = lr_columns->get_column( 'FIELD1' ). lr_column->set_short_text( '字段1' ). lr_column->set_medium_text( '字段1' ). lr_column->set_long_text( '字段1' ). CATCH cx_salv_not_found. ENDTRY. ``` ### 总结 通过以上步骤,我们可以实现动态ALV展示。关键点在于使用RTTS动态创建内结构,然后使用CL_SALV_TABLE来展示数据。 注意:动态ALV展示时,如果字段较多,可能需要调整列宽和设置列标题,以提升可读性。 §§相关问题§§ 1. 如何动态设置ALV的列属性(如颜色、可编辑等)? 2. 如何实现ALV的交互功能(如双击事件)? 3. 动态在性能上有什么需要注意的地方? 4. 如何将动态的数据导出到Excel?</think>### 如何在 SAP 中使用 ALV 展示动态数据 在 SAP ABAP 中,**动态**是指程序运行时才确定字段结构的内部。使用 ALV 展示动态的核心步骤如下: --- #### 1. **创建动态结构** 使用运行时类型服务(RTTS)动态定义内结构: ```abap DATA: lo_struct TYPE REF TO cl_abap_structdescr, lo_table TYPE REF TO cl_abap_tabledescr, lt_dyn_table TYPE REF TO data. " 定义动态字段目录 DATA(lt_fieldcat) = VALUE lvc_t_fcat( ( fieldname = 'MATNR' datatype = 'CHAR' intlen = 18 outputlen = 20 coltext = '物料号' ) ( fieldname = 'MENGE' datatype = 'QUAN' decimals = 3 coltext = '数量' ) ). " 创建动态结构 CALL METHOD cl_alv_table_create=>create_dynamic_table EXPORTING it_fieldcatalog = lt_fieldcat IMPORTING ep_table = lt_dyn_table. ``` --- #### 2. **填充动态数据** 使用字段符号动态赋值: ```abap FIELD-SYMBOLS: <fs_dyn_table> TYPE STANDARD TABLE. ASSIGN lt_dyn_table->* TO <fs_dyn_table>. DATA(ls_row) = VALUE #( ). ASSIGN ls_row->* TO FIELD-SYMBOL(<fs_line>). " 添加数据行 DO 3 TIMES. ASSIGN COMPONENT 'MATNR' OF STRUCTURE <fs_line> TO FIELD-SYMBOL(<fs_matnr>). <fs_matnr> = |M{ sy-index }000|. ASSIGN COMPONENT 'MENGE' OF STRUCTURE <fs_line> TO FIELD-SYMBOL(<fs_menge>). <fs_menge> = sy-index * 10. APPEND <fs_line> TO <fs_dyn_table>. ENDDO. ``` --- #### 3. **使用 ALV 控件展示数据** 通过 `CL_SALV_TABLE` 类显示动态: ```abap TRY. " 创建 ALV 实例 cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_alv) CHANGING t_table = <fs_dyn_table> ). " 设置列标题优化 lo_alv->get_columns( )->set_optimize( abap_true ). " 显示报 lo_alv->display( ). CATCH cx_salv_msg INTO DATA(lx_error). MESSAGE lx_error->get_text( ) TYPE 'E'. ENDTRY. ``` --- #### 4. **关键注意事项** 1. **字段符号(Field Symbols)** 必须使用 `ASSIGN` 语句操作动态,直接数据操作会引发语法错误。 2. **字段目录(Field Catalog)** 字段属性需完整定义(如 `datatype`/`outputlen`),否则 ALV 显示异常[^1]。 3. **性能优化** 对大数据量动态,启用 `set_optimize( )` 自动调整列宽提升性能[^2]。 4. **复杂头支持** 如需双头等复杂布局,可使用 `CL_SALV_HIERSEQ_TABLE` 类[^2]。 --- ### 示例效果 执行后 ALV 输出如下: ``` | 物料号 | 数量 | |----------|------| | M1000 | 10 | | M2000 | 20 | | M3000 | 30 | ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值