ABAP OO ALV 示例模板

简单ALV 显示示例

*&---------------------------------------------------------------------*
*& Report ZTRCKTRSR_ALV_AUTOSUMME2
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztrcktrsr_alv_autosumme2.

PARAMETERS p_total TYPE p DECIMALS 2.

CLASS lcl_autosumme DEFINITION.
  PUBLIC SECTION.
    INTERFACES if_alv_rm_grid_friend .
    CLASS-METHODS register IMPORTING ir_grid TYPE REF TO cl_gui_alv_grid.
  PROTECTED SECTION.
    CLASS-METHODS handle_delayed_selection
      FOR EVENT delayed_changed_sel_callback
                  OF cl_gui_alv_grid
      IMPORTING sender.
ENDCLASS.

CLASS lcl_autosumme IMPLEMENTATION.
  METHOD register.
    "Set handler
    SET HANDLER handle_delayed_selection FOR ir_grid.
    "set delayed selection time
    ir_grid->set_delay_change_selection( time = 100 ). " Time in Milliseconds
    "register event for delayed selection
    ir_grid->register_delayed_event( ir_grid->mc_evt_delayed_change_select ).

  ENDMETHOD.

  METHOD handle_delayed_selection.

    "Local data
    DATA lt_cells TYPE lvc_t_cell.
    DATA ls_cell LIKE LINE OF lt_cells.
    DATA lv_total TYPE p DECIMALS 2.
    DATA lv_val_type TYPE c.
    DATA lv_index TYPE n LENGTH 2.
    DATA lv_tablename TYPE string.
    DATA lt_grouplevels TYPE lvc_t_grpl.
    DATA ls_grouplevel LIKE LINE OF lt_grouplevels.

    FIELD-SYMBOLS <ref_data> TYPE REF TO data.
    FIELD-SYMBOLS <table> TYPE table.
    FIELD-SYMBOLS <warea> TYPE any.
    FIELD-SYMBOLS <val> TYPE any.

    "data references to sub totals tables
    DATA ld_ct01 TYPE REF TO data.
    DATA ld_ct02 TYPE REF TO data.
    DATA ld_ct03 TYPE REF TO data.
    DATA ld_ct04 TYPE REF TO data.
    DATA ld_ct05 TYPE REF TO data.
    DATA ld_ct06 TYPE REF TO data.
    DATA ld_ct07 TYPE REF TO data.
    DATA ld_ct08 TYPE REF TO data.
    DATA ld_ct09 TYPE REF TO data.

    "get selected cells (selection via CTRL + Y)
    sender->get_selected_cells( IMPORTING et_cell = lt_cells ).

    "If there is only one cell selected, we do not need to sum that...
    CHECK lines( lt_cells ) > 1.

    "Read all cell values
    LOOP AT lt_cells INTO ls_cell.

      "in case of rowtype (normal cell, total or subtotal) assign correct data table
      CASE ls_cell-row_id-rowtype(1).
          "Total sum of all
        WHEN 'T'.
          ASSIGN sender->mt_ct00 TO <ref_data>.
          ls_cell-row_id-index = 1.
          "subtotals
        WHEN 'S'.
          sender->get_subtotals( IMPORTING
          ep_collect01 = ld_ct01
          ep_collect02 = ld_ct02
          ep_collect03 = ld_ct03
          ep_collect04 = ld_ct04
          ep_collect05 = ld_ct05
          ep_collect06 = ld_ct06
          ep_collect07 = ld_ct07
          ep_collect08 = ld_ct08
          ep_collect09 = ld_ct09
          et_grouplevels = lt_grouplevels ).

          lv_index = ls_cell-row_id-rowtype+4(2).
          lv_tablename = 'LD_CT' && lv_index.
          ASSIGN (lv_tablename) TO <ref_data>.

          READ TABLE lt_grouplevels INTO ls_grouplevel INDEX ls_cell-row_id-index.
          IF sy-subrc = 0.
            ls_cell-row_id-index = ls_grouplevel-cindx_from.
          ENDIF.
          "Normal cell value
        WHEN space.
          ASSIGN sender->mt_outtab TO <ref_data>.
      ENDCASE.

      "assign specified data table
      ASSIGN <ref_data>->* TO <table>.

      "Only read table line when index changes
      AT NEW row_id.
        READ TABLE <table> ASSIGNING <warea> INDEX ls_cell-row_id-index.
      ENDAT.
      "Assign selected fieldname of workarea
      ASSIGN COMPONENT ls_cell-col_id OF STRUCTURE <warea> TO <val>.
      IF sy-subrc = 0.
        "check correct type of field: Only numeric fields will be taken
        DESCRIBE FIELD <val> TYPE lv_val_type.
        CASE lv_val_type.
          WHEN 'P' "Packed
          OR 'N' "Numchar
          OR 'b' "Integer
          OR 'a' "decfloat
          OR 'e' "decfloat
          OR 'F'. "Float?
            "add cell value to total
            ADD <val> TO lv_total.
        ENDCASE.
      ENDIF.
    ENDLOOP.

    IF lv_total IS NOT INITIAL.
      "There were numeric fields selected and therefor we have a total to show:
      MESSAGE s000(oo) WITH 'TOTAL:' space lv_total.
      p_total = lv_total.
    ENDIF.
  ENDMETHOD.

