SAP Grid control( ALV Grid 列表 自定义 按钮)

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
原文地址:https://www.cnblogs.com/JackeyLove/p/13650355.html