ALV 列表和按钮
效果
源代码
PROGRAM bcalvc_tb_menu_with_def_but. *&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& * Purpose: * ~~~~~~~~ * Append a menu with default button to the standard toolbar. * It is exactly the same as BCALVC_TB_WITH_MENU except for * methods HANDLE_MENU_BUTTON and HANDLE_TOOLBAR. *----------------------------------------------------------------- * To check program behavior * ~~~~~~~~~~~~~~~~~~~~~~~~~ * Select a line and click on the rightmost menu button of the * toolbar. Select 'Flights' to switch to the 'Flights'-Table. * You may switch back by using the same menu. * Remark: * Although the report uses one ALV instance per table, the menu * button is generated by the same event handler. This is * possible by defining it as a CLASS-METHOD. *----------------------------------------------------------------- * Essential steps * ~~~~~~~~~~~~~~~ * 1.Apply steps for event handling for events TOOLBAR, MENU_BUTTON * and USER_COMMAND (see example with print events). * 2.At event TOOLBAR define a toolbar element of type 1 by using * event paramenter E_OBJECT. Remember its function code. * 3.At event MENU_BUTTON query your function code and define a * menu in the same way as a context menu. * 3a.) choose a default function and define the same function code * as used for the menu. * 4.At event USER_COMMAND query the function code of each function * defined in step 3. *&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ********* * Predefine a local class for event handling to allow the * declaration of a reference variable before the class is defined. CLASS lcl_event_receiver DEFINITION DEFERRED. * ********* INCLUDE <icon>. DATA: ok_code LIKE sy-ucomm, gt_spfli TYPE TABLE OF spfli, gt_sflight TYPE TABLE OF sflight, g_repid LIKE sy-repid, g_max type i value 100, gs_layout TYPE lvc_s_layo, gs_toolbar TYPE stb_button, cont_on_100 TYPE scrfname VALUE 'BCALVC_TOOLBAR_D100_C1', cont_on_200 TYPE scrfname VALUE 'BCALVC_TOOLBAR_D200_C1', grid1 TYPE REF TO cl_gui_alv_grid, grid2 TYPE REF TO cl_gui_alv_grid, custom_container1 TYPE REF TO cl_gui_custom_container, custom_container2 TYPE REF TO cl_gui_custom_container. * Set initial dynpro SET SCREEN 100. **************************************************************** * LOCAL CLASSES: Definition **************************************************************** *=============================================================== * class lcl_event_receiver: local class to * define and handle own functions. * * Definition: * ~~~~~~~~~~~ CLASS lcl_event_receiver DEFINITION. PUBLIC SECTION. CLASS-METHODS: handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid IMPORTING e_object e_interactive, handle_menu_button FOR EVENT menu_button OF cl_gui_alv_grid IMPORTING e_object e_ucomm, handle_user_command FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm. PRIVATE SECTION. ENDCLASS. * * lcl_event_receiver (Definition) *=============================================================== **************************************************************** * LOCAL CLASSES: Implementation **************************************************************** *=============================================================== * class lcl_event_receiver (Implementation) * * CLASS lcl_event_receiver IMPLEMENTATION. METHOD handle_toolbar. * § 2.At event TOOLBAR define a toolbar element of type 1 by using * event paramenter E_OBJECT. Remember its function code. *....... * Part I: Define a menu button including a function code that * is evaluated in 'handle_MENU_BUTTON *....... * append a separator to normal toolbar CLEAR gs_toolbar. MOVE 3 TO gs_toolbar-butn_type. APPEND gs_toolbar TO e_object->mt_toolbar. *................... * append a menu with default button (Type 1) * The function code of the default button is the same as * the one for the menu. * If the user klicks on the default button ALV raises * directly event BEFORE_USER_COMMAND * (then USER_COMMAND, AFTER_USER_COMMAND). * If the user klicks on the menu button ALV raises event MENU_BUTTON. CLEAR gs_toolbar. MOVE 'TO_SFLIGHT' TO gs_toolbar-function. * --> This function code is evaluated in 'handle_menu_button' MOVE icon_detail TO gs_toolbar-icon. MOVE 'Flights'(200) TO gs_toolbar-quickinfo. MOVE 1 TO gs_toolbar-butn_type. MOVE space TO gs_toolbar-disabled. APPEND gs_toolbar TO e_object->mt_toolbar. ENDMETHOD. *-------------------------------------------------------------------- METHOD handle_menu_button. * § 3.At event MENU_BUTTON query your function code and define a * menu in the same way as a context menu. *.......... * Part II: Evaluate 'e_ucomm' to see which menu button of the toolbar * has been clicked on. * Define then the corresponding menu. * The menu contains function codes that are evaluated * in 'handle_user_command'. *........... * query e_ucomm to find out which menu button has been clicked on IF e_ucomm = 'TO_SFLIGHT'. CALL METHOD e_object->add_function EXPORTING fcode = 'TO_SPFLI' text = text-100. "Overview * § 3a.) choose a default function and define the same function code * as used for the menu. CALL METHOD e_object->add_function EXPORTING fcode = 'TO_SFLIGHT' text = text-200. "Flights ENDIF. ENDMETHOD. *--------------------------------------------------------------------- METHOD handle_user_command. * § 4.At event USER_COMMAND query the function code of each function * defined in step 3. *......... * Part III : Evaluate user command to invoke the corresponding * function. *......... DATA: lt_rows TYPE lvc_t_row. * get selected row CALL METHOD grid1->get_selected_rows IMPORTING et_index_rows = lt_rows. CALL METHOD cl_gui_cfw=>flush. IF sy-subrc ne 0. * add your handling, for example CALL FUNCTION 'POPUP_TO_INFORM' EXPORTING titel = g_repid txt2 = sy-subrc txt1 = 'Error in Flush'(500). ENDIF. * go to other table CASE e_ucomm. WHEN 'TO_SPFLI'. LEAVE TO SCREEN 100. WHEN 'TO_SFLIGHT'. PERFORM load_sflight_table TABLES lt_rows. CALL SCREEN 200. ENDCASE. ENDMETHOD. "handle_user_command ENDCLASS. * * lcl_event_receiver (Implementation) *=================================================================== *---------------------------------------------------------------------* * FORM EXIT_PROGRAM * *---------------------------------------------------------------------* FORM exit_program. * The instance custom_container2 is freed not until the program * exits from the main screen. * (It is created only once during the first selection of SFLIGHT, * no matter how many times the second window is called). * CALL METHOD custom_container1->free. IF not custom_container2 is initial. CALL METHOD custom_container2->free. ENDIF. CALL METHOD cl_gui_cfw=>flush. IF sy-subrc ne 0. * add your handling, for example CALL FUNCTION 'POPUP_TO_INFORM' EXPORTING titel = g_repid txt2 = sy-subrc txt1 = 'Error in Flush'(500). ENDIF. LEAVE PROGRAM. ENDFORM. *&---------------------------------------------------------------------* *& Module PBO_100 OUTPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE pbo_100 OUTPUT. SET PF-STATUS 'MAIN100'. set titlebar 'MAIN100'. g_repid = sy-repid. IF custom_container1 is initial. * select data from table SPFLI PERFORM select_table_spfli CHANGING gt_spfli. * select data from table SFLIGHT * PERFORM SELECT_TABLE_SFLIGHT CHANGING GT_SFLIGHT. * create a custom container control for our ALV Control CREATE OBJECT custom_container1 EXPORTING container_name = cont_on_100. * create an instance of alv control CREATE OBJECT grid1 EXPORTING i_parent = custom_container1. * * Set a titlebar for the grid control * gs_layout-grid_title = text-100. CALL METHOD grid1->set_table_for_first_display EXPORTING i_structure_name = 'SPFLI' is_layout = gs_layout CHANGING it_outtab = gt_spfli. ******** * ->Create Object to receive events and link them to handler methods. * When the ALV Control raises the event * the corresponding method is automatically called FOR ALL INSTANCES. * (Complies to their definition as CLASS-METHODS). * SET HANDLER lcl_event_receiver=>handle_user_command lcl_event_receiver=>handle_menu_button lcl_event_receiver=>handle_toolbar FOR ALL INSTANCES. * ******** * raise event TOOLBAR: CALL METHOD grid1->set_toolbar_interactive. ENDIF. CALL METHOD cl_gui_control=>set_focus EXPORTING control = grid1. ENDMODULE. " PBO_100 OUTPUT *&---------------------------------------------------------------------* *& Module PAI_100 INPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE pai_100 INPUT. CASE ok_code. WHEN 'EXIT'. PERFORM exit_program. ENDCASE. CLEAR ok_code. ENDMODULE. " PAI_100 INPUT *&---------------------------------------------------------------------* *& Module PBO_200 OUTPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE pbo_200 OUTPUT. SET PF-STATUS 'MAIN100'. g_repid = sy-repid. IF custom_container2 is initial. * data of sflight is already selected! * create a custom container control for our ALV Control CREATE OBJECT custom_container2 EXPORTING container_name = cont_on_200. * create an instance of alv control CREATE OBJECT grid2 EXPORTING i_parent = custom_container2. * * Set a titlebar for the grid control * gs_layout-grid_title = text-200. CALL METHOD grid2->set_table_for_first_display EXPORTING i_structure_name = 'SFLIGHT' is_layout = gs_layout CHANGING it_outtab = gt_sflight. CALL METHOD grid2->set_toolbar_interactive. ELSE. * Since new data has been selected, 'grid2' must be refreshed! CALL METHOD grid2->refresh_table_display. ENDIF. CALL METHOD cl_gui_control=>set_focus EXPORTING control = grid2. ENDMODULE. " PBO_200 OUTPUT *&---------------------------------------------------------------------* *& Module PAI_200 INPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE pai_200 INPUT. CASE ok_code. WHEN 'EXIT'. PERFORM exit_program. ENDCASE. CLEAR ok_code. ENDMODULE. " PAI_200 INPUT *&---------------------------------------------------------------------* *& Form SELECT_TABLE_SFLIGHT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * <--P_GT_SFLIGHT text *----------------------------------------------------------------------* FORM select_table_sflight USING p_ls_spfli LIKE LINE OF gt_spfli CHANGING p_gt_sflight LIKE gt_sflight[]. SELECT * FROM sflight INTO TABLE p_gt_sflight up to g_max rows WHERE carrid = p_ls_spfli-carrid AND connid = p_ls_spfli-connid. ENDFORM. " SELECT_TABLE_SFLIGHT *&---------------------------------------------------------------------* *& Form SELECT_TABLE_SPFLI *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * <--P_GT_SPFLI text *----------------------------------------------------------------------* FORM select_table_spfli CHANGING p_gt_spfli LIKE gt_spfli[]. SELECT * FROM spfli INTO TABLE p_gt_spfli. ENDFORM. " SELECT_TABLE_SPFLI *&---------------------------------------------------------------------* *& Form load_sflight_table *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_LT_ROWS text *----------------------------------------------------------------------* FORM load_sflight_table TABLES p_et_index_rows STRUCTURE lvc_s_row. DATA: ls_selected_line LIKE lvc_s_row, lf_row_index TYPE lvc_index, ls_spfli LIKE LINE OF gt_spfli. CLEAR gt_sflight[]. READ TABLE p_et_index_rows INDEX 1 INTO ls_selected_line. IF sy-subrc eq 0. lf_row_index = ls_selected_line-index. * read selected row from internal table gt_sflight READ TABLE gt_spfli INDEX lf_row_index INTO ls_spfli. * select corresponding lines of table sflight PERFORM select_table_sflight USING ls_spfli CHANGING gt_sflight. ENDIF. ENDFORM. " load_sflight_table
打印
源代码
program bcalvc_print. *&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& * Purpose: * ~~~~~~~~ * This program illustrates how the events for print processing * - PRINT_TOP_OF_PAGE * - PRINT_END_OF_PAGE * - PRINT_TOP_OF_LIST * - PRINT_END_OF_LIST * * are handled. The corresponding handler methods control the * appearance of the list printed. *----------------------------------------------------------------- * To check program behavior * ~~~~~~~~~~~~~~~~~~~~~~~~~ * Print the list shown (It has got only three pages). * Remark: If you choose "Druckansicht" (preview?!) before printing, * the output for event PRINT_END_OF_PAGE is left out due * to scrolling. * Create a spool entry and preview your printout by calling * TA sp01 to reduce paper output please. *----------------------------------------------------------------- * Essential steps (Search for '§') * ~~~~~~~~~~~~~~~ * 1. Define a (local) class for event handling * 2. Define a method for each print event you need. * 3. Implement your event handler methods. Use WRITE to provide output. * 4. Link used print events and event handler methods. * 5. In case of PRINT_END_OF_PAGE, you must set 'reservelns' to * the number of reserved lines at the end of a page. *&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ********* * Predefine a local class for event handling to allow the * declaration of a reference variable. class lcl_event_receiver definition deferred. * ********* data: ok_code like sy-ucomm, g_max type i value 100, gt_sflight type table of sflight, g_repid like sy-repid, gs_print type lvc_s_prnt, gs_layout type lvc_s_layo, mycontainer type scrfname value 'BCALVC_EVENT1_CONT1', * reference to custom container: neccessary to bind ALV Control custom_container type ref to cl_gui_custom_container, grid1 type ref to cl_gui_alv_grid, event_receiver type ref to lcl_event_receiver. * § Step 1. Define a (local) class for event handling **************************************************************** * LOCAL CLASSES: Definition **************************************************************** *=============================================================== * class c_event_receiver: local class to handle print events... * - PRINT_TOP_OF_PAGE (page header) * - PRINT_END_OF_PAGE (page footer) * - PRINT_TOP_OF_LIST (list header) * - PRINT_END_OF_LIST (list footer) * * Definition: * ~~~~~~~~~~~ class lcl_event_receiver definition. public section. * § 2. Define a method for each print event you need. methods: handle_top_of_page for event print_top_of_page of cl_gui_alv_grid, handle_end_of_page for event print_end_of_page of cl_gui_alv_grid, handle_top_of_list for event print_top_of_list of cl_gui_alv_grid, handle_end_of_list for event print_end_of_list of cl_gui_alv_grid. private section. data: pagenum type i. endclass. * * c_event_receiver (Definition) *=============================================================== **************************************************************** * LOCAL CLASSES: Implementation **************************************************************** *=============================================================== * class c_event_receiver (Implementation) * class lcl_event_receiver implementation. *§ 3. Implement your event handler methods. Use WRITE to provide output. method handle_top_of_page. data: tablename(30) type c. perform get_tablename changing tablename. write: /,'Event: PRINT_TOP_OF_PAGE'(001), 'Table: '(002),tablename. endmethod. "handle_top_of_page *------------------------------------------- method handle_end_of_page. data: tablename(30) type c. perform get_tablename changing tablename. add 1 to pagenum. write: /,'Event: PRINT_END_OF_PAGE'(003), text-002,tablename, 'Number of pages so far: '(004), pagenum. endmethod. "handle_end_of_page *------------------------------------------- method handle_top_of_list. data: tablename(30) type c. clear pagenum. perform get_tablename changing tablename. write: /,'Event: PRINT_TOP_OF_LIST'(005), text-002,tablename. endmethod. "handle_top_of_list *------------------------------------------- method handle_end_of_list. data: tablename(30) type c. perform get_tablename changing tablename. write: /,'Event: PRINT_END_OF_LIST'(006), text-002,tablename. endmethod. "handle_end_of_list *------------------------------------------- endclass. * * c_event_receiver (Implementation) *=================================================================== start-of-selection. select * from sflight into table gt_sflight up to g_max rows. * end-of-selection. g_repid = sy-repid. call screen 100. *---------------------------------------------------------------------* * MODULE PBO OUTPUT * *---------------------------------------------------------------------* module pbo output. set pf-status 'MAIN100'. set titlebar 'MAIN100'. if custom_container is initial. * create a custom container control for our ALV Control create object custom_container exporting container_name = mycontainer exceptions cntl_error = 1 cntl_system_error = 2 create_error = 3 lifetime_error = 4 lifetime_dynpro_dynpro_link = 5. if sy-subrc ne 0. * add your handling, for example call function 'POPUP_TO_INFORM' exporting titel = g_repid txt2 = sy-subrc txt1 = 'The control could not be created'(010). endif. * create an instance of alv control create object grid1 exporting i_parent = custom_container. * * Set a titlebar for the grid control * gs_layout-grid_title = 'Flights'(100). * § 5. In case of PRINT_END_OF_PAGE, you must set 'reservelns' to * the number of reserved lines at the end of a page. * * reserve two lines for the PRINT_END_OF_PAGE event * gs_print-reservelns = 2. ******** * ->Create Object to receive events and link them to handler methods. * When the ALV Control raises the event for the specified instance * the corresponding method is automatically called. * ******** * § 4. Link used print events and event handler methods. create object event_receiver. set handler event_receiver->handle_top_of_list for grid1. set handler event_receiver->handle_top_of_page for grid1. set handler event_receiver->handle_end_of_list for grid1. set handler event_receiver->handle_end_of_page for grid1. * call method grid1->set_table_for_first_display exporting i_structure_name = 'SFLIGHT' is_print = gs_print is_layout = gs_layout changing it_outtab = gt_sflight. endif. * Controls are not integrated into the TAB-Order * Call "set_focus" if you want to make sure that 'the cursor' * is active in your control. call method cl_gui_control=>set_focus exporting control = grid1. * Control Framework flushes at the end of PBO automatically! endmodule. *---------------------------------------------------------------------* * MODULE PAI INPUT * *---------------------------------------------------------------------* module pai input. case ok_code. when 'EXIT'. perform exit_program. endcase. clear ok_code. endmodule. *---------------------------------------------------------------------* * FORM EXIT_PROGRAM * *---------------------------------------------------------------------* form exit_program. call method custom_container->free. call method cl_gui_cfw=>flush. if sy-subrc ne 0. * add your handling, for example call function 'POPUP_TO_INFORM' exporting titel = g_repid txt2 = sy-subrc txt1 = 'Error in Flush'(009). endif. leave program. endform. *&---------------------------------------------------------------------* *& Form GET_TABLENAME *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * <--P_TABLENAME text *----------------------------------------------------------------------* form get_tablename changing p_tablename. data: lt_fieldcat type standard table of lvc_s_fcat, ls_fieldcat type lvc_s_fcat. call method grid1->get_frontend_fieldcatalog importing et_fieldcatalog = lt_fieldcat. call method cl_gui_cfw=>flush. if sy-subrc <> 0. p_tablename = 'No tablename in fieldcatalog!'(008). call function 'POPUP_TO_INFORM' exporting titel = g_repid txt2 = p_tablename txt1 = 'Error in Flush'(011). else. read table lt_fieldcat index 1 into ls_fieldcat. p_tablename = ls_fieldcat-ref_table. endif. endform. " GET_TABLENAME