OO ALV 简单实例
其中屏幕的创建, 和对应PAI、PBO 以及 Status title 等可以自定调整。
REPORT zoo_alv_demo.
TYPE-POOLS: slis.
" Global data Decleration. "
TYPES:BEGIN OF str_output,
ebeln TYPE ebeln,
aedat TYPE erdat,
ernam TYPE ernam,
ebelp TYPE ebelp,
matnr TYPE matnr,
werks TYPE werks_d,
menge TYPE bstmg,
meins TYPE bstme,
netwr TYPE bwert,
END OF str_output.
DATA: gt_ekko TYPE TABLE OF ekko,
gs_ekko TYPE ekko,
gt_ekpo TYPE TABLE OF ekpo,
gs_ekpo TYPE ekpo,
gt_output TYPE TABLE OF str_output,
gs_output TYPE str_output.
"Global Data Definitions for ALV"
DATA go_container TYPE REF TO cl_gui_custom_container.
DATA go_grid TYPE REF TO cl_gui_alv_grid.
DATA gt_fieldcat TYPE lvc_t_fcat.
DATA gs_fieldcat TYPE lvc_s_fcat.
DATA layout TYPE lvc_s_layo.
DATA gt_exclude TYPE ui_functions. "Button Exclude"
DATA gt_variant TYPE disvariant. "Variant"
DATA gt_sort TYPE lvc_t_sort. "Sotrt table"
DATA gt_filt TYPE lvc_t_filt. "Filter table"
DATA gt_select TYPE lvc_t_cell. "选中单元格方法参数"
DATA gt_selrow TYPE lvc_t_row. "选中行方法参数"
"MARCO"
DEFINE mrc_fieldcat.
clear: gs_fieldcat.
gs_fieldcat-fieldname = &1.
gs_fieldcat-seltext = &2.
gs_fieldcat-col_pos = &3.
gs_fieldcat-outputlen = &4.
append gs_fieldcat to gt_fieldcat.
END-OF-DEFINITION.
"Event "
CLASS cl_event_receiver DEFINITION DEFERRED.
DATA event_receiver TYPE REF TO cl_event_receiver.
"Select Screen"
*----------------------------------------------------------------------*
* CLASS cl_event_receiver DEFINITION
*----------------------------------------------------------------------*
CLASS cl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS handle_toolbar FOR EVENT toobal OF cl_gui_alv_grid
IMPORTING e_object e_interactive.
METHODS handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
METHODS handle_double_click FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column es_row_no.
METHODS handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
ENDCLASS. "CL_EVENT_RECEIVER"
"事件类实现"
*----------------------------------------------------------------------*
* CLASS cl_event_receiver IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_event_receiver IMPLEMENTATION.
METHOD handle_toolbar.
"ADDING A SAVE BUTTONN TO THE ALV TOOLBAR "
DATA: is_btn TYPE stb_button.
is_btn-function = ’SAVE‘.
is_btn-icon = icon_system_save.
is_btn-text = ‘SAVE’.
is_btn-quickinfo = ‘SAVE’.
is_btn-disabled = ‘ ‘.
APPEND is_btn TO e_object->mt_toolbar.
ENDMETHOD. "handle_toolbar"
METHOD handle_user_command .
CASE e_ucomm.
WHEN ‘SAVE’.
PERFORM update_data_base.
ENDCASE.
ENDMETHOD. "handle_user_command"
METHOD handle_double_click.
CONDENSE e_row NO-GAPS.
CONDENSE e_column NO-GAPS.
DATA: ls_output TYPE str_output.
READ TABLE gt_output INDEX e_row INTO ls_output.
CASE e_column.
WHEN 'MATNR'.
SET PARAMETER ID 'MAT' FIELD ls_output-matnr.
SET PARAMETER ID 'MXX' FIELD 'D'.
SET PARAMETER ID 'WRK' FIELD ls_output-werks.
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
WHEN OTHERS.
ENDCASE. "handel_double_click"
ENDMETHOD. "cl_event_receiver"
METHOD handle_data_changed.
DATA: ls_output TYPE str_output,
ls_good TYPE lvc_s_modi,
lv_menge TYPE ekpo-netwr.
LOOP AT er_data_changed->mt_good_cells INTO ls_good.
CLEAR: ls_output,lv_menge.
IF ls_good-fieldname = 'NETWR'.
READ TABLE gt_output INDEX ls_good-row_id INTO ls_output.
IF sy-subrc = 0.
CALL METHOD er_data_changed->get_cell_value
EXPORTING
i_row_id = ls_good-row_id
i_fieldname = ls_good-fieldname
IMPORTING
e_value = lv_menge.
......
CALL METHOD er_data_changed->modify_cell
EXPORTING
i_row_id = ls_good-row_id
i_fieldname = ls_good-fieldname
i_value = lv_menge.
ENDIF.
ENDIF.
ENDLOOP.
ENDMETHOD. "handle_data_changed"
ENDCLASS. "CL_EVENT_RECEIVER"
START-OF-SELECTION.
PERFORM get_data.
PERFORM prepare_fieldcat.
PERFORM prepare_layout.
END-OF-SELECTION.
CALL SCREEN 1000.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
FORM get_data .
CLEAR gt_ekko.
SELECT * FROM ekko INTO TABLE gt_ekko UP TO 20 ROWS.
IF gt_ekko IS NOT INITIAL.
CLEAR gt_ekpo.
SELECT * FROM ekpo INTO TABLE gt_ekpo
FOR ALL ENTRIES IN gt_ekko
WHERE ebeln = gt_ekko-ebeln.
ENDIF.
LOOP AT gt_ekpo INTO gs_ekpo.
gs_output-ebeln = gs_ekpo-ebeln.
gs_output-ebelp = gs_ekpo-ebelp.
gs_output-matnr = gs_ekpo-matnr.
gs_output-werks = gs_ekpo-werks.
gs_output-menge = gs_ekpo-menge.
gs_output-meins = gs_ekpo-meins.
gs_output-netwr = gs_ekpo-netwr.
READ TABLE gt_ekko INTO gs_ekko WITH KEY ebeln = gs_ekpo-ebeln.
IF sy-subrc IS INITIAL.
gs_output-aedat = gs_ekko-aedat.
gs_output-ernam = gs_ekko-ernam.
ENDIF.
APPEND gs_output TO gt_output.
CLEAR: gs_output,gs_ekpo,gs_ekko.
ENDLOOP.
ENDFORM. " GET_DATA "
*&---------------------------------------------------------------------*
*& Form PREPARE_FIELDCAT
*&---------------------------------------------------------------------*
FORM prepare_fieldcat .
CLEAR gt_fieldcat.
mrc_fieldcat 'EBELN' 'Purchase Order' '1' '18'.
mrc_fieldcat 'EBELP' 'Purchase Order Item' '2' '5'.
mrc_fieldcat 'MATNR' 'Material Number' '3' '18'.
mrc_fieldcat 'WERKS' 'Plant' '4' '5'.
mrc_fieldcat 'MENGE' 'Quantity' '5' '18'.
mrc_fieldcat 'MEINS' 'Unit' '6' '18'.
mrc_fieldcat 'NETWR' 'Value' '7' '18'.
mrc_fieldcat 'AEDAT' 'Create Date' '8' '18'.
mrc_fieldcat 'ERNAM' 'Create By' '9' '18'.
ENDFORM. " PREPARE_FIELDCAT "
*&---------------------------------------------------------------------*
*& Form PREPARE_LAYOUT
*&---------------------------------------------------------------------*
FORM prepare_layout.
CLEAR layout.
layout-zebra = 'X' .
layout-cwidth_opt = 'X'.
layout-grid_title = 'Material Document List' .
* layout-smalltitle = 'X' .
* layout-info_fname = 'ROWCOLOR'.
ENDFORM. " PREPARE_LAYOUT "
*&---------------------------------------------------------------------*
*& Module STATUS_1000 OUTPUT
*&---------------------------------------------------------------------*
MODULE status_1000 OUTPUT.
SET PF-STATUS 'STATUS_1000'.
ENDMODULE. " STATUS_1000 OUTPUT "
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_1000 INPUT
*&---------------------------------------------------------------------*
MODULE user_command_1000 INPUT.
CASE sy-ucomm.
WHEN 'SAVE'.
PERFORM update_data_base.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE. " USER_COMMAND_1000 INPUT "
*&---------------------------------------------------------------------*
*& Module display_alv OUTPUT
*&---------------------------------------------------------------------*
MODULE display_alv OUTPUT.
*----Creating custom container instance
IF go_container IS NOT BOUND.
CREATE OBJECT go_container
EXPORTING
container_name = 'CONTAINER'
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.
*----Creating alv grid instance
IF go_grid IS NOT BOUND.
CREATE OBJECT go_grid
EXPORTING
i_parent = go_container
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*----Here will be additional preparations
*--e.g. initial sorting criteria, initial filtering criteria, excluding functions
*----Display ALV
CALL METHOD go_grid->set_table_for_first_display
EXPORTING
* i_buffer_active =
* i_bypassing_buffer =
* i_consistency_check =
* i_structure_name =
"Name of the DDIC structure, the catalog is generated automatically (Have priority)"
* is_variant =
i_save = 'A'
i_default = 'X'
is_layout = layout
* is_print =
* it_special_groups =
* it_toolbar_excluding =
* it_hyperlink =
* it_alv_graphics =
* it_except_qinfo =
* ir_salv_adapter =
CHANGING
it_outtab = gt_output
it_fieldcatalog = gt_fieldcat
* it_sort =
* it_filter =
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
*---- Event Create
CREATE OBJECT event_receiver.
SET HANDLER event_receiver->handle_toolbar FOR go_grid.
SET HANDLER event_receiver->handle_user_command FOR go_grid.
SET HANDLER event_receiver->handle_double_click FOR go_grid. "双击事件"
SET HANDLER event_receiver->handle_data_changed FOR go_grid. "数据修改事件"
CALL METHOD go_grid->register_edit_event "注册编辑事件,否则不会触发更新事件"
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
ENDIF.
CALL METHOD go_grid->refresh_table_display
* EXPORTING
* IS_STABLE =
* I_SOFT_REFRESH =
EXCEPTIONS
finished = 1
OTHERS = 2 .
IF sy-subrc <> 0.
ENDIF.
ENDMODULE. "display_alv"
*&---------------------------------------------------------------------*
*& Form UPDATE_DATA_BASE
*&---------------------------------------------------------------------*
FORM UPDATE_DATA_BASE .
CALL METHOD o_alv->check_changed_data
IMPORTING
e_valid = check.
IF it_spfli NE it_spfli_old.
LOOP AT it_spfli INTO wa_spfli.
MOVE-CORRESPONDING wa_spfli TO wa_spfli_new.
APPEND wa_spfli_new TO it_spfli_new.
ENDLOOP.
MODIFY spfli FROM TABLE it_spfli_new.
IF sy-subrc = 0..
MESSAGE ‘Change data success’ TYPE ‘S’.
ENDIF.
ENDIF.
ENDFORM. ” UPDATE_DATA_BASE