简单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.
效果