ABLES:ekko.
INCLUDE <icon>.
SELECTION-SCREEN BEGIN OF BLOCK blk WITH FRAME TITLE text-001.
SELECT-OPTIONS:s_ekorg FOR ekko-ekorg.
SELECT-OPTIONS:s_aedat FOR ekko-aedat.
SELECTION-SCREEN END OF BLOCK blk.
DATA:it_ekko LIKE TABLE OF ekpo WITH HEADER LINE.
*ALV类变量定义
DATA: g_container TYPE REF TO cl_gui_custom_container. "容器类
DATA: g_grid TYPE REF TO cl_gui_alv_grid,
it_fieldcat TYPE lvc_t_fcat,
it_exclude TYPE ui_functions,
is_layout TYPE lvc_s_layo.
DATA: x_save, "for Parameter I_SAVE
ls_layout TYPE disvariant. "for parameter IS_VARIANT
* f_title TYPE LVC_TITLE. "ALV 的标题
CLASS lcl_alv_receiver DEFINITION DEFERRED.
DATA: g_alv_application TYPE REF TO lcl_alv_receiver. "按钮处理
TYPES:BEGIN OF it_ekko1,
matnr LIKE ekpo-matnr,
ebelp LIKE ekpo-ebelp,
sn(6),
END OF it_ekko1.
DATA: it_ekko_tmp TYPE SORTED TABLE OF it_ekko1
WITH UNIQUE KEY matnr ebelp WITH HEADER LINE.
*类的定义
CLASS lcl_alv_receiver DEFINITION.
PUBLIC SECTION.
METHODS:
handle_double "执行双击事件
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column es_row_no,
handle_toolbar
FOR EVENT toolbar OF cl_gui_alv_grid "TOOLBAR
IMPORTING e_object e_interactive,
handle_user_command "执行toolbar的UCOMM
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm,
handle_menu_button "下拉框
FOR EVENT menu_button OF cl_gui_alv_grid
IMPORTING e_object e_ucomm,
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
ENDCLASS. "lcl_event_receiver DEFINITION
*类的执行
CLASS lcl_alv_receiver IMPLEMENTATION.
*-----------------------------------------------------------------
METHOD handle_double .
MESSAGE i000(000) WITH e_row-index."双击 到行
MESSAGE i000(000) WITH e_column-fieldname."双击 到列
*选择多行
* call method g_top_right_grid->get_selected_rows
* importing
* et_index_rows = l_lt_rows.
ENDMETHOD. "HANDLE_double
*-----------------------TOOLBAR------------------------------------*
METHOD handle_toolbar.
* ?2.In event handler method for event TOOLBAR: Append own functions
* by using event parameter E_OBJECT.
* DATA: ls_toolbar TYPE stb_button.
*....................................................................
* E_OBJECT of event TOOLBAR is of type REF TO CL_ALV_EVENT_TOOLBAR_SET.
* This class has got one attribute, namly MT_TOOLBAR, which
* is a table of type TTB_BUTTON. One line of this table is
* defined by the Structure STB_BUTTON (see data deklaration above).
*
* A remark to the flag E_INTERACTIVE:
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 'e_interactive' is set, if this event is raised due to
* the call of 'set_toolbar_interactive' by the user.
* You can distinguish this way if the event was raised
* by yourself or by ALV
* (e.g. in method 'refresh_table_display').
* An application of this feature is still unknown... :-)
DELETE e_object->mt_toolbar WHERE function = '&MB_SUM'.
DELETE e_object->mt_toolbar WHERE function = '&MB_SUBTOT'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP05'.
DELETE e_object->mt_toolbar WHERE function = '&PRINT_BACK'.
DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
DELETE e_object->mt_toolbar WHERE function = '&COL0'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP06'.
DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
DELETE e_object->mt_toolbar WHERE function = '&&SEP07'.
DELETE e_object->mt_toolbar WHERE function = '&INFO'.
DELETE e_object->mt_toolbar WHERE function = ''.
DELETE e_object->mt_toolbar WHERE function = '&&SEP00'.
DELETE e_object->mt_toolbar WHERE function = '&CHECK'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&CUT'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL©'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&PASTE'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&APPEND'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&INSERT_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&DELETE_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL&UNDO'.
DELETE e_object->mt_toolbar WHERE function = '&MB_SUM'.
DELETE e_object->mt_toolbar WHERE function = '&MB_SUBTOT'.
DELETE e_object->mt_toolbar WHERE function = '&MB_VIEW'.
DELETE e_object->mt_toolbar WHERE function = '&GRAPH'.
DELETE e_object->mt_toolbar WHERE function = '&INFO'.
DELETE e_object->mt_toolbar WHERE function = '&LOCAL©_ROW'.
DELETE e_object->mt_toolbar WHERE function = '&REFRESH'.
*增加buttom
DATA: mybutton TYPE stb_button.
mybutton-function = 'BOBBUTTON'.
mybutton-icon = icon_abap_local.
mybutton-quickinfo = 'BOB button'.
mybutton-butn_type = '1'.
mybutton-disabled = ''.
mybutton-text = '王洲按钮'.
APPEND mybutton TO e_object->mt_toolbar.
ENDMETHOD. "handle_toolbar
*---------------user_command-----------------------------------*
METHOD handle_user_command.
CASE e_ucomm.
WHEN 'MENU1'.
MESSAGE 'BOB E_UCOMM' TYPE 'I'.
ENDCASE.
ENDMETHOD. "lcl_event_receiver
*-------------------------------------------------------------------
METHOD handle_menu_button. " 下拉菜单
CASE e_ucomm.
WHEN 'BOBBUTTON'.
CALL METHOD e_object->add_function
EXPORTING
fcode = 'MENU1'
text = '下拉框1'
icon = icon_alarm.
ENDCASE.
ENDMETHOD. "handle_menu_button
*-------------------------------------------------------------------
METHOD handle_data_changed.
ENDMETHOD. "handle_menu_button
ENDCLASS. "lcl_ALV_event_receiver
call screen '100'.
PROCESS BEFORE OUTPUT.
MODULE status_0100.
MODULE initial. "创建ALV
*
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0100.
module INITIAL output.
if G_CONTAINER is initial.
perform CREATE_ALV. "创建ALV
endif.
endmodule. " INITIAL OUTPUT
*&---------------------------------------------------------------------*
*& Form create_alv
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form CREATE_ALV .
*定义ALV事件处理对象
create object G_ALV_APPLICATION.
*创建容器对象
create object G_CONTAINER
exporting CONTAINER_NAME = 'MYCONTAINER'.
*构建ALV
create object G_GRID
exporting I_PARENT = G_CONTAINER.
**构建树初始化
refresh:IT_FIELDCAT.
clear:IT_FIELDCAT.
IS_LAYOUT-SEL_MODE = 'A'.
* x_save = 'A'. "The user may save all types of a layout
* x_save = 'X'. "a layout can only be saved as spanned one ('global')
* x_save = space. "no saving of a layout possible!
* x_save = 'U'. "a layout can only be saved as user specific one
X_SAVE = 'U'. "记录用户的操作
clear LS_LAYOUT.
LS_LAYOUT-REPORT = SY-REPID.
**
*构造结构
perform SET_ALV_TAB.
perform SER_DRODOWN.
**完成
call method G_GRID->SET_TABLE_FOR_FIRST_DISPLAY
exporting
I_SAVE = X_SAVE
IS_VARIANT = LS_LAYOUT
IS_LAYOUT = IS_LAYOUT
changing
* IT_SORT = IT_SORT
IT_FIELDCATALOG = IT_FIELDCAT
IT_OUTTAB = IT_EKKO[].
**设置TOOLBAR 在设置了自定义的按钮之后,必须要有 call method g_grid->set_toolbar_interactive.
set handler G_ALV_APPLICATION->HANDLE_TOOLBAR for G_GRID.
call method G_GRID->SET_TOOLBAR_INTERACTIVE.
*单元格双击
set handler G_ALV_APPLICATION->HANDLE_DOUBLE for G_GRID.
*处理菜单事件
set handler G_ALV_APPLICATION->HANDLE_USER_COMMAND for G_GRID.
*定义CONTXT菜单
set handler G_ALV_APPLICATION->HANDLE_MENU_BUTTON for G_GRID.
set handler G_ALV_APPLICATION->HANDLE_DATA_CHANGED for G_GRID.
**
**定义事件‘ENTER’
call method G_GRID->REGISTER_EDIT_EVENT
exporting
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER.
endform. " create_alv
*&---------------------------------------------------------------------*
*& Form set_alv_tab
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form SET_ALV_TAB .
data: WA_FIELDS type LVC_S_FCAT.
refresh IT_FIELDCAT.
clear WA_FIELDS.
WA_FIELDS-FIELDNAME = 'EBELN'.
WA_FIELDS-COLTEXT = '采购订单号'.
WA_FIELDS-EMPHASIZE = 'C410'.
* wa_fields-hotspot = 'X'.
* wa_fields-col_opt = 'A'.
WA_FIELDS-EDIT = 'X'.
WA_FIELDS-FIX_COLUMN = 'X'. "冻结列
WA_FIELDS-F4AVAILABL = 'X'.
WA_FIELDS-REF_TABLE = 'EKKO'.
WA_FIELDS-REF_FIELD = 'EBELN'.
append WA_FIELDS to IT_FIELDCAT.
clear WA_FIELDS.
WA_FIELDS-FIELDNAME = 'MATNR'.
WA_FIELDS-COLTEXT = '商品'.
* wa_fields-emphasize = 'C410'.
WA_FIELDS-EDIT = 'X'.
WA_FIELDS-COL_OPT = 'A'.
WA_FIELDS-DRDN_FIELD = 'EBELP'.
append WA_FIELDS to IT_FIELDCAT.
clear WA_FIELDS.
WA_FIELDS-FIELDNAME = 'WERKS'.
WA_FIELDS-COLTEXT = '地点'.
* wa_fields-emphasize = 'C410'.
WA_FIELDS-EDIT = 'X'.
WA_FIELDS-COL_OPT = 'A'.
WA_FIELDS-DRDN_FIELD = 'EBELP'.
append WA_FIELDS to IT_FIELDCAT.
clear WA_FIELDS.
* wa_fields-fieldname = 'EBELP'.
* wa_fields-coltext = '行项目'.
** wa_fields-emphasize = 'C410'.
* wa_fields-edit = 'X'.
* wa_fields-col_opt = 'A'.
* APPEND wa_fields TO it_fieldcat.
* CLEAR wa_fields.
endform. " set_alv_tab
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
module USER_COMMAND_0100 input.
data:OK_CODE type SY-UCOMM.
OK_CODE = SY-UCOMM.
case:OK_CODE.
when 'BACK'.
leave to screen 0.
when 'EXIT'.
leave program.
when 'CANCEL'.
leave to screen 0.
endcase.
endmodule. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& Form SER_DRODOWN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
form SER_DRODOWN .
data: LT_DROPDOWN type LVC_T_DROP,
LS_DROPDOWN like LVC_S_DROP.
data: TEMP_IT type sorted table of IT_EKKO1 with unique key MATNR EBELP with header line.
select distinct MATNR EBELP into table IT_EKKO_TMP
up to 100 rows
from EKPO.
TEMP_IT[] = IT_EKKO_TMP[].
loop at TEMP_IT .
LS_DROPDOWN-HANDLE = TEMP_IT-EBELP.
LS_DROPDOWN-VALUE = TEMP_IT-MATNR.
append LS_DROPDOWN to LT_DROPDOWN.
endloop.
call method G_GRID->SET_DROP_DOWN_TABLE
exporting
IT_DROP_DOWN = LT_DROPDOWN.
endform. " SER_DRODOWN