ENDCLASS.

CLASS lcl_main DEFINITION.

  PUBLIC SECTION.
* INTERFACES if_alv_rm_grid_friend .
    METHODS start.
  PROTECTED SECTION.
    DATA mr_grid TYPE REF TO cl_gui_alv_grid.
    DATA mt_data TYPE STANDARD TABLE OF spfli.
    DATA mv_data_table TYPE tabname VALUE 'SPFLI'.
    DATA mr_dock TYPE REF TO cl_gui_docking_container.
    METHODS create_docker.
    METHODS create_grid.
    METHODS select_data.
    METHODS register_autosumme.
ENDCLASS.

CLASS lcl_main IMPLEMENTATION.

  METHOD start.
    select_data( ).
    create_docker( ).
    create_grid( ).
    register_autosumme( ).
  ENDMETHOD.

  METHOD create_docker.
    "Create Docking container at bottom
    CREATE OBJECT mr_dock
      EXPORTING
        side                    = cl_gui_docking_container=>dock_at_bottom
        ratio                   = 90
        no_autodef_progid_dynnr = abap_false.

  ENDMETHOD.

  METHOD create_grid.
    "Create ALV-Grid
    CREATE OBJECT mr_grid
      EXPORTING
        i_appl_events = abap_true
        i_parent      = mr_dock.

    "and display data
    mr_grid->set_table_for_first_display(
    EXPORTING
    i_structure_name = mv_data_table
    CHANGING
    it_outtab = mt_data ).

    "Set focus on grid so user can directly scroll and select cells via CTRL+Y
    cl_gui_container=>set_focus( mr_grid ).

  ENDMETHOD.

  METHOD select_data.
    "Select data
    SELECT * FROM (mv_data_table) INTO TABLE mt_data UP TO 100 ROWS.
  ENDMETHOD.

  METHOD register_autosumme.
    lcl_autosumme=>register( mr_grid ).
  ENDMETHOD.

ENDCLASS.

INITIALIZATION.
  DATA(gr_main) = NEW lcl_main( ).
  gr_main->start( ).

OO ALV  分屏展示例子

*&---------------------------------------------------------------------*
*& Report ZTRCKTRSR_ALV_FAST_LAYOUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztrcktrsr_alv_fast_layout.

"http://www.tricktresor.de/blog/grid-mit-variantenschnellzugriff-menue/

* BESCHREIBUNG
* ============
* Das Programm enthält eine Klasse, mit deren Hilfe vier durch einen
* Splitter getrennte ALV-Grids angezeigt werden
* Es können Varianten abgespeichert werden, die dann als Schnellzugriff
* mit einem Menü in der Toolbar aktiviert werden.


*** Class Application
CLASS lcl_main DEFINITION DEFERRED.

