二维码

[动态alv] 一个简单的动态内表alv案例

Twilight发表于 2014-08-01 16:50Timor 最后回复于 2017-06-08 14:52 [复制链接] 2851 1

动态内表的创建和使用主要有以下几点:
1.动态内表的创建,首先要定义动态结构,然后再根据定义的动态结构利用系统一个标准的method:”cl_ALV_table_create=>create_dynamic_table“生成动态内表。
2.动态内表的赋值,遍历动态结构,获取指定的字段,然后给指定的字段赋值。
3.动态内表的读取显示,与赋值相似,遍历动态结构,获取指定的字段,然后读取对应字段的值。

程序代码:
  1. *Type pools declaration for ALV
  2. TYPE-POOLS: slis.                    " ALV Global Types
  3. *data declaration for dynamic internal table and alv
  4. DATA:     l_structure   TYPE REF TO data,
  5.           l_table    TYPE REF TO data,
  6.           struc_desc   TYPE REF TO cl_abap_structdescr,
  7.           lt_layout   TYPE slis_layout_alv,
  8.           ls_lvc_fieldcatalogue  TYPE lvc_s_fcat,
  9.           lt_lvc_fieldcatalogue  TYPE lvc_t_fcat,
  10.           ls_fieldcatalogue TYPE slis_fieldcat_alv,
  11.           lt_fieldcatalogue TYPE slis_t_fieldcat_alv.
  12. *field symbols declaration
  13. FIELD-SYMBOLS :
  14.   <it_table>    TYPE STANDARD TABLE,
  15.   <dyn_str>         TYPE ANY,
  16.   <str_comp> TYPE abap_compdescr.
  17. *declarations for grid title
  18. DATA : t1(30),
  19.        t2(10),
  20.        t3(50).
  21. *selection screen declaration for table input
  22. PARAMETERS : p_table LIKE dd02l-tabname.
  23. *initialization event
  24. INITIALIZATION.
  25. *start of selection event
  26. START-OF-SELECTION.
  27. *texts for grid title
  28.   t1 = 'Dynamic ALV display for table'.
  29.   t2 = p_table.
  30.   CONCATENATE t1 t2 INTO t3 SEPARATED BY space.
  31. * Dynamic creation of a structure
  32.   CREATE DATA l_structure TYPE (p_table).
  33.   ASSIGN l_structure->* TO <dyn_str>.
  34. * Fields Structure
  35.   struc_desc ?= cl_abap_typedescr=>describe_by_data( <dyn_str> ).
  36.   LOOP AT struc_desc->components ASSIGNING <str_comp>.
  37. *   Build Fieldcatalog
  38.     ls_lvc_fieldcatalogue-fieldname = <str_comp>-name.
  39.     ls_lvc_fieldcatalogue-ref_table = p_table.
  40.     APPEND ls_lvc_fieldcatalogue TO lt_lvc_fieldcatalogue.
  41. *   Build Fieldcatalog
  42.     ls_fieldcatalogue-fieldname = <str_comp>-name.
  43.     ls_fieldcatalogue-ref_tabname = p_table.
  44.     APPEND ls_fieldcatalogue TO lt_fieldcatalogue.
  45.   ENDLOOP.

  46. * Create internal table dynamic
  47.   CALL METHOD cl_alv_table_create=>create_dynamic_table
  48.     EXPORTING
  49.       it_fieldcatalog = lt_lvc_fieldcatalogue
  50.     IMPORTING
  51.       ep_table        = l_table.
  52.   ASSIGN l_table->* TO <it_table>.
  53. * Read data from the table selected.
  54.   SELECT * FROM (p_table)
  55.     INTO CORRESPONDING FIELDS OF TABLE <it_table>.
  56. * ALV Layout
  57.   lt_layout-zebra = 'X'.
  58.   lt_layout-colwidth_optimize = 'X'.
  59.   lt_layout-window_titlebar = t3.
  60. *ALV  output
  61.   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  62.     EXPORTING
  63.       is_layout     = lt_layout
  64.       it_fieldcat   = lt_fieldcatalogue
  65.     TABLES
  66.       t_outtab      = <it_table>
  67.     EXCEPTIONS
  68.       program_error = 1
  69.       OTHERS        = 2.
  70.   IF sy-subrc <> 0.
  71. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
  72. *         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  73.   ENDIF.
复制代码


ps:选择屏幕输入一个表名,动态内表的数据不是一次都读到内表在alv显示的,而是随着alv滚动条向下滑动,数据从数据库抽取然后加载到屏幕上
回复

使用道具 举报

Timor
这个厉害了啊
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表