Иногда возникает необходимость работать с динамическими таблицами, т.е с таблицами, столбцы которых определяются в зависимости от каких-либо данных.
Например, нужно выводить только те МВЗ, на которых были затраты определенного вида. Остальные МВЗ не нужны.
Работа c динамической таблицей состоит из следующих этапов:
- Определение перечня столбцов динамической таблицы
- Создание таблицы
- Заполнение таблицы данными
- Вывод таблицы в ALV
Расмотрим каждый шаг по отдельности.
- Определение перечня столбцов динамической таблицы.
Прежде всего заполняем таблицу gt_cols перечнем столбцов, которые будут создаваться динамически. Это может быть по результатам выбранных данных.
Затем в build_fc заполняем таблицу gt_dyn_fcat , где перечисляем статические столбцы ( в примере это LINE и динамические — из таблицы gt_cols.
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 |
" Таблица с перечнем столбцов. Заполняется по результатам собранных данных TYPES: BEGIN OF ts_cols, name TYPE char16, caption TYPE char16, END OF ts_cols. DATA: gt_cols TYPE TABLE OF ts_cols. " Таблица со столбцами для формирования DATA: gt_dyn_fcat TYPE lvc_t_fcat. FORM build_fc. DATA: ls_fcat LIKE LINE OF gt_dyn_fcat, ls_cols LIKE LINE OF gt_cols, lv_pos TYPE i VALUE 0. REFRESH gt_dyn_fcat. lv_pos = lv_pos + 1. ls_fcat-fieldname = 'LINE'. ls_fcat-coltext = 'N'. ls_fcat-col_pos = lv_pos. ls_fcat-key = 'X'. APPEND ls_fcat TO gt_dyn_fcat. CLEAR ls_fcat. LOOP AT gt_cols INTO ls_cols. lv_pos = lv_pos + 1. ls_fcat-fieldname = ls_cols-name. ls_fcat-coltext = ls_cols-caption. ls_fcat-col_pos = lv_pos. ls_fcat-scrtext_s = ls_cols-caption. ls_fcat-scrtext_l = ls_cols-caption. APPEND ls_fcat TO gt_dyn_fcat. CLEAR ls_fcat. ENDLOOP. ENDFORM. |
2. Создание динамической таблицы.
Для создания таблицы воспользуемся методом create_dynamic_table класса cl_alv_table_create.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
DATA : gt_dyn_table TYPE REF TO data, gs_line TYPE REF TO data, gs_line1 TYPE REF TO data. CALL METHOD cl_alv_table_create=>create_dynamic_table EXPORTING i_style_table = 'X' it_fieldcatalog = gt_dyn_fcat IMPORTING ep_table = gt_dyn_table EXCEPTIONS generate_subpool_dir_full = 1 OTHERS = 2. IF sy-subrc EQ 0. ASSIGN gt_dyn_table->* TO <gfs_dyn_table>. CREATE DATA gs_line LIKE LINE OF <gfs_dyn_table>. CREATE DATA gs_line1 LIKE LINE OF <gfs_dyn_table>. ASSIGN gs_line->* TO <gfs_line>. ENDIF. |
3. Заполнение динамической таблицы
Конечно же вся работа с динамическими таблицами будет выполняться через FIELD-SYMBOLS. Прежде чем добавить в таблицу новую строку необходимо назначить <fs> на нужный столбец структуры и поместить нужное значение. Заполнив всю строку можно добавить структуру в таблицу
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 |
FORM fill_table. DATA: ls_cols LIKE LINE OF gt_cols, lv_line TYPE char3. FIELD-SYMBOLS: <fs1>. lv_line = '010'. ASSIGN COMPONENT 'LINE' OF STRUCTURE <gfs_line> TO <fs1>. <fs1> = lv_line. LOOP AT gt_cols INTO ls_cols. ASSIGN COMPONENT ls_cols-name OF STRUCTURE <gfs_line> TO <fs1>. <fs1> = lv_line && ls_cols-caption. ENDLOOP. APPEND <gfs_line> TO <gfs_dyn_table>. lv_line = '020'. ASSIGN COMPONENT 'LINE' OF STRUCTURE <gfs_line> TO <fs1>. <fs1> = lv_line. LOOP AT gt_cols INTO ls_cols. ASSIGN COMPONENT ls_cols-name OF STRUCTURE <gfs_line> TO <fs1>. <fs1> = lv_line && ls_cols-caption. ENDLOOP. APPEND <gfs_line> TO <gfs_dyn_table>. ENDFORM. "fill_table |
4. Вывод динамической таблицы в ALV
В этом примере вывод содержимого таблицы осуществим обычным методом REUSE_ALV_GRID_DISPLAY_LVC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
DATA: ls_layout TYPE lvc_s_layo. ls_layout-zebra = 'X'. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid is_layout_lvc = ls_layout it_fieldcat_lvc = gt_dyn_fcat i_save = 'X' TABLES t_outtab = <gfs_dyn_table> EXCEPTIONS program_error = 1 OTHERS = 2. |
Полный текст программы :
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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
REPORT zzz. TYPE-POOLS : slis. DATA : gw_dyn_fcat TYPE lvc_s_fcat, gt_dyn_fcat TYPE lvc_t_fcat. DATA : gt_dyn_table TYPE REF TO data, gs_line TYPE REF TO data. TYPES: BEGIN OF ts_cols, name TYPE char16, caption TYPE char16, END OF ts_cols. DATA: gt_cols TYPE TABLE OF ts_cols. FIELD-SYMBOLS: <gfs_line>, <gfs_dyn_table> TYPE STANDARD TABLE. START-OF-SELECTION. "фиктивное заполнение данных PERFORM sel_data. "Определение перечня столбцов динамической таблицы PERFORM build_fc. "Создание динамической таблицы PERFORM create_table. "Заполнение динамической таблицы PERFORM fill_table. "Вывод динамической таблицы в ALV PERFORM alv. *&---------------------------------------------------------------------* *& Form sel_data *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM sel_data. DATA: ls_cols TYPE ts_cols. ls_cols-name = 'COL1'. ls_cols-caption = 'Столбец 1'. APPEND ls_cols TO gt_cols. ls_cols-name = 'COL2'. ls_cols-caption = 'Столбец 2'. APPEND ls_cols TO gt_cols. ENDFORM. "sel_data *&---------------------------------------------------------------------* *& Form build_fc *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM build_fc. DATA: ls_fcat LIKE LINE OF gt_dyn_fcat, ls_cols LIKE LINE OF gt_cols, lv_pos TYPE i VALUE 0. REFRESH gt_dyn_fcat. lv_pos = lv_pos + 1. ls_fcat-fieldname = 'LINE'. ls_fcat-outputlen = 3. ls_fcat-coltext = 'N'. ls_fcat-col_pos = lv_pos. ls_fcat-key = 'X'. " ls_fcat-no_out = 'X'. APPEND ls_fcat TO gt_dyn_fcat. CLEAR ls_fcat. LOOP AT gt_cols INTO ls_cols. lv_pos = lv_pos + 1. ls_fcat-fieldname = ls_cols-name. ls_fcat-outputlen = 16. ls_fcat-coltext = ls_cols-caption. ls_fcat-col_pos = lv_pos. ls_fcat-scrtext_s = ls_cols-caption. ls_fcat-scrtext_l = ls_cols-caption. APPEND ls_fcat TO gt_dyn_fcat. CLEAR ls_fcat. ENDLOOP. ENDFORM. "build_fc *&---------------------------------------------------------------------* *& Form fill_table *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM fill_table. DATA: ls_cols LIKE LINE OF gt_cols, lv_line TYPE char3. FIELD-SYMBOLS: <fs1>. lv_line = '010'. ASSIGN COMPONENT 'LINE' OF STRUCTURE <gfs_line> TO <fs1>. <fs1> = lv_line. LOOP AT gt_cols INTO ls_cols. ASSIGN COMPONENT ls_cols-name OF STRUCTURE <gfs_line> TO <fs1>. <fs1> = lv_line && ':' && ls_cols-caption. ENDLOOP. APPEND <gfs_line> TO <gfs_dyn_table>. lv_line = '020'. ASSIGN COMPONENT 'LINE' OF STRUCTURE <gfs_line> TO <fs1>. <fs1> = lv_line. LOOP AT gt_cols INTO ls_cols. ASSIGN COMPONENT ls_cols-name OF STRUCTURE <gfs_line> TO <fs1>. <fs1> = lv_line && ':' && ls_cols-caption. ENDLOOP. APPEND <gfs_line> TO <gfs_dyn_table>. * UNASSIGN <fs1>. ENDFORM. "fill_table *&---------------------------------------------------------------------* *& Form create_table *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM create_table. CALL METHOD cl_alv_table_create=>create_dynamic_table EXPORTING i_style_table = 'X' it_fieldcatalog = gt_dyn_fcat IMPORTING ep_table = gt_dyn_table EXCEPTIONS generate_subpool_dir_full = 1 OTHERS = 2. IF sy-subrc EQ 0. ASSIGN gt_dyn_table->* TO <gfs_dyn_table>. CREATE DATA gs_line LIKE LINE OF <gfs_dyn_table>. ASSIGN gs_line->* TO <gfs_line>. ENDIF. ENDFORM. "create_table *&---------------------------------------------------------------------* *& Form alv *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* FORM alv. DATA: ls_layout TYPE lvc_s_layo. ls_layout-zebra = 'X'. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid is_layout_lvc = ls_layout it_fieldcat_lvc = gt_dyn_fcat i_save = 'X' TABLES t_outtab = <gfs_dyn_table> EXCEPTIONS program_error = 1 OTHERS = 2. ENDFORM. "alv |