DATA gv_matnr    TYPE matnr.
DATA gt_mara     TYPE STANDARD TABLE OF mara.
DATA gt_marc     TYPE STANDARD TABLE OF marc.


SELECT-OPTIONS s_matnr FOR gv_matnr.

*----------------------------------------------------------------------*
*       CLASS lcl_main DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_main DEFINITION.

  PUBLIC SECTION.

    DATA gr_grid    TYPE REF TO            cl_gui_alv_grid.
    DATA gr_cont    TYPE REF TO            cl_gui_container.
    DATA gs_variant TYPE                   disvariant.
    DATA gs_layout  TYPE                   lvc_s_layo.
    DATA gv_table   TYPE                   text80.

    DATA ls_toolbar       TYPE stb_button.
    DATA ls_variant       TYPE disvariant.

*** Variants
    DATA lt_ltdx          TYPE STANDARD TABLE OF ltdx.

*** Variant texts
    DATA lt_ltdxt         TYPE STANDARD TABLE OF ltdxt.

    METHODS:

*** constructor
      constructor
        IMPORTING i_handle    TYPE c
                  i_container TYPE REF TO cl_gui_container
                  i_title     TYPE lvc_title
                  i_table     TYPE c,

*** event for menu button
      handle_menu_button
                    FOR EVENT menu_button OF cl_gui_alv_grid
        IMPORTING e_object e_ucomm sender,

*** event for double click
      handle_double_click
                    FOR EVENT double_click OF cl_gui_alv_grid
        IMPORTING e_row e_column es_row_no sender,

*** event for adding buttons to toolbar
      handle_toolbar
                    FOR EVENT toolbar OF cl_gui_alv_grid
        IMPORTING e_object e_interactive sender,

*** event for pressed buttons
      handle_user_command
                    FOR EVENT user_command OF cl_gui_alv_grid
        IMPORTING e_ucomm sender.

ENDCLASS.                    "lcl_event_receiver DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_main IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_main IMPLEMENTATION.

  METHOD constructor.

    FIELD-SYMBOLS <outtab> TYPE STANDARD TABLE.

    gv_table = i_table.
    ASSIGN (gv_table) TO <outtab>.
    CHECK sy-subrc = 0.

*** Create ALV Grid
    CREATE OBJECT gr_grid
      EXPORTING
        i_parent = i_container.

*** Set variant
    CLEAR gs_variant.
    gs_variant-report    = sy-repid.
    gs_variant-handle    = i_handle.
    gs_variant-username  = sy-uname.

*** Layout
    gs_layout-grid_title = i_title.
    gs_layout-no_toolbar = ' '.

*** Set display
    CALL METHOD gr_grid->set_table_for_first_display
      EXPORTING
        i_structure_name = i_handle
        is_variant       = gs_variant
        i_save           = 'A'
        i_default        = 'X'
        is_layout        = gs_layout
      CHANGING
        it_outtab        = <outtab>
      EXCEPTIONS
        OTHERS           = 4.

**** Create event handler for grid
    SET HANDLER handle_user_command
    handle_toolbar
    handle_double_click
    handle_menu_button
    FOR gr_grid.

*** set toolbar interactive
    CALL METHOD gr_grid->set_toolbar_interactive.

  ENDMETHOD.                    "constructor

  METHOD handle_double_click.

    FIELD-SYMBOLS <outtab> TYPE STANDARD TABLE.
    FIELD-SYMBOLS <outwa>  TYPE any.
    FIELD-SYMBOLS <value>  TYPE any.

    ASSIGN (gv_table) TO <outtab>.
    CHECK sy-subrc = 0.

    CASE e_column.
      WHEN 'MATNR'.
        READ TABLE <outtab> ASSIGNING <outwa> INDEX es_row_no-row_id.
        IF sy-subrc = 0.
          ASSIGN COMPONENT e_column OF STRUCTURE <outwa> TO <value>.
          IF sy-subrc = 0.
            SET PARAMETER ID 'MAT' FIELD <value>.
            CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
          ENDIF.
        ENDIF.
    ENDCASE.

  ENDMETHOD.                    "handle_double_click

  METHOD handle_toolbar.

    FIELD-SYMBOLS <ltdx>  TYPE ltdx.
    FIELD-SYMBOLS <ltdxt> TYPE ltdxt.

