OO ALV 模版
部分代码参考了SAP孙亮(公众号:ABAPer-LL)
一 创建ALV前的所需操作
1. 取数据
这里我们随便取数据
1 SELECT * FROM sflight INTO TABLE @DATA(gt_sflight) 2 UP TO 20 ROWS.
2. 创建屏幕
注意,我们这里使用的是行列200/255 最大值
同时设置容器CONTAINER自动调节 最少行列为10/10,这样屏幕就会根据你的电脑屏幕大小来自动调节了
创建了OK_CODE
3. 添加逻辑流
在逻辑流中打开PBO,PAI的注释,分别创建2个module,同时创建STATUS,TITLE(可选),
status 仅仅需要这3个按钮即可
二 使用ALV 类直接显示
输入以下代码,然后直接点击执行程序
1 REPORT z_tab_test03. 2 DATA ok_code TYPE sy-ucomm. 3 4 SELECT * FROM sflight INTO TABLE @DATA(gt_sflight) 5 UP TO 20 ROWS. 6 7 DATA(cl_oo_alv) = NEW zcl_tab_oo_alv( ). 8 9 CALL METHOD cl_oo_alv->create_oo_alv 10 EXPORTING 11 * iv_repid = SY-CPROG 12 * iv_screen = '9000' 13 * iv_default_ex = 'X' 14 * is_layout = 15 * it_fieldcat = 16 * it_exclude = 17 * iv_split_number = 18 * iv_split_container = 19 iv_container_name = 'CONTAINER' 20 * iv_variant_handle = '1' 21 * i_f4_form = 22 * i_toolbar_form = 23 * i_user_command_form = 24 * i_hotspot_form = 25 * i_datachanged_form = 26 * i_datachanged_finished_form = 27 * i_before_ucomm_form = 28 * i_double_click_form = 29 * i_menu_button_form = 30 CHANGING 31 it_data = gt_sflight. 32 33 CALL SCREEN 9000. 34 *&---------------------------------------------------------------------* 35 *& Module STATUS_9000 OUTPUT 36 *&---------------------------------------------------------------------* 37 *& 38 *&---------------------------------------------------------------------* 39 MODULE status_9000 OUTPUT. 40 SET PF-STATUS 'STATUS'. 41 SET TITLEBAR 'TITLE'. 42 ENDMODULE. 43 *&---------------------------------------------------------------------* 44 *& Module USER_COMMAND_9000 INPUT 45 *&---------------------------------------------------------------------* 46 * text 47 *----------------------------------------------------------------------* 48 MODULE user_command_9000 INPUT. 49 CASE ok_code. 50 WHEN 'EXIT' OR 'BACK'. 51 LEAVE TO SCREEN 0. 52 WHEN 'CANC'. 53 LEAVE PROGRAM. 54 WHEN OTHERS. 55 ENDCASE. 56 CLEAR ok_code. 57 ENDMODULE.
我们就可以看到一个ALV画面了
下面介绍ZCL_TAB_OO_ALV代码- 复制可用
小伙伴们可以直接SE24,创建一个类,然后点击基于源代码创建,然后COPY代码即可
对于方法ZCL_TAB_OO_ALV=>SPLIT_CONTAINER , 可以直接静态调用,将容器切割后,返回多个容器,然后将返回的容器分别调用cl_oo_alv->create_oo_alv方法即可实现多个ALV显示
简单的显示多个ALV代码如下:
1 REPORT z_tab_test03. 2 DATA ok_code TYPE sy-ucomm. 3 4 SELECT * FROM sflight INTO TABLE @DATA(gt_sflight) 5 UP TO 20 ROWS. 6 CHECK sy-subrc EQ 0. 7 SELECT * FROM scarr INTO TABLE @DATA(gt_scarr) 8 FOR ALL ENTRIES IN @gt_sflight 9 WHERE carrid = @gt_sflight-carrid. 10 11 12 CALL METHOD zcl_tab_oo_alv=>split_container 13 EXPORTING 14 iv_container_name = 'CONTAINER' 15 i_row = 1 16 i_col = 2 17 IMPORTING 18 et_container_t = DATA(lt_container_t). 19 20 CHECK lt_container_t IS NOT INITIAL. 21 22 DATA(cl_oo_alv1) = NEW zcl_tab_oo_alv( ). 23 DATA(cl_oo_alv2) = NEW zcl_tab_oo_alv( ). 24 25 26 READ TABLE lt_container_t INTO DATA(ls_container) INDEX 1. 27 IF sy-subrc EQ 0. 28 CALL METHOD cl_oo_alv1->create_oo_alv 29 EXPORTING 30 iv_split_number = 1 31 iv_split_container = ls_container-container 32 CHANGING 33 it_data = gt_sflight. 34 ENDIF. 35 36 READ TABLE lt_container_t INTO ls_container INDEX 2. 37 IF sy-subrc EQ 0. 38 CALL METHOD cl_oo_alv1->create_oo_alv 39 EXPORTING 40 iv_split_number = 2 41 iv_split_container = ls_container-container 42 CHANGING 43 it_data = gt_scarr. 44 ENDIF. 45 46 47 CALL SCREEN 9000.
三 ZCL_TAB_OO_ALV代码如下
1 CLASS zcl_tab_oo_alv DEFINITION 2 PUBLIC 3 CREATE PUBLIC . 4 5 *&=====================================================================* 6 *& Create date: 2021.08.26 7 *& Created by: Tab-Zhu (微信公众号:Tab_JXZHU) 8 *&---------------------------------------------------------------------* 9 PUBLIC SECTION. 10 11 TYPES: 12 BEGIN OF ty_splits, 13 row TYPE i, 14 col TYPE i, 15 container TYPE REF TO cl_gui_container, 16 END OF ty_splits . 17 TYPES: 18 ty_t_splits TYPE TABLE OF ty_splits . 19 20 CONSTANTS gc_a TYPE c VALUE 'A' ##NO_TEXT. 21 CONSTANTS gc_d TYPE c VALUE 'D' ##NO_TEXT. 22 DATA cr_grid TYPE REF TO cl_gui_alv_grid . 23 DATA cr_container TYPE REF TO cl_gui_custom_container . 24 DATA split_n TYPE i . 25 DATA m_repid TYPE progname . 26 DATA m_f4_form TYPE string . " 27 DATA m_toolbar_form TYPE string . 28 DATA m_hotspot_form TYPE string . 29 DATA m_user_command_form TYPE string . 30 DATA m_datachanged_form TYPE string . 31 DATA m_datachanged_finished_form TYPE string . 32 DATA m_before_ucomm_form TYPE string . 33 DATA m_double_click_form TYPE string . 34 DATA m_menu_button_form TYPE string . 35 36 METHODS create_oo_alv 37 IMPORTING 38 VALUE(iv_repid) TYPE progname DEFAULT sy-cprog 39 VALUE(iv_screen) TYPE sy-dynnr DEFAULT '9000' "默认屏幕号码 40 VALUE(iv_default_ex) TYPE char1 DEFAULT 'X' "使用默认的按钮组 41 VALUE(is_layout) TYPE lvc_s_layo OPTIONAL 42 VALUE(it_fieldcat) TYPE lvc_t_fcat OPTIONAL 43 VALUE(it_exclude) TYPE ui_functions OPTIONAL "需要排除的按钮 44 VALUE(iv_split_number) TYPE i OPTIONAL "分割容器号码 45 VALUE(iv_split_container) TYPE REF TO cl_gui_container OPTIONAL "分割容器号码有值时,请传入容器类,必填 46 VALUE(iv_container_name) TYPE char30 OPTIONAL "当分割容器号没有值时,必填 47 VALUE(iv_variant_handle) TYPE disvariant-handle DEFAULT '1' 48 !i_f4_form TYPE string OPTIONAL 49 !i_toolbar_form TYPE string OPTIONAL 50 !i_user_command_form TYPE string OPTIONAL 51 !i_hotspot_form TYPE string OPTIONAL 52 !i_datachanged_form TYPE string OPTIONAL 53 !i_datachanged_finished_form TYPE string OPTIONAL 54 !i_before_ucomm_form TYPE string OPTIONAL 55 !i_double_click_form TYPE string OPTIONAL 56 !i_menu_button_form TYPE string OPTIONAL 57 CHANGING 58 !it_data TYPE STANDARD TABLE . 59 "分割 容器 60 CLASS-METHODS split_container 61 IMPORTING 62 !iv_container_name TYPE char30 63 !i_row TYPE i 64 !i_col TYPE i 65 EXPORTING 66 !et_container_t TYPE ty_t_splits . 67 "设置默认排除按钮-OO ALV 68 CLASS-METHODS default_exclude_func 69 EXPORTING 70 VALUE(it_exclude) TYPE ui_functions . 71 "得到默认字段属性-根据内表 72 CLASS-METHODS get_default_fieldcat 73 CHANGING 74 !it_data TYPE STANDARD TABLE 75 RETURNING 76 VALUE(rt_fieldcat) TYPE lvc_t_fcat 77 EXCEPTIONS 78 error_in_get_fieldcat . 79 "得到默认的Layout 80 CLASS-METHODS get_default_layout 81 RETURNING 82 VALUE(es_layout) TYPE lvc_s_layo . 83 "设置按钮 84 METHODS handle_toolbar 85 FOR EVENT toolbar OF cl_gui_alv_grid 86 IMPORTING 87 !e_object 88 !e_interactive . 89 "设置F4帮助 90 METHODS handle_f4 91 FOR EVENT onf4 OF cl_gui_alv_grid 92 IMPORTING 93 !e_fieldname 94 !e_fieldvalue 95 !es_row_no 96 !er_event_data 97 !et_bad_cells 98 !e_display . 99 "设置热点单击 100 METHODS handle_hotspot 101 FOR EVENT hotspot_click OF cl_gui_alv_grid 102 IMPORTING 103 !e_row_id 104 !e_column_id 105 !es_row_no . 106 METHODS handle_user_command 107 FOR EVENT user_command OF cl_gui_alv_grid 108 IMPORTING 109 !e_ucomm . 110 METHODS handle_datachanged 111 FOR EVENT data_changed OF cl_gui_alv_grid 112 IMPORTING 113 !er_data_changed 114 !e_onf4 115 !e_onf4_before 116 !e_onf4_after 117 !e_ucomm . 118 METHODS handle_datachanged_finished 119 FOR EVENT data_changed_finished OF cl_gui_alv_grid 120 IMPORTING 121 !e_modified 122 !et_good_cells . 123 METHODS handle_before_ucomm 124 FOR EVENT before_user_command OF cl_gui_alv_grid 125 IMPORTING 126 !e_ucomm . 127 METHODS handle_double_click 128 FOR EVENT double_click OF cl_gui_alv_grid 129 IMPORTING 130 !e_row 131 !e_column 132 !es_row_no . 133 METHODS handle_menu_button 134 FOR EVENT menu_button OF cl_gui_alv_grid 135 IMPORTING 136 !e_object 137 !e_ucomm . 138 PROTECTED SECTION. 139 PRIVATE SECTION. 140 ENDCLASS. 141 142 143 144 CLASS ZCL_TAB_OO_ALV IMPLEMENTATION. 145 146 147 * <SIGNATURE>---------------------------------------------------------------------------------------+ 148 * | Instance Public Method ZCL_TAB_OO_ALV->CREATE_OO_ALV 149 * +-------------------------------------------------------------------------------------------------+ 150 * | [--->] IV_REPID TYPE PROGNAME (default =SY-CPROG) 151 * | [--->] IV_SCREEN TYPE SY-DYNNR (default ='9000') 152 * | [--->] IV_DEFAULT_EX TYPE CHAR1 (default ='X') 153 * | [--->] IS_LAYOUT TYPE LVC_S_LAYO(optional) 154 * | [--->] IT_FIELDCAT TYPE LVC_T_FCAT(optional) 155 * | [--->] IT_EXCLUDE TYPE UI_FUNCTIONS(optional) 156 * | [--->] IV_SPLIT_NUMBER TYPE I(optional) 157 * | [--->] IV_SPLIT_CONTAINER TYPE REF TO CL_GUI_CONTAINER(optional) 158 * | [--->] IV_CONTAINER_NAME TYPE CHAR30(optional) 159 * | [--->] IV_VARIANT_HANDLE TYPE DISVARIANT-HANDLE (default ='1') 160 * | [--->] I_F4_FORM TYPE STRING(optional) 161 * | [--->] I_TOOLBAR_FORM TYPE STRING(optional) 162 * | [--->] I_USER_COMMAND_FORM TYPE STRING(optional) 163 * | [--->] I_HOTSPOT_FORM TYPE STRING(optional) 164 * | [--->] I_DATACHANGED_FORM TYPE STRING(optional) 165 * | [--->] I_DATACHANGED_FINISHED_FORM TYPE STRING(optional) 166 * | [--->] I_BEFORE_UCOMM_FORM TYPE STRING(optional) 167 * | [--->] I_DOUBLE_CLICK_FORM TYPE STRING(optional) 168 * | [--->] I_MENU_BUTTON_FORM TYPE STRING(optional) 169 * | [<-->] IT_DATA TYPE STANDARD TABLE 170 * +--------------------------------------------------------------------------------------</SIGNATURE> 171 METHOD create_oo_alv. 172 173 DATA lt_filedcat TYPE lvc_t_fcat. 174 DATA ls_layout TYPE lvc_s_layo. 175 "iv_split_number 176 "判断是否是分割容器 177 IF iv_split_number IS INITIAL. 178 CREATE OBJECT cr_container 179 EXPORTING 180 container_name = iv_container_name. "屏幕上用户自定义控件名 181 * create alv 182 CREATE OBJECT cr_grid 183 EXPORTING 184 i_parent = cr_container. 185 ELSE. 186 "分割容器 187 CREATE OBJECT cr_grid 188 EXPORTING 189 i_parent = iv_split_container. 190 ENDIF. 191 192 CHECK cr_grid IS NOT INITIAL. 193 194 DATA lt_exclude TYPE ui_functions. 195 IF iv_default_ex = 'X'. 196 "使用默认排除按钮 197 CALL METHOD me->default_exclude_func 198 IMPORTING 199 it_exclude = lt_exclude. 200 ENDIF. 201 "手动排除按钮 202 IF it_exclude[] IS NOT INITIAL. 203 APPEND LINES OF it_exclude TO lt_exclude. 204 SORT lt_exclude. 205 DELETE ADJACENT DUPLICATES FROM lt_exclude. 206 ENDIF. 207 "布局 208 IF is_layout IS NOT INITIAL. 209 ls_layout = is_layout. 210 ELSE. 211 ls_layout = me->get_default_layout( ). 212 ENDIF. 213 "字段目录 214 IF it_fieldcat[] IS NOT INITIAL. 215 lt_filedcat = it_fieldcat. 216 ELSE. 217 CALL METHOD me->get_default_fieldcat 218 CHANGING 219 it_data = it_data 220 RECEIVING 221 rt_fieldcat = lt_filedcat 222 EXCEPTIONS 223 error_in_get_fieldcat = 1 224 OTHERS = 2. 225 IF sy-subrc NE 0. 226 MESSAGE e368(00) WITH 'Failed to get fiedlcat' ''. 227 ENDIF. 228 ENDIF. 229 230 "变式布局 231 DATA:ls_disvariant TYPE disvariant. 232 ls_disvariant-report = sy-repid. 233 ls_disvariant-handle = iv_variant_handle. 234 ls_disvariant-username = sy-uname. 235 236 * CALL METHOD 237 CALL METHOD cr_grid->set_table_for_first_display 238 EXPORTING 239 is_variant = ls_disvariant 240 i_default = abap_on 241 i_save = gc_a 242 is_layout = ls_layout 243 it_toolbar_excluding = lt_exclude 244 CHANGING 245 it_outtab = it_data 246 it_fieldcatalog = lt_filedcat. 247 *SET EVENT 248 DEFINE d_set_handler. 249 IF &1 IS SUPPLIED. 250 &2 = &1. 251 SET HANDLER me->&3 FOR cr_grid. 252 ENDIF. 253 END-OF-DEFINITION. 254 255 m_repid = iv_repid. 256 257 "绑定事件 258 d_set_handler: 259 i_f4_form m_f4_form handle_f4, 260 i_toolbar_form m_toolbar_form handle_toolbar, 261 i_user_command_form m_user_command_form handle_user_command, 262 i_hotspot_form m_hotspot_form handle_hotspot, 263 i_datachanged_form m_datachanged_form handle_datachanged, 264 i_datachanged_finished_form m_datachanged_finished_form handle_datachanged_finished, 265 i_before_ucomm_form m_before_ucomm_form handle_before_ucomm, 266 i_double_click_form m_double_click_form handle_double_click, 267 i_menu_button_form m_menu_button_form handle_menu_button. 268 269 * SET HANDLER me->handle_toolbar FOR cr_grid. 270 * SET HANDLER me->handle_datachanged_finished FOR cr_grid. 271 * SET HANDLER me->handle_datachanged FOR cr_grid. 272 * SET HANDLER me->handle_user_command FOR cr_grid. 273 * SET HANDLER me->handle_hotspot FOR cr_grid . 274 275 CALL METHOD cr_grid->set_toolbar_interactive. 276 * register enter event 277 CALL METHOD cr_grid->register_edit_event 278 EXPORTING 279 i_event_id = cl_gui_alv_grid=>mc_evt_enter 280 EXCEPTIONS 281 error = 1 282 OTHERS = 2. 283 IF sy-subrc NE 0. 284 MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 285 sy-msgv2 sy-msgv3 sy-msgv4. 286 ENDIF. 287 288 CALL METHOD cr_grid->register_edit_event "register modify event 289 EXPORTING 290 i_event_id = cl_gui_alv_grid=>mc_evt_modified 291 EXCEPTIONS 292 error = 1 293 OTHERS = 2. 294 IF sy-subrc NE 0. 295 MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 296 sy-msgv2 sy-msgv3 sy-msgv4. 297 ENDIF. 298 299 ENDMETHOD. 300 301 302 * <SIGNATURE>---------------------------------------------------------------------------------------+ 303 * | Static Public Method ZCL_TAB_OO_ALV=>DEFAULT_EXCLUDE_FUNC 304 * +-------------------------------------------------------------------------------------------------+ 305 * | [<---] IT_EXCLUDE TYPE UI_FUNCTIONS 306 * +--------------------------------------------------------------------------------------</SIGNATURE> 307 METHOD default_exclude_func. 308 DATA: ls_exclude TYPE ui_func. 309 ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy . 310 APPEND ls_exclude TO it_exclude. 311 ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row . 312 APPEND ls_exclude TO it_exclude. 313 ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row. 314 APPEND ls_exclude TO it_exclude. 315 ls_exclude = cl_gui_alv_grid=>mc_fc_loc_cut. 316 APPEND ls_exclude TO it_exclude. 317 ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row. 318 APPEND ls_exclude TO it_exclude. 319 ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row. 320 APPEND ls_exclude TO it_exclude. 321 ls_exclude = cl_gui_alv_grid=>mc_fc_loc_move_row. 322 APPEND ls_exclude TO it_exclude. 323 ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste. 324 APPEND ls_exclude TO it_exclude. 325 ls_exclude = cl_gui_alv_grid=>mc_fc_loc_paste_new_row. 326 APPEND ls_exclude TO it_exclude. 327 ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo. 328 APPEND ls_exclude TO it_exclude. 329 ls_exclude = cl_gui_alv_grid=>mc_fc_maximum . 330 APPEND ls_exclude TO it_exclude. 331 ls_exclude = cl_gui_alv_grid=>mc_fc_minimum . 332 APPEND ls_exclude TO it_exclude. 333 * ls_exclude = cl_gui_alv_grid=>mc_fc_view_excel. 334 * append ls_exclude to it_exclude. 335 ls_exclude = cl_gui_alv_grid=>mc_fc_view_lotus . 336 APPEND ls_exclude TO it_exclude. 337 * LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_MB_EXPORT . 338 * APPEND LS_EXCLUDE TO IT_EXCLUDE. 339 ls_exclude = cl_gui_alv_grid=>mc_fc_sum . 340 APPEND ls_exclude TO it_exclude. 341 ls_exclude = cl_gui_alv_grid=>mc_fc_average . 342 APPEND ls_exclude TO it_exclude. 343 * LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_MB_SUBTOT . 344 * APPEND LS_EXCLUDE TO it_exclude. 345 ls_exclude = cl_gui_alv_grid=>mc_fc_check. 346 APPEND ls_exclude TO it_exclude. 347 ls_exclude = cl_gui_alv_grid=>mc_fc_refresh. 348 APPEND ls_exclude TO it_exclude. 349 350 * ls_exclude = '&LOAD'. 351 * append ls_exclude to it_exclude. 352 * LS_EXCLUDE = '&COL0'. 353 * APPEND LS_EXCLUDE TO it_exclude. 354 * LS_EXCLUDE = '&SAVE '. 355 * APPEND LS_EXCLUDE TO it_exclude. 356 * LS_EXCLUDE = '&MAINTAIN '. 357 * APPEND LS_EXCLUDE TO IT_EXCLUDE. 358 ls_exclude = cl_gui_alv_grid=>mc_fc_detail. 359 APPEND ls_exclude TO it_exclude. 360 ls_exclude = cl_gui_alv_grid=>mc_fc_print . 361 APPEND ls_exclude TO it_exclude. 362 ls_exclude = '&INFO'. 363 APPEND ls_exclude TO it_exclude. 364 ls_exclude = '&GRAPH'. 365 APPEND ls_exclude TO it_exclude. 366 ENDMETHOD. 367 368 369 * <SIGNATURE>---------------------------------------------------------------------------------------+ 370 * | Static Public Method ZCL_TAB_OO_ALV=>GET_DEFAULT_FIELDCAT 371 * +-------------------------------------------------------------------------------------------------+ 372 * | [<-->] IT_DATA TYPE STANDARD TABLE 373 * | [<-()] RT_FIELDCAT TYPE LVC_T_FCAT 374 * | [EXC!] ERROR_IN_GET_FIELDCAT 375 * +--------------------------------------------------------------------------------------</SIGNATURE> 376 METHOD get_default_fieldcat. 377 DATA: salv_table TYPE REF TO cl_salv_table. 378 TRY. 379 cl_salv_table=>factory( IMPORTING 380 r_salv_table = salv_table 381 CHANGING 382 t_table = it_data[] ). 383 rt_fieldcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog( 384 r_columns = salv_table->get_columns( ) " ALV Filter 385 r_aggregations = salv_table->get_aggregations( ) " ALV Aggregations 386 ). 387 CATCH cx_root INTO DATA(lx_root). 388 DATA(lv_text) = lx_root->get_text( ). 389 RAISE error_in_get_fieldcat. 390 ENDTRY. 391 392 "当你的内表字段不是参考数据库结构/表创建的时候,F4搜索帮助有图标但是无效 393 "有2种处理方法 394 "1. F4AVAILABL = abap_false 395 "2. 加上:REF_TABLE ,REF_FIELD 396 397 398 ENDMETHOD. 399 400 401 * <SIGNATURE>---------------------------------------------------------------------------------------+ 402 * | Static Public Method ZCL_TAB_OO_ALV=>GET_DEFAULT_LAYOUT 403 * +-------------------------------------------------------------------------------------------------+ 404 * | [<-()] ES_LAYOUT TYPE LVC_S_LAYO 405 * +--------------------------------------------------------------------------------------</SIGNATURE> 406 METHOD get_default_layout. 407 es_layout-sel_mode = gc_d ." 408 es_layout-zebra = abap_on. " 409 es_layout-cwidth_opt = abap_on. " 410 ENDMETHOD. 411 412 413 * <SIGNATURE>---------------------------------------------------------------------------------------+ 414 * | Instance Public Method ZCL_TAB_OO_ALV->HANDLE_BEFORE_UCOMM 415 * +-------------------------------------------------------------------------------------------------+ 416 * | [--->] E_UCOMM LIKE 417 * +--------------------------------------------------------------------------------------</SIGNATURE> 418 METHOD handle_before_ucomm. 419 PERFORM (m_before_ucomm_form) IN PROGRAM (m_repid) IF FOUND 420 USING e_ucomm. 421 *FORM 示例 422 *FORM handle_before_ucomm USING e_ucomm TYPE sy-ucomm. 423 *ENDFORM. "handle_before_ucomm 424 ENDMETHOD. 425 426 427 * <SIGNATURE>---------------------------------------------------------------------------------------+ 428 * | Instance Public Method ZCL_TAB_OO_ALV->HANDLE_DATACHANGED 429 * +-------------------------------------------------------------------------------------------------+ 430 * | [--->] ER_DATA_CHANGED LIKE 431 * | [--->] E_ONF4 LIKE 432 * | [--->] E_ONF4_BEFORE LIKE 433 * | [--->] E_ONF4_AFTER LIKE 434 * | [--->] E_UCOMM LIKE 435 * +--------------------------------------------------------------------------------------</SIGNATURE> 436 METHOD handle_datachanged. 437 PERFORM (m_datachanged_form) IN PROGRAM (m_repid) IF FOUND 438 USING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm. 439 *FORM 示例 440 *FORM handle_datachanged_cpmx USING er_data_changed TYPE REF TO cl_alv_changed_data_protocol 441 * e_onf4 TYPE char01 442 * e_onf4_before TYPE char01 443 * e_onf4_after TYPE char01 444 * e_ucomm TYPE sy-ucomm. 445 * FIELD-SYMBOLS: <ls_cell> TYPE lvc_s_modi. 446 * DATA: ls_cpmx TYPE ty_cpmx, 447 * lt_mod_cells TYPE lvc_t_modi WITH HEADER LINE. 448 * 449 * CLEAR: g_error. 450 * 451 * DEFINE add_protocol_entry. 452 * g_error = 'X'. 453 * call method er_data_changed->add_protocol_entry 454 * exporting 455 * i_msgid = &1 456 * i_msgty = &2 457 * i_msgno = &3 458 * i_msgv1 = &4 459 * i_msgv2 = &5 460 * i_msgv3 = &6 461 * i_msgv4 = &7 462 * i_fieldname = <ls_cell>-fieldname 463 * i_row_id = <ls_cell>-row_id 464 * i_tabix = <ls_cell>-tabix. 465 * END-OF-DEFINITION. 466 * DEFINE modify_cell. 467 * call method er_data_changed->modify_cell 468 * exporting 469 * i_row_id = <ls_cell>-row_id 470 * i_tabix = <ls_cell>-tabix 471 * i_fieldname = &1 472 * i_value = &2. 473 * END-OF-DEFINITION. 474 * 475 * LOOP AT er_data_changed->mt_mod_cells ASSIGNING <ls_cell>. 476 * CASE <ls_cell>-fieldname. 477 * WHEN 'BUKRS'. "公司代码描述 478 * CLEAR gs_t001. 479 * READ TABLE gt_t001 INTO gs_001 WITH KEY bukrs = <ls_cell>-value. 480 * IF sy-subrc <> 0 AND <ls_cell>-value IS NOT INITIAL. 481 * add_protocol_entry: '00' 'E' '001' '公司代码:' <ls_cell>-value '不存在' ''. 482 * ENDIF. 483 * modify_cell: 'BUTXT' gs_001-butxt. 484 * ENDCASE. 485 * ENDLOOP. 486 ENDMETHOD. 487 488 489 * <SIGNATURE>---------------------------------------------------------------------------------------+ 490 * | Instance Public Method ZCL_TAB_OO_ALV->HANDLE_DATACHANGED_FINISHED 491 * +-------------------------------------------------------------------------------------------------+ 492 * | [--->] E_MODIFIED LIKE 493 * | [--->] ET_GOOD_CELLS LIKE 494 * +--------------------------------------------------------------------------------------</SIGNATURE> 495 METHOD handle_datachanged_finished. 496 PERFORM (m_datachanged_finished_form) IN PROGRAM (m_repid) IF FOUND 497 USING e_modified et_good_cells. 498 *FORM 示例 499 *FORM handle_datachanged_finished USING e_modified TYPE char01 500 * et_good_cells TYPE lvc_t_modi. 501 *ENDFORM. "HANDLE_DATACHANGED_FINISHED 502 ENDMETHOD. 503 504 505 * <SIGNATURE>---------------------------------------------------------------------------------------+ 506 * | Instance Public Method ZCL_TAB_OO_ALV->HANDLE_DOUBLE_CLICK 507 * +-------------------------------------------------------------------------------------------------+ 508 * | [--->] E_ROW LIKE 509 * | [--->] E_COLUMN LIKE 510 * | [--->] ES_ROW_NO LIKE 511 * +--------------------------------------------------------------------------------------</SIGNATURE> 512 METHOD handle_double_click. 513 PERFORM (m_double_click_form) IN PROGRAM (m_repid) IF FOUND 514 USING e_row e_column es_row_no. 515 *FORM 示例 516 *FORM handle_double_click USING e_row TYPE lvc_s_row 517 * e_column TYPE lvc_s_col 518 * es_row_no TYPE lvc_s_roid. 519 *ENDFORM. "handle_before_ucomm 520 ENDMETHOD. 521 522 523 * <SIGNATURE>---------------------------------------------------------------------------------------+ 524 * | Instance Public Method ZCL_TAB_OO_ALV->HANDLE_F4 525 * +-------------------------------------------------------------------------------------------------+ 526 * | [--->] E_FIELDNAME LIKE 527 * | [--->] E_FIELDVALUE LIKE 528 * | [--->] ES_ROW_NO LIKE 529 * | [--->] ER_EVENT_DATA LIKE 530 * | [--->] ET_BAD_CELLS LIKE 531 * | [--->] E_DISPLAY LIKE 532 * +--------------------------------------------------------------------------------------</SIGNATURE> 533 METHOD handle_f4. 534 PERFORM (m_f4_form) IN PROGRAM (m_repid) IF FOUND 535 USING e_fieldname e_fieldvalue es_row_no er_event_data et_bad_cells e_display. 536 *FORM 示例 537 *FORM handle_f4 USING e_fieldname TYPE lvc_fname 538 * e_fieldvalue TYPE lvc_value 539 * es_row_no TYPE lvc_s_roid 540 * er_event_data TYPE REF TO cl_alv_event_data 541 * et_bad_cells TYPE lvc_t_modi 542 * e_display TYPE char01. 543 * DATA: ls_row TYPE lvc_s_row, 544 * ls_col TYPE lvc_s_col, 545 * ls_modi TYPE lvc_s_modi, 546 * l_tabname TYPE tabname, 547 * l_fieldtext TYPE fieldtext, 548 * l_ref_table TYPE lvc_rtname, 549 * l_ref_field TYPE lvc_rfname. 550 * FIELD-SYMBOLS: <lt_modi> TYPE lvc_t_modi. 551 * 552 * er_event_data->m_event_handled = 'X'. 553 * 554 * CASE e_fieldname. 555 * WHEN 'TABNAME'. 556 * PERFORM f4_dd_table(rsaqddic) USING 'SAPLAQJD_CNTRL' 557 * '0300' 558 * 'G_DYN_0300-TNAME' 559 * CHANGING e_fieldvalue. "搜索帮助代码,来于SQVI中“插入表”的搜索帮助 560 * WHEN OTHERS. 561 * EXIT. 562 * ENDCASE. 563 * 564 * ASSIGN er_event_data->m_data->* TO <lt_modi>. 565 * ls_modi-row_id = es_row_no-row_id." 566 * ls_modi-fieldname = e_fieldname. 567 * ls_modi-value = e_fieldvalue. 568 * APPEND ls_modi TO <lt_modi>. 569 * IF e_fieldname = 'FIELDNAME'. 570 * ls_modi-row_id = es_row_no-row_id." 571 * ls_modi-fieldname = 'SCRTEXT_L'. 572 * ls_modi-value = l_fieldtext. 573 * APPEND ls_modi TO <lt_modi>. 574 * 575 * ls_modi-row_id = es_row_no-row_id." 576 * ls_modi-fieldname = 'REF_TABLE'. 577 * ls_modi-value = l_ref_table. 578 * APPEND ls_modi TO <lt_modi>. 579 * 580 * ls_modi-row_id = es_row_no-row_id." 581 * ls_modi-fieldname = 'REF_FIELD'. 582 * ls_modi-value = l_ref_field. 583 * APPEND ls_modi TO <lt_modi>. 584 * ENDIF. 585 * 586 *ENDFORM. 587 ENDMETHOD. 588 589 590 * <SIGNATURE>---------------------------------------------------------------------------------------+ 591 * | Instance Public Method ZCL_TAB_OO_ALV->HANDLE_HOTSPOT 592 * +-------------------------------------------------------------------------------------------------+ 593 * | [--->] E_ROW_ID LIKE 594 * | [--->] E_COLUMN_ID LIKE 595 * | [--->] ES_ROW_NO LIKE 596 * +--------------------------------------------------------------------------------------</SIGNATURE> 597 METHOD handle_hotspot. 598 PERFORM (m_hotspot_form) IN PROGRAM (m_repid) IF FOUND 599 USING e_row_id e_column_id es_row_no. 600 *FORM 示例 601 *FORM handle_hotspot USING p_row_id TYPE lvc_s_row 602 * p_column_id TYPE lvc_s_col 603 * p_row_no TYPE lvc_s_roid. 604 * CASE p_column_id-fieldname. 605 * WHEN 'COUNT'. 606 * ENDCASE. 607 *ENDFORM. 608 ENDMETHOD. "handle_hotspot 609 610 611 * <SIGNATURE>---------------------------------------------------------------------------------------+ 612 * | Instance Public Method ZCL_TAB_OO_ALV->HANDLE_MENU_BUTTON 613 * +-------------------------------------------------------------------------------------------------+ 614 * | [--->] E_OBJECT LIKE 615 * | [--->] E_UCOMM LIKE 616 * +--------------------------------------------------------------------------------------</SIGNATURE> 617 METHOD handle_menu_button. 618 PERFORM (m_menu_button_form) IN PROGRAM (m_repid) IF FOUND USING e_object e_ucomm. 619 *FORM 示例 620 *FORM handle_menu_button USING e_object TYPE REF TO cl_ctmenu 621 * e_ucomm TYPE sy-ucomm. 622 * CASE e_ucomm. 623 * WHEN 'MENU'. 624 * CALL METHOD e_object->add_function 625 * EXPORTING 626 * fcode = 'MENU1' 627 * text = '菜单1'. 628 * ENDCASE. 629 *ENDFORM. "handle_menu_button 630 ENDMETHOD. 631 632 633 * <SIGNATURE>---------------------------------------------------------------------------------------+ 634 * | Instance Public Method ZCL_TAB_OO_ALV->HANDLE_TOOLBAR 635 * +-------------------------------------------------------------------------------------------------+ 636 * | [--->] E_OBJECT LIKE 637 * | [--->] E_INTERACTIVE LIKE 638 * +--------------------------------------------------------------------------------------</SIGNATURE> 639 METHOD handle_toolbar. 640 PERFORM (m_toolbar_form) IN PROGRAM (m_repid) IF FOUND USING e_object e_interactive. 641 *FORM 示例 642 *FORM handle_toolbar USING e_object TYPE REF TO cl_alv_event_toolbar_set 643 * e_interactive TYPE char1. 644 * DATA: ls_toolbar TYPE stb_button. 645 * 646 * ls_toolbar-function = 'IMPORT'. 647 * ls_toolbar-icon = icon_import. 648 * ls_toolbar-text = '导入表格字段'. 649 * ls_toolbar-quickinfo = '导入表格字段'. 650 * APPEND ls_toolbar TO e_object->mt_toolbar. 651 * CLEAR: ls_toolbar. 652 * 653 * ls_toolbar-function = 'ALL'. 654 * ls_toolbar-text = '输出:全选'. 655 * ls_toolbar-quickinfo = '全部输出'. 656 * APPEND ls_toolbar TO e_object->mt_toolbar. 657 * CLEAR: ls_toolbar. 658 * 659 * ls_toolbar-function = 'NONE'. 660 * ls_toolbar-text = '输出:取消全选'. 661 * ls_toolbar-quickinfo = '全部不输出'. 662 * APPEND ls_toolbar TO e_object->mt_toolbar. 663 * CLEAR: ls_toolbar. 664 *ENDFORM. 665 ENDMETHOD. 666 667 668 * <SIGNATURE>---------------------------------------------------------------------------------------+ 669 * | Instance Public Method ZCL_TAB_OO_ALV->HANDLE_USER_COMMAND 670 * +-------------------------------------------------------------------------------------------------+ 671 * | [--->] E_UCOMM LIKE 672 * +--------------------------------------------------------------------------------------</SIGNATURE> 673 METHOD handle_user_command. 674 PERFORM (m_user_command_form) IN PROGRAM (m_repid) IF FOUND USING e_ucomm. 675 *FORM 示例 676 *FORM handle_user_command USING e_ucomm TYPE sy-ucomm. 677 * DATA: ok_code TYPE sy-ucomm. 678 * ok_code = e_ucomm. 679 * CLEAR e_ucomm. 680 * 681 * CASE ok_code. 682 * WHEN 'IMPORT'. 683 * go_alv->refresh_table_display( ). 684 * ENDCASE. 685 *ENDFORM. 686 ENDMETHOD. 687 688 689 * <SIGNATURE>---------------------------------------------------------------------------------------+ 690 * | Static Public Method ZCL_TAB_OO_ALV=>SPLIT_CONTAINER 691 * +-------------------------------------------------------------------------------------------------+ 692 * | [--->] IV_CONTAINER_NAME TYPE CHAR30 693 * | [--->] I_ROW TYPE I 694 * | [--->] I_COL TYPE I 695 * | [<---] ET_CONTAINER_T TYPE TY_T_SPLITS 696 * +--------------------------------------------------------------------------------------</SIGNATURE> 697 METHOD split_container. 698 DATA lv_row TYPE i. 699 DATA lv_col TYPE i. 700 DATA ls_splits TYPE ty_splits. 701 DATA(lo_cc) = NEW cl_gui_custom_container( container_name = iv_container_name ). 702 IF lo_cc IS BOUND. 703 DATA(lo_split) = NEW cl_gui_splitter_container( parent = lo_cc rows = i_row columns = i_col ). 704 ENDIF. 705 706 lv_row = 1. 707 lv_col = 1. 708 DO. 709 DATA(lo_split_cc1) = lo_split->get_container( EXPORTING 710 row = lv_row 711 column = lv_col 712 ). 713 CHECK lo_split_cc1 IS BOUND. 714 ls_splits-row = lv_row. 715 ls_splits-col = lv_col. 716 ls_splits-container = lo_split_cc1. 717 APPEND ls_splits TO et_container_t. 718 CLEAR ls_splits. 719 720 IF lv_col < i_col. 721 lv_col = lv_col + 1. 722 ELSE. 723 "lv_col = i_col 724 IF lv_row < i_row. 725 lv_row = lv_row + 1. 726 ELSE. 727 EXIT. 728 ENDIF. 729 ENDIF. 730 CLEAR lo_split_cc1. 731 ENDDO. 732 733 ENDMETHOD. 734 ENDCLASS.
希望对大家的开发有帮助哈