ABAP-树型ALV程序例子
![](https://img2022.cnblogs.com/blog/1858853/202206/1858853-20220628093039019-1316962660.png)
1 PROCESS BEFORE OUTPUT. 2 MODULE pbo . 3 4 PROCESS AFTER INPUT. 5 MODULE pai .
1 REPORT y4_b4_test22. 2 TYPES: BEGIN OF ty_tree_node, 3 id TYPE char18, 4 text TYPE char40, 5 END OF ty_tree_node. 6 7 DATA: g_alv_tree TYPE REF TO cl_gui_alv_tree, 8 g_custom_container TYPE REF TO cl_gui_custom_container. 9 10 DATA: gt_fcat TYPE lvc_t_fcat, 11 gs_fcat TYPE lvc_s_fcat. 12 13 DATA: gs_sflight TYPE sflight , "Output-Table 14 gt_sflight TYPE TABLE OF sflight, 15 gt_scala TYPE STANDARD TABLE OF ty_tree_node, 16 ok_code LIKE sy-ucomm, 17 save_ok LIKE sy-ucomm. "OK-Code 18 19 CLASS lcl_tree_event_receiver DEFINITION. 20 21 PUBLIC SECTION. 22 METHODS handle_node_double_click 23 FOR EVENT node_double_click OF cl_gui_alv_tree 24 IMPORTING node_key sender. 25 METHODS handle_item_double_click 26 FOR EVENT item_double_click OF cl_gui_alv_tree 27 IMPORTING fieldname node_key. 28 29 ENDCLASS. 30 31 CLASS lcl_tree_event_receiver IMPLEMENTATION. 32 33 METHOD handle_node_double_click. 34 35 DATA: lt_children TYPE lvc_t_nkey, 36 ls_children TYPE lvc_nkey. 37 38 "根据点击的结点找出所有的下一个结点 39 CALL METHOD sender->get_children 40 EXPORTING 41 i_node_key = node_key 42 IMPORTING 43 et_children = lt_children. 44 45 IF NOT lt_children IS INITIAL. 46 47 "展开结点 48 CALL METHOD sender->expand_node 49 EXPORTING 50 i_node_key = node_key 51 i_level_count = 2. 52 53 ENDIF. 54 55 ENDMETHOD. 56 57 METHOD handle_item_double_click. 58 DATA: l_value TYPE lvc_value, 59 l_layi TYPE lvc_t_layi, 60 l_layn TYPE lvc_s_layn. 61 62 CALL METHOD g_alv_tree->get_outtab_line 63 EXPORTING 64 i_node_key = node_key 65 IMPORTING 66 e_outtab_line = gs_sflight 67 e_node_text = l_value 68 et_item_layout = l_layi 69 es_node_layout = l_layn 70 EXCEPTIONS 71 node_not_found = 1 72 OTHERS = 2. 73 IF sy-subrc = 0. 74 DATA:mseg TYPE string . 75 mseg = gs_sflight-price . 76 MESSAGE mseg TYPE 'I' . 77 ENDIF. 78 79 ENDMETHOD. 80 81 ENDCLASS. 82 83 END-OF-SELECTION. 84 85 CALL SCREEN 100. 86 87 MODULE pbo OUTPUT. 88 89 SET PF-STATUS 'MAIN100'. 90 SET TITLEBAR 'MAINTITLE' WITH '树型ALV'. 91 92 IF g_alv_tree IS INITIAL. 93 PERFORM init_tree. 94 95 CALL METHOD cl_gui_cfw=>flush 96 EXCEPTIONS 97 cntl_system_error = 1 98 cntl_error = 2. 99 IF sy-subrc NE 0. 100 CALL FUNCTION 'POPUP_TO_INFORM' 101 EXPORTING 102 titel = 'Automation Queue failure'(801) 103 txt1 = 'Internal error:'(802) 104 txt2 = 'A method in the automation queue'(803) 105 txt3 = 'caused a failure.'(804). 106 ENDIF. 107 108 ENDIF. 109 110 ENDMODULE. " PBO OUTPUT 111 112 MODULE pai INPUT. 113 save_ok = ok_code. 114 CLEAR ok_code. 115 116 CASE save_ok. 117 WHEN '&F03' OR '&F12' OR '&F15'. 118 PERFORM exit_program. 119 120 WHEN OTHERS. 121 CALL METHOD cl_gui_cfw=>dispatch. 122 ENDCASE. 123 124 CALL METHOD cl_gui_cfw=>flush. 125 ENDMODULE. " PAI INPUT 126 127 FORM init_tree. 128 DATA: l_tree_container_name(30) TYPE c. 129 l_tree_container_name = 'CCONTAINER1'. 130 131 CREATE OBJECT g_custom_container 132 EXPORTING 133 container_name = l_tree_container_name 134 EXCEPTIONS 135 cntl_error = 1 136 cntl_system_error = 2 137 create_error = 3 138 lifetime_error = 4 139 lifetime_dynpro_dynpro_link = 5. 140 IF sy-subrc <> 0. 141 MESSAGE x208(00) WITH 'ERROR'(100). 142 ENDIF. 143 144 CREATE OBJECT g_alv_tree 145 EXPORTING 146 parent = g_custom_container 147 * node_selection_mode = cl_gui_column_tree=>node_sel_mode_single "单选节点 148 node_selection_mode = cl_gui_column_tree=>node_sel_mode_single "多选节点 149 item_selection = 'X' "能否选中节点上的单个元素 150 no_html_header = 'X' 151 no_toolbar = '' 152 EXCEPTIONS 153 cntl_error = 1 154 cntl_system_error = 2 155 create_error = 3 156 lifetime_error = 4 157 illegal_node_selection_mode = 5 158 failed = 6 159 illegal_column_name = 7. 160 IF sy-subrc <> 0. 161 MESSAGE x208(00) WITH 'ERROR'. "#EC NOTEXT 162 ENDIF. 163 164 DATA l_hierarchy_header TYPE treev_hhdr. 165 PERFORM build_hierarchy_header CHANGING l_hierarchy_header. 166 PERFORM build_fieldcategory. 167 168 CALL METHOD g_alv_tree->set_table_for_first_display 169 EXPORTING 170 "这里可以填SE11的表,填了就参考这个表建fieldcat,下面fieldcat就不用输入参数 171 * i_structure_name = 'SFLIGHT' 172 is_hierarchy_header = l_hierarchy_header 173 CHANGING 174 it_outtab = gt_sflight "table must be empty ! 175 it_fieldcatalog = gt_fcat. "fieldcat 176 177 PERFORM jerry_create_tree. 178 179 CALL METHOD g_alv_tree->update_calculations. 180 PERFORM register_events. 181 182 CALL METHOD g_alv_tree->frontend_update. 183 184 ENDFORM. 185 186 FORM build_fieldcategory . 187 188 CLEAR gs_fcat. 189 gs_fcat-fieldname = 'PRICE'. 190 gs_fcat-seltext = '航空运费'. 191 gs_fcat-coltext = '航空运费'. " 字段输出名称 192 gs_fcat-no_zero = 'X' . 193 gs_fcat-do_sum = 'X' . 194 gs_fcat-h_ftype = 'AVG'. 195 gs_fcat-just = 'L'. 196 gs_fcat-outputlen = '10'. " 输出长度 197 APPEND gs_fcat TO gt_fcat. 198 199 CLEAR gs_fcat. 200 gs_fcat-fieldname = 'CURRENCY'. 201 gs_fcat-seltext = '航线货币'. 202 gs_fcat-coltext = '航线货币'. " 字段输出名称 203 gs_fcat-no_zero = 'X' . 204 gs_fcat-just = 'L'. 205 gs_fcat-outputlen = '10'. " 输出长度 206 APPEND gs_fcat TO gt_fcat. 207 208 CLEAR gs_fcat. 209 gs_fcat-fieldname = 'PLANETYPE'. 210 gs_fcat-seltext = '飞机类型'. 211 gs_fcat-coltext = '飞机类型'. " 字段输出名称 212 gs_fcat-no_zero = 'X' . 213 gs_fcat-just = 'L'. 214 gs_fcat-outputlen = '10'. " 输出长度 215 APPEND gs_fcat TO gt_fcat. 216 217 CLEAR gs_fcat. 218 gs_fcat-fieldname = 'SEATSMAX'. 219 gs_fcat-seltext = '经济舱的最大容量'. 220 gs_fcat-coltext = '经济舱的最大容量'. " 字段输出名称 221 gs_fcat-no_zero = 'X' . 222 gs_fcat-just = 'L'. 223 gs_fcat-outputlen = '10'. " 输出长度 224 APPEND gs_fcat TO gt_fcat. 225 226 CLEAR gs_fcat. 227 gs_fcat-fieldname = 'SEATSOCC'. 228 gs_fcat-seltext = '占据经济舱座位'. 229 gs_fcat-coltext = '占据经济舱座位'. " 字段输出名称 230 gs_fcat-no_zero = 'X' . 231 gs_fcat-just = 'L'. 232 gs_fcat-outputlen = '10'. " 输出长度 233 APPEND gs_fcat TO gt_fcat. 234 235 CLEAR gs_fcat. 236 gs_fcat-fieldname = 'PAYMENTSUM'. 237 gs_fcat-seltext = '总计'. 238 gs_fcat-coltext = '总计'. " 字段输出名称 239 gs_fcat-no_zero = 'X' . 240 gs_fcat-just = 'L'. 241 gs_fcat-outputlen = '10'. " 输出长度 242 APPEND gs_fcat TO gt_fcat. 243 244 CLEAR gs_fcat. 245 gs_fcat-fieldname = 'SEATSMAX_B'. 246 gs_fcat-seltext = '商务舱的最大容量'. 247 gs_fcat-coltext = '商务舱的最大容量'. " 字段输出名称 248 gs_fcat-no_zero = 'X' . 249 gs_fcat-just = 'L'. 250 gs_fcat-outputlen = '10'. " 输出长度 251 APPEND gs_fcat TO gt_fcat. 252 253 CLEAR gs_fcat. 254 gs_fcat-fieldname = 'SEATSOCC_B'. 255 gs_fcat-seltext = '占据商务舱座位'. 256 gs_fcat-coltext = '占据商务舱座位'. " 字段输出名称 257 gs_fcat-no_zero = 'X' . 258 gs_fcat-just = 'L'. 259 gs_fcat-outputlen = '10'. " 输出长度 260 APPEND gs_fcat TO gt_fcat. 261 262 CLEAR gs_fcat. 263 gs_fcat-fieldname = 'SEATSMAX_F'. 264 gs_fcat-seltext = '头等舱的最大容量'. 265 gs_fcat-coltext = '头等舱的最大容量'. " 字段输出名称 266 gs_fcat-no_zero = 'X' . 267 gs_fcat-just = 'L'. 268 gs_fcat-outputlen = '10'. " 输出长度 269 APPEND gs_fcat TO gt_fcat. 270 271 CLEAR gs_fcat. 272 gs_fcat-fieldname = 'SEATSOCC_F'. 273 gs_fcat-seltext = '占据头等舱座位'. 274 gs_fcat-coltext = '占据头等舱座位'. " 字段输出名称 275 gs_fcat-no_zero = 'X' . 276 gs_fcat-just = 'L'. 277 gs_fcat-outputlen = '10'. " 输出长度 278 APPEND gs_fcat TO gt_fcat. 279 280 ENDFORM. 281 282 FORM jerry_create_tree. 283 DATA: p_relat_key TYPE lvc_nkey, 284 p_node_key1 TYPE lvc_nkey, 285 p_node_key2 TYPE lvc_nkey, 286 p_node_key3 TYPE lvc_nkey, 287 l_node_text TYPE lvc_value, 288 lv_line TYPE i. 289 290 SELECT * 291 INTO CORRESPONDING FIELDS OF TABLE gt_sflight 292 FROM sflight . 293 294 SORT gt_sflight BY carrid connid fldate . 295 296 lv_line = lines( gt_sflight ) . 297 298 LOOP AT gt_sflight ASSIGNING FIELD-SYMBOL(<fs_sflight>) FROM 0 TO lv_line . 299 300 AT NEW carrid . 301 302 CLEAR l_node_text . 303 l_node_text = <fs_sflight>-carrid . 304 * CALL FUNCTION 'CONVERSION_EXIT_ABPSN_OUTPUT' 305 * EXPORTING 306 * input = <fs_sflight>-carrid 307 * IMPORTING 308 * output = l_node_text. 309 310 CALL METHOD g_alv_tree->add_node 311 EXPORTING 312 i_relat_node_key = p_relat_key 313 i_relationship = cl_gui_column_tree=>relat_last_child 314 i_node_text = l_node_text 315 * is_outtab_line = <fs_sflight> 316 IMPORTING 317 e_new_node_key = p_node_key1. 318 319 ENDAT . 320 321 AT NEW connid . 322 323 CLEAR l_node_text . 324 l_node_text = <fs_sflight>-connid . 325 326 CALL METHOD g_alv_tree->add_node 327 EXPORTING 328 i_relat_node_key = p_node_key1 329 i_relationship = cl_gui_column_tree=>relat_last_child 330 i_node_text = l_node_text 331 * is_outtab_line = <fs_sflight> 332 IMPORTING 333 e_new_node_key = p_node_key2. 334 335 ENDAT . 336 337 CLEAR l_node_text . 338 l_node_text = <fs_sflight>-fldate . 339 340 CALL METHOD g_alv_tree->add_node 341 EXPORTING 342 i_relat_node_key = p_node_key2 343 i_relationship = cl_gui_column_tree=>relat_last_child 344 i_node_text = l_node_text 345 is_outtab_line = <fs_sflight> 346 IMPORTING 347 e_new_node_key = p_node_key3. 348 349 ENDLOOP . 350 351 ENDFORM. 352 353 FORM build_hierarchy_header CHANGING p_hierarchy_header TYPE treev_hhdr. 354 355 p_hierarchy_header-heading = '航班/航线号/日期'(300)."名称 356 p_hierarchy_header-tooltip = '停留显示'(400)."停留时显示 357 p_hierarchy_header-width = 30. 358 p_hierarchy_header-width_pix = ' '. 359 360 ENDFORM. 361 362 FORM exit_program. 363 364 CALL METHOD g_custom_container->free. 365 LEAVE PROGRAM. 366 367 ENDFORM. 368 369 FORM register_events . 370 DATA: lt_events TYPE cntl_simple_events, 371 l_event TYPE cntl_simple_event, 372 l_event_receiver TYPE REF TO lcl_tree_event_receiver. 373 374 CALL METHOD g_alv_tree->get_registered_events 375 IMPORTING 376 events = lt_events. 377 378 l_event-eventid = cl_gui_column_tree=>eventid_node_double_click. 379 APPEND l_event TO lt_events. 380 l_event-eventid = cl_gui_column_tree=>eventid_item_double_click. 381 APPEND l_event TO lt_events. 382 383 CALL METHOD g_alv_tree->set_registered_events 384 EXPORTING 385 events = lt_events 386 EXCEPTIONS 387 cntl_error = 1 388 cntl_system_error = 2 389 illegal_event_combination = 3. 390 IF sy-subrc <> 0. 391 MESSAGE x208(00) WITH 'ERROR'. "#EC NOTEXT 392 ENDIF. 393 394 CREATE OBJECT l_event_receiver. 395 SET HANDLER l_event_receiver->handle_node_double_click FOR g_alv_tree. 396 SET HANDLER l_event_receiver->handle_item_double_click FOR g_alv_tree. 397 398 ENDFORM. " register_events