**** Get actual variant
    CALL METHOD sender->get_variant
      IMPORTING
        es_variant = ls_variant.

*** Read existing variants
    SELECT * FROM ltdx INTO TABLE lt_ltdx UP TO 10 ROWS
    WHERE relid  = 'LT'
    AND report = gs_variant-report
    AND handle = gs_variant-handle
    AND srtf2  = 0
    AND ( username = space
    OR  username = sy-uname )
    ORDER BY username variant.

    IF sy-subrc = 0.
*** add Separator to toolbar
      ls_toolbar-function  = 'DUMMY'.
      ls_toolbar-butn_type = '3'.
      APPEND ls_toolbar TO e_object->mt_toolbar.

*** Get variant texts
      SELECT * FROM ltdxt INTO TABLE lt_ltdxt
      FOR ALL ENTRIES IN lt_ltdx
      WHERE relid  = 'LT'
      AND report = gs_variant-report
      AND handle = gs_variant-handle
      AND variant = lt_ltdx-variant
      AND langu = sy-langu.

*** Check if there are global variants...
      READ TABLE lt_ltdx TRANSPORTING NO FIELDS
      WITH KEY username = space.
      IF sy-subrc = 0.
*** add menu "GLOBAL" to toolbar
        CLEAR ls_toolbar.
        IF ls_variant-variant IS NOT INITIAL AND
        ls_variant-variant(1) = '/'.
*** If variant is actually set: Display name of variant
          READ TABLE lt_ltdxt ASSIGNING <ltdxt>
          WITH KEY username = space
          variant  = ls_variant-variant.
          IF sy-subrc = 0.
            ls_toolbar-text = <ltdxt>-text.
          ENDIF.
        ENDIF.
        ls_toolbar-function  = 'GLOBAL'.
        ls_toolbar-icon      = icon_bw_gis.
        ls_toolbar-butn_type = '2'.
        APPEND ls_toolbar TO e_object->mt_toolbar.
      ENDIF.

*** Check if there are user specific variants...
      READ TABLE lt_ltdx TRANSPORTING NO FIELDS
      WITH KEY username = sy-uname.
      IF sy-subrc = 0.
*** add menu "USER SPECIFIC" to toolbar
        CLEAR ls_toolbar.
        IF ls_variant-variant IS NOT INITIAL AND
        ls_variant-variant(1) <> '/'.
*** If variant is actually set: Display name of variant
          READ TABLE lt_ltdxt ASSIGNING <ltdxt>
          WITH KEY username = sy-uname
          variant  = ls_variant-variant.
          IF sy-subrc = 0.
            ls_toolbar-text = <ltdxt>-text.
          ENDIF.
        ENDIF.
        ls_toolbar-function  = 'USER'.
        ls_toolbar-icon      = icon_usergroup.
        ls_toolbar-butn_type = '2'.
        APPEND ls_toolbar TO e_object->mt_toolbar.
      ENDIF.
    ENDIF.

  ENDMETHOD.                    "handle_toolbar

  METHOD handle_user_command.
*** Set chosen variant

    FIELD-SYMBOLS <ltdx>  TYPE ltdx.
    FIELD-SYMBOLS <ltdxt> TYPE ltdxt.

*** data
    DATA lv_user_specific TYPE c.
    DATA ls_variant       TYPE disvariant.
    DATA ls_stable        TYPE lvc_s_stbl.
    DATA lt_fieldcat      TYPE  lvc_t_fcat.
    DATA lt_sort          TYPE  lvc_t_sort.
    DATA lt_filter        TYPE  lvc_t_filt.
    DATA ls_layout        TYPE  lvc_s_layo.

