原文地址:http://blog.sina.com.cn/s/blog_3f3df76a0100ajxi.html
(1)屏幕100:OK_CODE(事件码传递),ALVCONTAINER(容器)
PROCESS BEFORE OUTPUT.
MODULE STATUS_0100.
*
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0100.
(2)屏幕:200-OK_CODE(事件码传递),CON_DIABOX(容器)
PROCESS BEFORE OUTPUT.
MODULE STATUS_0200.
*
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0200.
(3)屏幕:2000-OK_CODE(事件码传递),SUB111(子屏幕)
PROCESS BEFORE OUTPUT.
MODULE status_2000.
CALL SUBSCREEN sub111 INCLUDING sy-repid '9999'.
PROCESS AFTER INPUT.
MODULE user_command_2000.
CALL SUBSCREEN sub111.
(4)main200-状态栏 ,
main100-状态栏 ,
*&---------------------------------------------------------------------*
*& Report Z_WBH_ALV_CLASS
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT Z_WBH_ALV_CLASS.
TYPE-POOLS slis.
DATA:con_diabox TYPE REF TO cl_gui_dialogbox_container.
DATA: l_alv TYPE REF TO cl_gui_alv_grid ,
lt_sflight TYPE TABLE OF sflight .
*DATA: ok_code LIKE sy-ucomm.
TABLES: ekko.
DATA: BEGIN OF itab OCCURS 0 ,
flag ,
werks LIKE ekpo-werks,
ebeln LIKE ekko-ebeln,
lifnr LIKE ekko-lifnr,
name1 LIKE lfa1-name1,
telf1 LIKE lfa1-telf1,
aedat LIKE ekko-aedat,
* zzreagree LIKE ekko-zzreagree,
* zzredate LIKE ekko-zzredate,
* zzrereason LIKE ekko-zzrereason,
* zzreperson LIKE ekko-zzreperson,
* zzremode LIKE ekko-zzremode,
* zzpostatus LIKE ekko-zzpostatus,
END OF itab .
DATA: ok_code LIKE sy-ucomm .
DATA: l_valid(1) TYPE c.
DATA: go_grid TYPE REF TO cl_gui_alv_grid,
g_container TYPE scrfname VALUE 'ALVCONTAINER',
g_custom_container TYPE REF TO cl_gui_custom_container.
DATA: gt_fieldcat TYPE lvc_t_fcat,
gs_fieldcat TYPE lvc_s_fcat,
gs_variant TYPE disvariant ,
gt_sort TYPE lvc_t_sort,
gs_sort TYPE lvc_s_sort,
gt_filt TYPE lvc_t_filt,
gs_filt TYPE lvc_s_filt,
ls_cell TYPE lvc_s_styl,
sla TYPE lvc_s_layo,
gt_f4 TYPE lvc_t_f4,
gs_f4 TYPE lvc_s_f4.
DATA: lt_exclude TYPE ui_functions.
SELECTION-SCREEN BEGIN OF SCREEN 9999 ."as SUBSCREEN."当使用自定义屏幕显示选择条件时,此处必须将选择条件定义成子屏幕
PARAMETERS p_werks LIKE ekpo-werks OBLIGATORY.
SELECT-OPTIONS:
s_ebeln FOR ekko-ebeln ,
s_lifnr FOR ekko-lifnr,
s_aedat FOR ekko-aedat ."OBLIGATORY.
SELECTION-SCREEN END OF SCREEN 9999.
DATA cl_gui_alv_grid.
CLASS lcl_event_handler DEFINITION."弹出窗口关闭事件定义
PUBLIC SECTION.
CLASS-METHODS:
on_close FOR EVENT close OF cl_gui_dialogbox_container IMPORTING sender.
ENDCLASS. "lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.
METHOD on_close.
CALL METHOD sender->free.
FREE: con_diabox, l_alv.
CALL SCREEN '100'.
ENDMETHOD. "on_close
ENDCLASS.
*---------------------------------------------------------------------*
* CLASS lcl_event_receiver DEFINITION,以下为声明事件和实现事件方法类
*---------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION."alv显示f4和双击事件定义
PUBLIC SECTION.
METHODS handle_f4
FOR EVENT onf4 OF cl_gui_alv_grid
IMPORTING e_fieldname
es_row_no
er_event_data
et_bad_cells.
METHODS catch_doubleclick
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row
e_column
es_row_no .
ENDCLASS. "lcl_event_receiver DEFINITION
*---------------------------------------------------------------------*
* CLASS lcl_event_receiver IMPLEMENTATION
*---------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_f4.
PERFORM f4 USING e_fieldname
es_row_no
er_event_data
et_bad_cells.
ENDMETHOD. "handle_f4
METHOD catch_doubleclick.
PERFORM atdoubleclick USING e_row
e_column
es_row_no.
ENDMETHOD. "catch_doubleclick
ENDCLASS. "lcl_event_receiver IMPLEMENTATION
DATA: event_receiver TYPE REF TO lcl_event_receiver.
DATA:pm(10) TYPE c.
INITIALIZATION.
* gd_repid = sy-repid.
PERFORM fieldcat_init USING gt_fieldcat[]."初始化alv要显示的列及能否编辑状态等
START-OF-SELECTION.
CALL SELECTION-SCREEN 9999."调用选择屏幕
CALL SCREEN '100'."执行事件后alv结果显示窗口
* CALL SCREEN 2000."直接调用自定义显示选择条件的屏幕
at USER-COMMAND ."在屏幕显示时该代码无用
CASE sy-ucomm .
WHEN 'EXIT' OR 'BACK'.
LEAVE PROGRAM.
WHEN 'SAVE'.
PERFORM save.
WHEN 'ALL'.
PERFORM all.
WHEN 'NONE'.
PERFORM none.
ENDCASE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
CASE ok_code."注意在屏幕中必须定义ok_code
WHEN 'EXIT' OR 'BACK'.
* CALL METHOD sender->free.
FREE: g_custom_container, go_grid.
call SELECTION-SCREEN 9999 . "返回选择屏幕
* LEAVE PROGRAM."直接退出
* CALL SCREEN 2000.“调用自定义显示选择条件屏幕
* LEAVE TO SCREEN 2000.”调用自定义显示选择条件屏幕
WHEN 'SAVE'.
PERFORM save.
WHEN 'SEL'.
PERFORM all.
WHEN 'CAL'.
PERFORM none.
ENDCASE.
CLEAR ok_code .
ENDMODULE. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& Form load_data_into_grid
*&---------------------------------------------------------------------*
FORM load_data_into_grid.
"产生要输出的数据存到内表itab中
SELECT ekko~ebeln
ekko~lifnr
ekko~aedat
* ekko~zzreagree
* ekko~zzredate
* ekko~zzrereason
* ekko~zzreperson
* ekko~zzremode
* ekko~zzpostatus
lfa1~name1
lfa1~telf1
ekpo~werks
FROM ekko INNER JOIN ekpo ON ekko~ebeln = ekpo~ebeln AND
ekpo~ebelp = '00010'
INNER JOIN lfa1 ON ekko~lifnr = lfa1~lifnr
INTO CORRESPONDING FIELDS OF TABLE itab
WHERE ekko~ebeln IN s_ebeln AND
ekko~lifnr IN s_lifnr AND
ekko~aedat IN s_aedat AND
ekpo~werks = p_werks.
sla-cwidth_opt = 'X'."显示样式设置
sla-zebra = 'X'.
sla-no_toolbar = ''."是否显示标准工具条
* sla-edit = 'X' .
CALL METHOD go_grid->set_table_for_first_display
EXPORTING
is_variant = gs_variant
i_save = 'A'
is_layout = sla
* IT_TOOLBAR_EXCLUDING =
CHANGING
it_outtab = itab[]
it_fieldcatalog = gt_fieldcat[]
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4.
CALL METHOD go_grid->set_ready_for_input "??????
EXPORTING
i_ready_for_input = 1.
ENDFORM. " load_data_into_grid
*&--------------------------------------------------------------------*
*& Form fieldcat_init
*&--------------------------------------------------------------------*
FORM fieldcat_init USING rt_fieldcat TYPE lvc_t_fcat.
DATA: ls_fieldcat TYPE lvc_s_fcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'FLAG'."用于产生复选框按钮列
ls_fieldcat-scrtext_l = 'Flag'.
ls_fieldcat-checkbox = 'X'."复选框表示
ls_fieldcat-edit = 'X'."可编辑标示
ls_fieldcat-key = 'X'.
APPEND ls_fieldcat TO rt_fieldcat .
CLEAR ls_fieldcat.
PERFORM frm_catlg_set USING:
'WERKS' '' '门店' '' 'WERKS' 'EKPO' rt_fieldcat,
'EBELN' '' 'PO号码' '' 'EBELN' 'EKKO' rt_fieldcat,
'AEDAT' '' 'PO日期' '' 'AEDAT' 'EKKO' rt_fieldcat,
'LIFNR' '' '供应商' '' 'LIFNR' 'EKKO' rt_fieldcat, "
'NAME1' '' '供应商名称' '' 'NAME1' 'LFA1' rt_fieldcat,
'TELF1' '' '供应商电话' '' 'TELF1' 'LFA1' rt_fieldcat,
'ZZREAGREE' '' '是否同意' 'X' 'ZZREAGREE' 'EKKO' rt_fieldcat,"X选项表示该列可以编辑
'ZZREDATE' '' '日期' 'X' 'ZZREDATE' 'EKKO' rt_fieldcat,
'ZZREPERSON' '' '回复人' 'X' 'ZZREPERSON' 'EKKO' rt_fieldcat,
'ZZREMODE' '' '退货方式' 'X' 'ZZREMODE' 'EKKO' rt_fieldcat,
'ZZPOSTATUS' '' 'PO状态' 'X' 'ZZPOSTATUS' 'EKKO' rt_fieldcat,
'ZZREREASON' '' '不同意原因' 'X' 'ZZREREASON' 'EKKO' rt_fieldcat.
gs_f4-fieldname = 'ZZREPERSON'.
gs_f4-register = 'X'.
gs_f4-getbefore = 'X'.
gs_f4-chngeafter = 'X'.
INSERT gs_f4 INTO TABLE gt_f4."gt_f4用于保存产生f4事件的字段
ENDFORM. "fieldcat_init
*---------------------------------------------------------------------*
* FORM frm_catlg_set *
*---------------------------------------------------------------------*
FORM frm_catlg_set USING p_field p_key p_text p_edit ref_f ref_t
rt_fieldcat TYPE lvc_t_fcat .
DATA: tmp_fieldcat TYPE lvc_s_fcat.
tmp_fieldcat-fieldname = p_field.
tmp_fieldcat-key = p_key .
tmp_fieldcat-scrtext_l = p_text.
tmp_fieldcat-edit = p_edit.
tmp_fieldcat-f4availabl = 'X'.
tmp_fieldcat-ref_field = ref_f.
tmp_fieldcat-ref_table = ref_t.
APPEND tmp_fieldcat TO rt_fieldcat .
CLEAR tmp_fieldcat .
ENDFORM. " FRM_CATLG_SET
*&---------------------------------------------------------------------*
*& Form change
*&---------------------------------------------------------------------*
FORM change .
IF go_grid->is_ready_for_input( ) = 0.
CALL METHOD go_grid->set_ready_for_input
EXPORTING
i_ready_for_input = 1.
ELSE.
CALL METHOD go_grid->check_changed_data "????????????
IMPORTING
e_valid = l_valid.
CALL METHOD go_grid->set_ready_for_input
EXPORTING
i_ready_for_input = 0.
CALL METHOD go_grid->refresh_table_display.
ENDIF.
ENDFORM. " change
*&--------------------------------------------------------------------*
*& Form f4
*&--------------------------------------------------------------------*
FORM f4 USING r_fieldname TYPE lvc_fname
rs_row_no TYPE lvc_s_roid
rr_event_data TYPE REF TO cl_alv_event_data
rt_bad_cells TYPE lvc_t_modi.
MESSAGE 'f4' TYPE 'I'.
rr_event_data->m_event_handled = 'X'.
ENDFORM. " F4
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'MAIN200'.
gs_variant-report = sy-repid.
"注册事件到alv
IF g_custom_container IS INITIAL.
CREATE OBJECT g_custom_container
EXPORTING container_name = g_container.
IF go_grid IS INITIAL.
CREATE OBJECT go_grid
EXPORTING
i_parent = g_custom_container."cl_gui_container=>screen0."当需要back到选择屏幕时,不能防止放置在默认容器screen0中,
CREATE OBJECT event_receiver.
SET HANDLER event_receiver->handle_f4 FOR go_grid.
CALL METHOD go_grid->register_f4_for_fields
EXPORTING
it_f4 = gt_f4."gt_f4用于保存产生f4事件的字段
SET HANDLER event_receiver->catch_doubleclick FOR go_grid.
IF sy-batch IS INITIAL.
CALL METHOD go_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
ENDIF.
PERFORM load_data_into_grid.
ENDIF.
ENDIF.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Form save
*&---------------------------------------------------------------------*
FORM save.
CALL METHOD go_grid->check_changed_data
IMPORTING
e_valid = l_valid.
IF l_valid = 'X'.
LOOP AT itab WHERE flag = 'X'.
* UPDATE ekko SET
* zzreagree = itab-zzreagree
* zzredate = itab-zzredate
* zzrereason = itab-zzrereason
* zzreperson = itab-zzreperson
* zzremode = itab-zzremode
* zzpostatus = itab-zzpostatus
* WHERE ebeln = itab-ebeln .
IF sy-subrc NE 0.
MESSAGE e000(z900) WITH 'Update Error!'.
ENDIF.
ENDLOOP.
IF sy-subrc = 0.
MESSAGE i000(z900) WITH 'Update Success!'.
ENDIF.
ELSE.
MESSAGE e000(z900) WITH 'Data Error'.
ENDIF.
ENDFORM. " save
*&---------------------------------------------------------------------*
*& Form all
*&---------------------------------------------------------------------*
FORM all.
LOOP AT itab.
itab-flag = 'X'.
MODIFY itab.
ENDLOOP.
CALL METHOD go_grid->refresh_table_display."设置编辑状态后,刷新alv显示
ENDFORM. " all
*&---------------------------------------------------------------------*
*& Form none
*&---------------------------------------------------------------------*
FORM none.
LOOP AT itab.
itab-flag = ' '.
MODIFY itab.
ENDLOOP.
CALL METHOD go_grid->refresh_table_display.
ENDFORM. " none
*&---------------------------------------------------------------------*
*& Form atdoubleclick
*&---------------------------------------------------------------------*
FORM atdoubleclick USING p_e_row
p_e_column
p_es_row_no.
* MESSAGE '双击' TYPE 'I'.
READ TABLE itab INDEX p_e_row.
IF p_e_column = 'EBELN'.
SET PARAMETER ID 'BES' FIELD itab-ebeln.
CALL FUNCTION 'ME_DISPLAY_PURCHASE_DOCUMENT' "相应双击事件,根据双击列进行调用相应的方法
EXPORTING
i_ebeln = itab-ebeln
i_enjoy = 'X'.
ELSEIF p_e_column = 'LIFNR'.
CALL FUNCTION 'MMPUR_VENDOR_DISPLAY'
EXPORTING
im_lifnr = itab-lifnr
im_ekorg = 'B000'.
else.
CALL SCREEN 200..
ENDIF.
ENDFORM. " atdoubleclick
*&---------------------------------------------------------------------*
*& Module STATUS_0200 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE STATUS_0200 OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
* SET PF-STATUS 'MAIN100'.
SELECT * FROM sflight INTO TABLE lt_sflight.
IF con_diabox IS INITIAL.
CREATE OBJECT con_diabox
EXPORTING
width = 600
height = 200
top = 70
left = 140
caption = 'Title'
EXCEPTIONS
OTHERS = 1.
SET HANDLER lcl_event_handler=>on_close FOR con_diabox .
CREATE OBJECT l_alv
EXPORTING
i_parent = con_diabox.
ENDIF.
CALL METHOD l_alv->set_table_for_first_display
EXPORTING
i_structure_name = 'SFLIGHT'
CHANGING
it_outtab = lt_sflight.
ENDMODULE. " STATUS_0200 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0200 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0200 INPUT."没用
CASE ok_code.
WHEN 'BACK'.
* LEAVE PROGRAM.
CALL SCREEN '100'.
ENDCASE.
ENDMODULE. " USER_COMMAND_0200 INPUT
*&---------------------------------------------------------------------*
*& Module status_2000 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_2000 OUTPUT.
SET PF-STATUS 'MAIN100'.
ENDMODULE. " status_2000 OUTPUT
*&---------------------------------------------------------------------*
*& Module user_command_2000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_2000 INPUT.
CASE ok_code.
WHEN 'BACK' or 'EXIT'.
LEAVE PROGRAM.
WHEN 'EXE'.
* CALL SELECTION-SCREEN 222 STARTING AT 10 5 .
CALL SCREEN 100.
ENDCASE.
ENDMODULE. " user_command_2000 INPUT