*** Variant
    CLEAR ls_variant.
    ls_variant-variant = e_ucomm.
    SHIFT ls_variant-variant LEFT BY 1 PLACES.
    ls_variant-report    = gs_variant-report.
    ls_variant-handle    = gs_variant-handle.
    IF ls_variant-variant(1) <> '/'.
      ls_variant-username  = sy-uname.
      lv_user_specific     = 'X'.
    ENDIF.
    CALL METHOD sender->get_frontend_fieldcatalog
      IMPORTING
        et_fieldcatalog = lt_fieldcat.

    CALL FUNCTION 'LVC_VARIANT_SELECT'
      EXPORTING
        i_dialog            = space
        i_user_specific     = lv_user_specific
        it_default_fieldcat = lt_fieldcat
      IMPORTING
        et_fieldcat         = lt_fieldcat
        et_sort             = lt_sort
        et_filter           = lt_filter
      CHANGING
        cs_variant          = ls_variant
      EXCEPTIONS
        wrong_input         = 1
        fc_not_complete     = 2
        not_found           = 3
        program_error       = 4
        data_missing        = 5
        OTHERS              = 6.
    IF sy-subrc = 0.
      CALL METHOD sender->set_variant( ls_variant ).
      CALL METHOD sender->set_frontend_fieldcatalog( lt_fieldcat ).
      CALL METHOD sender->set_filter_criteria( lt_filter ).
      CALL METHOD sender->set_sort_criteria( lt_sort ).
      ls_stable = 'XX'.
      CALL METHOD sender->refresh_table_display
        EXPORTING
          is_stable      = ls_stable
          i_soft_refresh = space.
    ENDIF.

  ENDMETHOD.                           "handle_user_command

  METHOD handle_menu_button.

    DATA lv_fcode         TYPE ui_func.
    DATA lv_text          TYPE gui_text.
    DATA lv_disable       TYPE c.
    DATA lv_checked       TYPE c.
    DATA lv_username      TYPE syuname.

    FIELD-SYMBOLS <ltdx>  TYPE ltdx.
    FIELD-SYMBOLS <ltdxt> TYPE ltdxt.

    CASE e_ucomm.
      WHEN 'GLOBAL'.
        lv_username = space.
      WHEN 'USER'.
        lv_username = sy-uname.
      WHEN OTHERS.
        EXIT.
    ENDCASE.

*** Get actual variant
    CALL METHOD sender->get_variant
      IMPORTING
        es_variant = ls_variant.

    LOOP AT lt_ltdx ASSIGNING <ltdx> WHERE username = lv_username.
*... get variant text
      READ TABLE lt_ltdxt ASSIGNING <ltdxt>
      WITH KEY variant = <ltdx>-variant.

*... set menu entry
      CLEAR ls_toolbar.
      lv_fcode  = '$'.
      lv_fcode+1 = <ltdx>-variant.

*... set text
      IF <ltdxt> IS ASSIGNED.
        lv_text      = <ltdxt>-text.
      ELSE.
        lv_text      = <ltdx>-variant.
      ENDIF.

*... mark and disable actual variant
      IF ls_variant-variant = <ltdx>-variant.
        lv_disable = 'X'.
        lv_checked = 'X'.
      ELSE.
        lv_disable = space.
        lv_checked = space.
      ENDIF.

*... add menu entry to menu
      CALL METHOD e_object->add_function
        EXPORTING
          disabled = lv_disable
          checked  = lv_checked
          fcode    = lv_fcode
          text     = lv_text.
    ENDLOOP.
  ENDMETHOD.                    "lcl_my_event_handler

ENDCLASS.                    "lcl_event_receiver IMPLEMENTATION


INITIALIZATION.


  DATA(docker) = NEW cl_gui_docking_container( ratio = 80 side = cl_gui_docking_container=>dock_at_bottom ).

  DATA(gr_splitter) = NEW cl_gui_splitter_container(
                               parent  = docker
                               rows    = 1
                               columns = 2 ).

  DATA(gr_cont1) = gr_splitter->get_container( row = 1 column = 1 ).
  DATA(gr_cont2) = gr_splitter->get_container( row = 1 column = 2 ).

  DATA(gr_grid1) = NEW lcl_main(
        i_handle    = 'MARA'
        i_container = gr_cont1
        i_title     = 'Materialstamm'
        i_table     = 'GT_MARA' ).

  DATA(gr_grid2) = NEW lcl_main(
        i_handle    = 'MARC'
        i_container = gr_cont2
        i_title     = 'Tabelle MARC'
        i_table     = 'GT_MARC' ).


AT SELECTION-SCREEN.

  SELECT * FROM mara INTO TABLE gt_mara UP TO 30 ROWS
   WHERE matnr IN s_matnr.
  gr_grid1->gr_grid->refresh_table_display( ).

  SELECT * FROM marc INTO TABLE gt_marc UP TO 30 ROWS
   WHERE matnr IN s_matnr.
  gr_grid2->gr_grid->refresh_table_display( ).
效果

 展示3个ALV 模板

REPORT ztrcktrsr_alv_magic_filter.

" http://www.tricktresor.de/blog/magic-filter/

CLASS lcl_magic_filter DEFINITION DEFERRED.
DATA gr_gfil      TYPE REF TO lcl_magic_filter.
DATA gv_value     TYPE c LENGTH 20.

DATA gs_filter    TYPE lvc_s_filt.
DATA gt_filter    TYPE lvc_t_filt.

DATA gr_docker    TYPE REF TO cl_gui_docking_container.

DATA gr_splitter1 TYPE REF TO cl_gui_easy_splitter_container.
DATA gr_splitter2 TYPE REF TO cl_gui_easy_splitter_container.

DATA gr_cont1     TYPE REF TO cl_gui_container.
DATA gr_cont2     TYPE REF TO cl_gui_container.
DATA gr_cont3     TYPE REF TO cl_gui_container.
DATA gr_cont4     TYPE REF TO cl_gui_container.

DATA gr_grid1     TYPE REF TO cl_gui_alv_grid.
DATA gr_grid2     TYPE REF TO cl_gui_alv_grid.
DATA gr_grid3     TYPE REF TO cl_gui_alv_grid.

TYPES: BEGIN OF ty_1,
         matnr TYPE matnr,
         werks TYPE werks_d,
         lgort TYPE lgort_d,
         mtart TYPE mtart,
       END OF ty_1.

TYPES: BEGIN OF ty_2,
         matnr TYPE matnr,
         mtart TYPE mtart,
       END OF ty_2.

TYPES: BEGIN OF ty_3,
         werks TYPE werks_d,
         lgort TYPE lgort_d,
       END OF ty_3.

DATA gt_1 TYPE STANDARD TABLE OF ty_1.
DATA gt_2 TYPE STANDARD TABLE OF ty_2.
DATA gt_3 TYPE STANDARD TABLE OF ty_3.

DATA gs_1 TYPE ty_1.
DATA gs_2 TYPE ty_2.
DATA gs_3 TYPE ty_3.


CLASS lcl_magic_filter DEFINITION.

  PUBLIC SECTION.

    METHODS register
      IMPORTING
        ir_grid TYPE REF TO cl_gui_alv_grid .
    METHODS set_filter
      IMPORTING
        filter TYPE lvc_t_filt .
  PROTECTED SECTION.

    TYPES:
      BEGIN OF ty_object,
        grid   TYPE REF TO cl_gui_alv_grid,
        fcat   TYPE lvc_t_fcat,
        filter TYPE lvc_t_filt,
        status TYPE c LENGTH 1,
      END OF ty_object .
    TYPES:
      ty_objects TYPE STANDARD TABLE OF ty_object .

    DATA mt_objects TYPE ty_objects .
    DATA mt_filter TYPE lvc_t_filt .

    METHODS set_filter_on_objects .

ENDCLASS.



CLASS lcl_magic_filter IMPLEMENTATION.


* ---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_GFIL_CONTROLLER->REGISTER
* +-------------------------------------------------------------------------------------------------+
* | [--->] IR_GRID                        TYPE REF TO CL_GUI_ALV_GRID
* +--------------------------------------------------------------------------------------
  METHOD register.

    DATA ls_object LIKE LINE OF mt_objects.

    READ TABLE mt_objects TRANSPORTING NO FIELDS WITH KEY grid = ir_grid.
    IF sy-subrc > 0.
*== Objekt hinzufügen
      ls_object-grid   = ir_grid.
      ls_object-status = '1'.
      ir_grid->get_frontend_fieldcatalog( IMPORTING et_fieldcatalog = ls_object-fcat ).
      APPEND ls_object TO mt_objects.
    ENDIF.

  ENDMETHOD.


* ---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_GFIL_CONTROLLER->SET_FILTER
* +-------------------------------------------------------------------------------------------------+
* | [--->] FILTER                         TYPE        LVC_T_FILT
* +--------------------------------------------------------------------------------------
  METHOD set_filter.

    mt_filter = filter.
    set_filter_on_objects( ).

  ENDMETHOD.


* ---------------------------------------------------------------------------------------+
* | Instance Protected Method ZCL_GFIL_CONTROLLER->SET_FILTER_ON_OBJECTS
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------
  METHOD set_filter_on_objects.

    DATA lt_filter TYPE lvc_t_filt.
    DATA lv_index TYPE i.

*== Set filter
    LOOP AT mt_objects ASSIGNING FIELD-SYMBOL(<object>).
      lt_filter = mt_filter.

      LOOP AT lt_filter ASSIGNING FIELD-SYMBOL(<filter>).
        lv_index = sy-tabix.
        READ TABLE <object>-fcat TRANSPORTING NO FIELDS WITH KEY fieldname = <filter>-fieldname.
        IF sy-subrc > 0.
          DELETE lt_filter INDEX lv_index.
        ENDIF.
        <object>-grid->set_filter_criteria( lt_filter ).
      ENDLOOP.
      <object>-grid->refresh_table_display( is_stable = VALUE #( col = 'X' row = 'X' )
                                            i_soft_refresh = space ).
    ENDLOOP.


  ENDMETHOD.
ENDCLASS.


PARAMETER p_field TYPE fieldname.
SELECT-OPTIONS s_values FOR gv_value.

INITIALIZATION.

  CREATE OBJECT gr_gfil.

  PERFORM create_base.
  PERFORM create_1.
  PERFORM create_2.
  PERFORM create_3.



AT SELECTION-SCREEN.

  CLEAR gs_filter.
  CLEAR gt_filter.
  gs_filter-fieldname = p_field.
  LOOP AT s_values.
    gs_filter-low    = s_values-low.
    gs_filter-sign   = s_values-sign.
    gs_filter-option = s_values-option.
    APPEND gs_filter TO gt_filter.
  ENDLOOP.

  gr_gfil->set_filter( gt_filter ).

START-OF-SELECTION.

FORM create_base.


  CREATE OBJECT gr_docker
    EXPORTING
      side                    = cl_gui_docking_container=>dock_at_bottom
      ratio                   = 80
      no_autodef_progid_dynnr = abap_true.


  CREATE OBJECT gr_splitter1
    EXPORTING
      parent        = gr_docker
      orientation   = 0
      sash_position = 50.

  gr_cont1 = gr_splitter1->top_left_container.
  gr_cont4 = gr_splitter1->bottom_right_container.

  CREATE OBJECT gr_splitter2
    EXPORTING
      parent        = gr_cont4
      orientation   = 1
      sash_position = 50.

  gr_cont2 = gr_splitter2->top_left_container.
  gr_cont3 = gr_splitter2->bottom_right_container.

ENDFORM.

FORM create_1.

  DATA ls_fcat TYPE lvc_s_fcat.
  DATA lt_fcat TYPE lvc_t_fcat.

  gs_1-matnr = 'A'.
  gs_1-werks = '1000'.
  gs_1-lgort = 'A001'.
  gs_1-mtart = 'FERT'.
  APPEND gs_1 TO gt_1.

  gs_1-matnr = 'B'.
  gs_1-werks = '1000'.
  gs_1-lgort = 'A001'.
  gs_1-mtart = 'HALB'.
  APPEND gs_1 TO gt_1.

  gs_1-matnr = 'C'.
  gs_1-werks = '2000'.
  gs_1-lgort = 'B001'.
  gs_1-mtart = 'FERT'.
  APPEND gs_1 TO gt_1.

  gs_1-matnr = 'C'.
  gs_1-werks = '1000'.
  gs_1-lgort = 'A001'.
  gs_1-mtart = 'FERT'.
  APPEND gs_1 TO gt_1.

  gs_1-matnr = 'D'.
  gs_1-werks = '1000'.
  gs_1-lgort = 'B001'.
  gs_1-mtart = 'HALB'.
  APPEND gs_1 TO gt_1.

  ls_fcat-fieldname = 'MATNR'.
  ls_fcat-rollname  = 'MATNR'.
  APPEND ls_fcat TO lt_fcat.
  ls_fcat-fieldname = 'WERKS'.
  ls_fcat-rollname  = 'WERKS_D'.
  APPEND ls_fcat TO lt_fcat.
  ls_fcat-fieldname = 'LGORT'.
  ls_fcat-rollname  = 'LGORT_D'.
  APPEND ls_fcat TO lt_fcat.
  ls_fcat-fieldname = 'MTART'.
  ls_fcat-rollname  = 'MTART'.
  APPEND ls_fcat TO lt_fcat.

  PERFORM create_grid USING gr_cont1 lt_fcat gt_1.

ENDFORM.

FORM create_2.

  DATA ls_fcat TYPE lvc_s_fcat.
  DATA lt_fcat TYPE lvc_t_fcat.

  gs_2-matnr = 'A'.
  gs_2-mtart = 'FERT'.
  APPEND gs_2 TO gt_2.
  gs_2-matnr = 'B'.
  gs_2-mtart = 'HALB'.
  APPEND gs_2 TO gt_2.
  gs_2-matnr = 'C'.
  gs_2-mtart = 'FERT'.
  APPEND gs_2 TO gt_2.
  gs_2-matnr = 'D'.
  gs_2-mtart = 'HALB'.
  APPEND gs_2 TO gt_2.


  ls_fcat-fieldname = 'MATNR'.
  ls_fcat-rollname  = 'MATNR'.
  APPEND ls_fcat TO lt_fcat.
  ls_fcat-fieldname = 'MTART'.
  ls_fcat-rollname  = 'MTART'.
  APPEND ls_fcat TO lt_fcat.

  PERFORM create_grid USING gr_cont2 lt_fcat gt_2.

ENDFORM.

FORM create_3.

  DATA ls_fcat TYPE lvc_s_fcat.
  DATA lt_fcat TYPE lvc_t_fcat.


  gs_3-werks = '1000'.
  gs_3-lgort = 'A001'.
  APPEND gs_3 TO gt_3.
  gs_3-werks = '2000'.
  gs_3-lgort = 'A001'.
  APPEND gs_3 TO gt_3.
  gs_3-werks = '1000'.
  gs_3-lgort = 'B001'.
  APPEND gs_3 TO gt_3.
  gs_3-werks = '2000'.
  gs_3-lgort = 'B001'.
  APPEND gs_3 TO gt_3.



  ls_fcat-fieldname = 'WERKS'.
  ls_fcat-rollname  = 'WERKS_D'.
  APPEND ls_fcat TO lt_fcat.
  ls_fcat-fieldname = 'LGORT'.
  ls_fcat-rollname  = 'LGORT_D'.
  APPEND ls_fcat TO lt_fcat.

  PERFORM create_grid USING gr_cont3 lt_fcat gt_3.

ENDFORM.

FORM create_grid USING ir_container TYPE REF TO cl_gui_container
                       it_fcat      TYPE lvc_t_fcat
                       it_table     TYPE table.

  DATA lr_grid TYPE REF TO cl_gui_alv_grid.

  CREATE OBJECT lr_grid
    EXPORTING
      i_parent = ir_container.

  lr_grid->set_table_for_first_display(
    CHANGING
      it_outtab                     = it_table
      it_fieldcatalog               = it_fcat ).

  gr_gfil->register( lr_grid ).

ENDFORM.
效果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值