用OO生成ALV集成代码
2011-07-06 14:03
211 查看
*& 调用说明:
*&
*& 1. 创建ALV_GRID.
*& FORM CONTAINER_CREATE TABLES P_IT_TAB "显示的内表
*& USING P_CONTAINER_NAME "控件名称
*& P_CONTAINER_EVENT "被调用事件的FORM
*& P_FRM_FIELDCAT_NAME "被调用显示字段的FORM
*& CHANGING P_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER "容器控件
*& P_GRID TYPE REF TO CL_GUI_ALV_GRID. "表格
*& 1)P_IT_TAB : GRID显示的数据内表
*& 2)P_CONTAINER_NAME : CONTIANER的字符串名称
*& 3)P_CONTAINER_EVENT : GRID的事件说明
*& 4)P_FRM_FIELDCAT_NAME : ALV显示的列属性设置
*&
*& 2. GRID 事件SET
*& FORM CONTAINER_SET_EVENT USING P_EVENT
*& P_CALL_FROM_NAME
*& CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
*& 1)P_EVENT(字符串):事件名变量,可从FORM中查到对就的值
*& 2)P_CALL_FROM_NAME (字符串): 事件将会调用的FORM名称
*&
*& 3. 显示字段的FORM设置
*& FORM CONTAINER_SET_FIELDCAT USING P_FIELDNAME "内表对应的字段名
*& P_TEXT "GRID显示的TITLE
*& P_LEN "字段的长度
*& P_JUST "内表的位置(L-左,C-中间,R-RIGHT)
*& P_REF_TABLE "参照的表名(加个对应的表名,可以在GRID中实现F4的功能)
*& P_REF_FIELD "参照的字段名
*& P_CHECKBOX "复选框
*& P_HOTSPOT "热键(可配合CLICK事件一起使用)
*& P_KEY "固定的列
*& P_EDIT "编辑状态('X'-可编辑,否则不可编辑)
*& P_DO_SUM. "合计
*&
*& 4. GRID标准的TOOLBAR上工具栏设置
*& FORM DIS_TOOLBAR USING P_MENUNAME TYPE STRING.
*& 1)P_MENUNAME : 工具栏的名称('明细 按升序排序 按降序排序 查找 查找下一个 设置筛选器 总计 小计 打印 视图 输出 ')
*& 传入参数时,只需要传入参数如: '明细 按升序排序' ,程序运行后,在GRID上就会出现在,明细和按升序排序的标准图标
*&
*& 5.当GRID修改值时,得到修改值
*& FORM GET_GRID_MODI TABLES P_MODI.
*& 1)P_MODI : 定义(IT_MODI TYPE LVC_T_MODI.)
*& 2)调用的该FORM之后只需LOOP AT IT_MODI...ENDLOOP将相对应的行跟列写入内表的相对应的字段
*&
*& 6.GIRD刷新(内表的值发生改变时,刷新数据到GRID)
*& FORM GRID_REFRESH CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
*&
*& 7.用于刷新GRID光标重新定位到刷新前的行列上
*& FORM GRID_SELECT_ROW USING P_ROW_ID CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
*&
*& 8.用于刷新GRID光标重新定位到刷新前的行列上
*& FORM GRID_SELECT_CELL USING P_ROW_ID P_CELL_ID CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
*& FORM GRID_SELECT_ROW_CELL USING P_ROW P_CELL CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
*&
*& 9.获得了光标所在的行,列
*& FORM GET_GRID_CURRENT_CELL CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID P_ROW P_COL.
*&
*& 10. 设置工具栏上的自定义按钮
*& FORM SET_TOOLBAR_DEFINE_BUTTON USING P_FUNCTION P_ICON P_TEXT P_QUICKINFO P_BUTN_TYPE P_DISABLED P_CHECKED.
*& -->P_FUNCTION 功能代码
*& -->P_ICON ICON图标
*& -->P_TEXT 显示的文本
*& -->P_QUICKINFO 摘要(当鼠标移到按钮上面时显示的文本)
*& -->P_BUTN_TYPE ' '-无下拉菜单,1-有下拉菜单
*& -->P_DISABLED 可否编辑
*& -->P_CHECKED ‘X’-按下去状态
*&
*& 11. 设置GRID的TITLE
*& FORM SET_CONTAINER_TITLE USING P_TITLE.
*&
*& 12. 列宽最优
*& FORM SET_CONTIANER_GRID_WIDTH.
*&
*& 13. 获得了当前的用户自定义代码
*& FORM GET_GRID_TOOLBAR_UCOMM CHANGING P_UCOMM TYPE SY-UCOMM.
*&
*& 14. 刷新屏幕
*& FORM REFRESH_SCREEN .
*&---------------------------------------------------------------------*
"定义控件所需的变量
DATA: ALV_CLASS_FIELDCAT TYPE LVC_T_FCAT.
DATA: ALV_CLASS_LAYOUT TYPE LVC_S_LAYO.
DATA: BEGIN OF WA_DISPLAY_TOOLBAR_CHECK.
DATA: DYNNR LIKE SY-DYNNR.
INCLUDE STRUCTURE ZRANGES.
DATA: END OF WA_DISPLAY_TOOLBAR_CHECK,
IT_DISPLAY_TOOLBAR_CHECK LIKE WA_DISPLAY_TOOLBAR_CHECK OCCURS 0 WITH HEADER LINE,
IT_DISPLAY_TOOLBAR LIKE ZRANGES OCCURS 0 WITH HEADER LINE. "显示标准菜单内表
DATA: BEGIN OF WA_EVENT,
DYNGR LIKE SY-DYNGR, "屏幕号
CONT_NAME(100),
EVENTID(100),
EVENTNAME(100),
END OF WA_EVENT,
IT_EVENT LIKE WA_EVENT OCCURS 0 WITH HEADER LINE.
DATA: GRID_MODI TYPE LVC_T_MODI.
DATA: BEGIN OF WA_GRID_ROW,
ID TYPE P,
END OF WA_GRID_ROW.
DATA: BEGIN OF WA_TOOLBAR,
DYNNR LIKE SY-DYNNR, "屏幕号
FUNCTION LIKE STB_BUTTON-FUNCTION,
ICON LIKE STB_BUTTON-ICON, " 图标的名称
QUICKINFO LIKE STB_BUTTON-QUICKINFO, "关于图标的简要信息
BUTN_TYPE LIKE STB_BUTTON-BUTN_TYPE, "工具栏按钮类型
DISABLED LIKE STB_BUTTON-DISABLED,"不能使用
TEXT LIKE STB_BUTTON-TEXT, "注释( 40个字符)
CHECKED LIKE STB_BUTTON-CHECKED, "打印的
UCOMM TYPE STRING,
END OF WA_TOOLBAR,
IT_TOOLBAR LIKE WA_TOOLBAR OCCURS 0 WITH HEADER LINE .
DATA: GRID_E_UCOMM TYPE SY-UCOMM.
DATA: GRID_TITLE TYPE LVC_S_LAYO-GRID_TITLE. "GRID的TITLE
DATA: GRID_CWDTH_OPT LIKE ALV_CLASS_LAYOUT-CWIDTH_OPT.
*----------------------------------------------------------------------*
* CLASS CL_EVENT DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS CL_EVENT DEFINITION.
PUBLIC SECTION.
METHODS:
"sy-ucomm
HANDLE_COMMAND
FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID
IMPORTING E_UCOMM,
"双击事件
HANDLE_DOUBLE_CLICK
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
IMPORTING E_OBJECT E_INTERACTIVE,
HANDLE_USER_COMMAND " toolbar UCOMM
FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID "用户自定义事件的设置
IMPORTING E_UCOMM,
HANDLE_ONDROP
FOR EVENT ONDROP OF CL_GUI_ALV_GRID
IMPORTING E_ROW E_COLUMN ES_ROW_NO E_DRAGDROPOBJ,
"单击事件
HANDLE_CLICK
FOR EVENT HOTSPOT_CLICK OF CL_GUI_ALV_GRID
IMPORTING E_ROW_ID E_COLUMN_ID ES_ROW_NO,
"数据变化事件
HANDLE_CHANGED
FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
IMPORTING ER_DATA_CHANGED,
HANDLE_CHANGED_FINISHED
FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
IMPORTING E_MODIFIED ET_GOOD_CELLS.
ENDCLASS . "cl_event DEFINITION
*----------------------------------------------------------------------*
* CLASS CL_EVENT IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS CL_EVENT IMPLEMENTATION.
METHOD HANDLE_COMMAND.
PERFORM HANDLE_CALL_FORM USING 'HANDLE_COMMAND'.
ENDMETHOD. "HANDLE_COMMAND
METHOD HANDLE_DOUBLE_CLICK.
PERFORM HANDLE_CALL_FORM USING 'HANDLE_DOUBLE_CLICK'.
ENDMETHOD. "handle_double_click
METHOD HANDLE_TOOLBAR.
REFRESH IT_TOOLBAR.
PERFORM HANDLE_CALL_FORM USING 'HANDLE_TOOLBAR'.
PERFORM HANDLE_SET_STANDART_TOOLBAR. "取工具栏上的标准的图标
DELETE E_OBJECT->MT_TOOLBAR WHERE QUICKINFO IN IT_DISPLAY_TOOLBAR. "设置标准的图标
PERFORM TOOLBAR_DEFINE_BUTTON USING E_OBJECT . "增加工具栏按钮
ENDMETHOD. "handle_toolbar
METHOD HANDLE_ONDROP.
ENDMETHOD. "HANDLE_ONDROP
*---------------user_command-----------------------------------*
"用户自定义按钮事件
METHOD HANDLE_USER_COMMAND.
GRID_E_UCOMM = E_UCOMM.
PERFORM HANDLE_CALL_FORM USING 'HANDLE_USER_COMMAND'.
ENDMETHOD. "lcl_event_receiver
METHOD HANDLE_CLICK.
PERFORM HANDLE_CALL_FORM USING 'HANDLE_CLICK'.
ENDMETHOD. "HANDLE_CLICK
METHOD HANDLE_CHANGED.
GRID_MODI[] = ER_DATA_CHANGED->MT_MOD_CELLS[].
PERFORM HANDLE_CALL_FORM USING 'HANDLE_CHANGED'.
ENDMETHOD. "HANDLE_CHANGED
METHOD HANDLE_CHANGED_FINISHED.
PERFORM HANDLE_CALL_FORM USING 'HANDLE_CHANGED_FINISHED'.
ENDMETHOD. "HANDLE_CHANGED
ENDCLASS. "CL_EVENT IMPLEMENTATION
"定义事件
DATA: ALV_EVENT TYPE REF TO CL_EVENT.
DATA: ALV_APPLI TYPE REF TO CL_EVENT. "
DATA: ALV_CUR_DYNNR TYPE STRING.
DATA: ALV_SET_CUR_DYNNR TYPE STRING.
DATA: ALV_CONT_NAME(100).
*&---------------------------------------------------------------------*
*& Form FRM_GET_ALV_CURDYNNR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM FRM_GET_ALV_CURDYNNR.
DATA: FRM_TYPE LIKE D020S-TYPE.
"检查是否为子屏幕
SELECT SINGLE TYPE INTO FRM_TYPE FROM D020S WHERE PROG = SY-REPID AND DNUM = SY-DYNNR.
IF FRM_TYPE EQ 'I' .
CLEAR ALV_CUR_DYNNR.
CLEAR ALV_CONT_NAME.
RETURN.
ENDIF.
"获得事件对象
DATA: FRM_EVENT TYPE REF TO CL_GUI_EVENT.
CALL METHOD CL_GUI_CFW=>GET_CURRENT_EVENT_OBJECT
RECEIVING
EVENT_OBJECT = FRM_EVENT.
IF FRM_EVENT IS INITIAL.
CLEAR ALV_CUR_DYNNR.
CLEAR ALV_CONT_NAME.
RETURN.
ENDIF.
"从事件对象获得事件源
DATA: FRM_SRC TYPE REF TO CL_GUI_CONTROL.
FRM_SRC = FRM_EVENT->EVENT_SRC.
"从事件源的GRID中获取屏幕号
DATA: FRM_SCREEN_NAME TYPE STRING.
CALL METHOD FRM_SRC->GET_NAME
RECEIVING
NAME = FRM_SCREEN_NAME.
"从事件源中获得容器对象
DATA: FRM_PARENT TYPE REF TO CL_GUI_CONTAINER.
FRM_PARENT = FRM_SRC->PARENT.
"从容器对象获得容器名
DATA:FRM_CONTAINER TYPE STRING.
CALL METHOD FRM_PARENT->GET_NAME
RECEIVING
NAME = FRM_CONTAINER.
ALV_CUR_DYNNR = FRM_SCREEN_NAME.
ALV_CONT_NAME = FRM_CONTAINER.
ENDFORM. "FRM_GET_alv_CURDYNNR
*&---------------------------------------------------------------------*
*& Form container_init
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM CONTAINER_CREATE TABLES P_IT_TAB "显示的内表
USING P_CONTAINER_GRID_TITLE " TITLE
P_CONTAINER_NAME "控件名称
P_CONTAINER_EVENT "被调用事件的FORM
P_FRM_FIELDCAT_NAME "被调用显示字段的FORM
CHANGING P_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER "容器控件
P_GRID TYPE REF TO CL_GUI_ALV_GRID. "表格
DATA: FRM_ROW TYPE I,FRM_CELL TYPE I.
ALV_CONT_NAME = P_CONTAINER_NAME .
IF P_CONTAINER IS INITIAL.
"创建应用
CREATE OBJECT ALV_APPLI.
"创建容器控件
CREATE OBJECT P_CONTAINER
EXPORTING
CONTAINER_NAME = P_CONTAINER_NAME.
"表格
CREATE OBJECT P_GRID
EXPORTING
I_PARENT = P_CONTAINER.
"事件注册(自动接受输入的内容)
CALL METHOD P_GRID->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER.
"事件定义
CREATE OBJECT ALV_EVENT.
SET HANDLER ALV_EVENT->HANDLE_TOOLBAR FOR P_GRID. "默认工具栏是没有标准按钮
IF P_CONTAINER_EVENT IS NOT INITIAL.
PERFORM (P_CONTAINER_EVENT) IN PROGRAM .
ENDIF.
"保存屏幕号到GRID的NAME中
DATA: FRM_DYNNR TYPE STRING.
FRM_DYNNR = SY-DYNNR.
CALL METHOD P_GRID->SET_NAME
EXPORTING
NAME = FRM_DYNNR
EXCEPTIONS
CNTL_ERROR = 1
PARENT_NO_NAME = 2
ILLEGAL_NAME = 3
OTHERS = 4.
ELSE.
"取当前的行号
PERFORM GET_GRID_CURRENT_CELL CHANGING P_GRID FRM_ROW FRM_CELL.
ENDIF.
"刷新显示字段内表
REFRESH ALV_CLASS_FIELDCAT.
CLEAR ALV_CLASS_LAYOUT.
ALV_CLASS_LAYOUT-ZEBRA = 'X'. "班马线
ALV_CLASS_LAYOUT-CWIDTH_OPT = GRID_CWDTH_OPT.
ALV_CLASS_LAYOUT-GRID_TITLE = P_CONTAINER_GRID_TITLE.
"动态调用FORM获得显示字段
IF P_FRM_FIELDCAT_NAME IS INITIAL.
MESSAGE S001(00) WITH '没有找显示字段(FIELDCAT)' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
PERFORM (P_FRM_FIELDCAT_NAME) IN PROGRAM. "动态调用FORM
"将内表数据发给ALV(MAIN)的数据
CALL METHOD P_GRID->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_LAYOUT = ALV_CLASS_LAYOUT
CHANGING
IT_OUTTAB = P_IT_TAB[]
IT_FIELDCATALOG = ALV_CLASS_FIELDCAT.
PERFORM GRID_SELECT_ROW USING FRM_ROW CHANGING P_GRID.
ENDFORM. "container_init
*&---------------------------------------------------------------------*
*& Form alv_clear_ucomm
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM ALV_CLEAR_UCOMM.
CLEAR GRID_E_UCOMM.
ENDFORM. "alv_clear_ucomm
*&---------------------------------------------------------------------*
*& Form SET_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM CONTAINER_SET_FIELDCAT USING P_FIELDNAME
P_TEXT
P_LEN
P_JUST
P_REF_TABLE
P_REF_FIELD
P_CHECKBOX
P_HOTSPOT
P_KEY
P_EDIT
P_DO_SUM.
DATA: WA_FIELDCAT LIKE LINE OF ALV_CLASS_FIELDCAT.
WA_FIELDCAT-EDIT = P_EDIT.
WA_FIELDCAT-COL_OPT = 'U'.
WA_FIELDCAT-CHECKBOX = P_CHECKBOX.
WA_FIELDCAT-FIELDNAME = P_FIELDNAME .
WA_FIELDCAT-HOTSPOT = P_HOTSPOT.
WA_FIELDCAT-SCRTEXT_M = P_TEXT.
WA_FIELDCAT-DO_SUM = P_DO_SUM.
WA_FIELDCAT-REF_FIELD = P_REF_FIELD.
WA_FIELDCAT-REF_TABLE = P_REF_TABLE.
WA_FIELDCAT-OUTPUTLEN = P_LEN.
WA_FIELDCAT-KEY = P_KEY.
WA_FIELDCAT-JUST = P_JUST.
COLLECT WA_FIELDCAT INTO ALV_CLASS_FIELDCAT.
ENDFORM. "SET_FIELDCAT
*&---------------------------------------------------------------------*
*& Form container_set_event
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM CONTAINER_SET_EVENT USING P_EVENT
P_CALL_FROM_NAME
CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
CLEAR IT_EVENT.
CASE P_EVENT.
WHEN 'USER_COMMAND' OR '自定义事件' OR 'UCOMM'. "sy-ucomm
SET HANDLER ALV_EVENT->HANDLE_USER_COMMAND FOR P_GRID.
IT_EVENT-EVENTID = 'HANDLE_USER_COMMAND'.
WHEN 'COMMAND'. "sy-ucomm
SET HANDLER ALV_EVENT->HANDLE_COMMAND FOR P_GRID.
IT_EVENT-EVENTID = 'HANDLE_COMMAND'.
WHEN 'TOOLBAR' OR '工具栏'."工具栏设置
SET HANDLER ALV_EVENT->HANDLE_TOOLBAR FOR P_GRID.
IT_EVENT-EVENTID = 'HANDLE_TOOLBAR'.
WHEN 'DBCLIKE' OR '双击' OR 'DBC'."双击事件
SET HANDLER ALV_EVENT->HANDLE_DOUBLE_CLICK FOR P_GRID.
IT_EVENT-EVENTID = 'HANDLE_DOUBLE_CLICK'.
WHEN 'CLICKED' OR '单击'."单击事件
SET HANDLER ALV_EVENT->HANDLE_CLICK FOR P_GRID.
IT_EVENT-EVENTID = 'HANDLE_CLICK'.
WHEN 'CHANGED' OR '变化' OR '修改' OR 'MODIFY' OR 'MOD'."数据变化事件
SET HANDLER ALV_EVENT->HANDLE_CHANGED FOR P_GRID.
IT_EVENT-EVENTID = 'HANDLE_CHANGED'.
WHEN 'ONDROP'.
SET HANDLER ALV_EVENT->HANDLE_CHANGED FOR P_GRID.
IT_EVENT-EVENTID = 'HANDLE_ONDROP'.
* WHEN 'CHANGED_FINISHED'."数据变化事件
* SET HANDLER ALV_EVENT->HANDLE_CHANGED FOR P_GRID.
* IT_EVENT-EVENT = 'HANDLE_CHANGED_FINISHED'.
ENDCASE.
IT_EVENT-DYNGR = SY-DYNNR. "屏幕号
IT_EVENT-EVENTNAME = P_CALL_FROM_NAME. "调用的事件名(FROM)
IT_EVENT-CONT_NAME = ALV_CONT_NAME.
COLLECT IT_EVENT.
ENDFORM. "container_set_event
*&---------------------------------------------------------------------*
*& Form DIS_TOOLBAR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_MENUNAME text
*----------------------------------------------------------------------*
FORM DIS_TOOLBAR USING P_MENUNAME TYPE STRING.
"*--------- 标准工具栏所有的功能按钮 ------------------
"明细 按升序排序 按降序排序 查找 查找下一个 设置筛选器
"总计 小计 打印 视图 输出 选择格式 显示图形 最终用户文档
"*----------------------------------------------------
DATA: FRM_ITAB TYPE TABLE OF STRING WITH HEADER LINE.
REFRESH IT_DISPLAY_TOOLBAR_CHECK.
CLEAR IT_DISPLAY_TOOLBAR_CHECK.
IT_DISPLAY_TOOLBAR_CHECK-DYNNR = SY-DYNNR. "屏幕号
IF P_MENUNAME IS NOT INITIAL.
SPLIT P_MENUNAME AT SPACE INTO TABLE FRM_ITAB.
LOOP AT FRM_ITAB.
IT_DISPLAY_TOOLBAR_CHECK-SIGN = 'E'.
IT_DISPLAY_TOOLBAR_CHECK-OPTION = 'CP'.
CONCATENATE '*' FRM_ITAB '*' INTO IT_DISPLAY_TOOLBAR_CHECK-LOW.
CONDENSE IT_DISPLAY_TOOLBAR_CHECK-LOW.
APPEND IT_DISPLAY_TOOLBAR_CHECK.
ENDLOOP.
ELSE.
IT_DISPLAY_TOOLBAR_CHECK-SIGN = 'E'.
IT_DISPLAY_TOOLBAR_CHECK-OPTION = 'CP'.
IT_DISPLAY_TOOLBAR_CHECK-LOW = '!!!'.
CONDENSE IT_DISPLAY_TOOLBAR_CHECK-LOW.
APPEND IT_DISPLAY_TOOLBAR_CHECK.
ENDIF.
ENDFORM. "alv_TOOLBAR
*&---------------------------------------------------------------------*
*& Form HANDLE_CHANGED
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ET_GOOD_CELLS text
*----------------------------------------------------------------------*
FORM HANDLE_CALL_FORM USING P_EVENTID.
DATA FRM_DYNNR LIKE SY-DYNNR.
PERFORM ALV_GET_DYNNR CHANGING FRM_DYNNR.
CLEAR IT_EVENT.
IF ALV_CONT_NAME IS INITIAL.
READ TABLE IT_EVENT WITH KEY DYNGR = FRM_DYNNR
EVENTID = P_EVENTID.
ELSE.
READ TABLE IT_EVENT WITH KEY DYNGR = FRM_DYNNR
CONT_NAME = ALV_CONT_NAME
EVENTID = P_EVENTID.
ENDIF.
IF SY-SUBRC EQ 0 AND IT_EVENT-EVENTNAME IS NOT INITIAL.
PERFORM (IT_EVENT-EVENTNAME) IN PROGRAM.
ENDIF.
ENDFORM. " HANDLE_CHANGED
*&---------------------------------------------------------------------*
*& Form HANDLE_SET_STANDART_TOOLBAR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM HANDLE_SET_STANDART_TOOLBAR.
IF IT_DISPLAY_TOOLBAR_CHECK[] IS INITIAL.
PERFORM DIS_TOOLBAR USING ''.
ENDIF.
REFRESH IT_DISPLAY_TOOLBAR.
CLEAR IT_DISPLAY_TOOLBAR.
LOOP AT IT_DISPLAY_TOOLBAR_CHECK WHERE DYNNR = SY-DYNNR. "屏幕号
MOVE-CORRESPONDING IT_DISPLAY_TOOLBAR_CHECK TO IT_DISPLAY_TOOLBAR.
COLLECT IT_DISPLAY_TOOLBAR.
ENDLOOP.
ENDFORM. "HANDLE_SET_STANDART_TOOLBAR
*&---------------------------------------------------------------------*
*& Form CONTAINER_ACCEPTTEXT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM CONTAINER_ACCEPTTEXT CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
CALL METHOD P_GRID->CHECK_CHANGED_DATA.
ENDFORM. "CONTAINER_ACCEPTTEXT
*&---------------------------------------------------------------------*
*& Form GET_GRID_MODI
*&---------------------------------------------------------------------*
* 获得GRID的值(非内表值)
*----------------------------------------------------------------------*
* -->P_MODI text
*----------------------------------------------------------------------*
FORM GET_GRID_MODI TABLES P_MODI STRUCTURE LVC_S_MODI.
SORT GRID_MODI BY ROW_ID.
P_MODI[] = GRID_MODI[].
ENDFORM. "GET_GRID_MODI
*&---------------------------------------------------------------------*
*& Form grid_refresh
*&---------------------------------------------------------------------*
* 刷新ALV
*----------------------------------------------------------------------*
FORM GRID_REFRESH CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA: FRM_ROW TYPE P,
FRM_COL TYPE P.
PERFORM GET_GRID_CURRENT_CELL CHANGING P_GRID FRM_ROW FRM_COL.
"刷新
CALL METHOD P_GRID->REFRESH_TABLE_DISPLAY.
ENDFORM. "grid_refresh
*&---------------------------------------------------------------------*
*& Form grid_select_row
*&---------------------------------------------------------------------*
* 光标跳到指定的行
*----------------------------------------------------------------------*
FORM GRID_SELECT_ROW USING P_ROW_ID CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
"滚动到选中的行
DATA: FRM_POS_ROW TYPE LVC_T_ROID,
FRM_WA_POS_ROW LIKE LINE OF FRM_POS_ROW.
FRM_WA_POS_ROW-ROW_ID = P_ROW_ID.
APPEND FRM_WA_POS_ROW TO FRM_POS_ROW.
CALL METHOD P_GRID->SET_SELECTED_ROWS
EXPORTING
IT_ROW_NO = FRM_POS_ROW.
ENDFORM. "grid_select_row
*&---------------------------------------------------------------------*
*& Form grid_set_cell
*&---------------------------------------------------------------------*
* 光标跳到指定的列
*----------------------------------------------------------------------*
* -->P_CELL_ID text
*----------------------------------------------------------------------*
FORM GRID_SELECT_CELL USING P_ROW_ID P_CELL_ID CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
"将光标定位在选中的字段上
DATA: FRM_CELL TYPE LVC_S_CENO OCCURS 0.
DATA: FRM_WA_CELL LIKE LINE OF FRM_CELL.
DATA: FRM_SET_COL TYPE LVC_S_COL,
FRM_SET_ROW TYPE LVC_S_ROW,
FRM_SET_VAL TYPE LVC_VALUE.
FRM_SET_ROW-INDEX = P_ROW_ID.
FRM_WA_CELL-ROW_ID = FRM_SET_ROW.
FRM_WA_CELL-COL_ID = P_CELL_ID.
APPEND FRM_WA_CELL TO FRM_CELL.
CALL METHOD P_GRID->SET_SELECTED_CELLS_ID
EXPORTING
IT_CELLS = FRM_CELL.
ENDFORM. "grid_set_cell
*&---------------------------------------------------------------------*
*& Form GRID_SELECT_ROW_BY_TAB
*&---------------------------------------------------------------------*
* 光标跳到指定的行列
*----------------------------------------------------------------------*
* -->P_IT_ROW text
* -->P_GRID text
*----------------------------------------------------------------------*
FORM GRID_SELECT_ROW_CELL USING P_ROW P_CELL CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
"光标定位在修改的行
PERFORM GRID_SELECT_ROW USING P_ROW CHANGING P_GRID.
"光标定位在修改的行的列上
PERFORM GRID_SELECT_CELL USING P_ROW P_CELL CHANGING P_GRID.
ENDFORM. "GRID_SELECT_ROW_BY_TAB
*&---------------------------------------------------------------------*
*& Form GET_GRID_CURRENT_CELL
*&---------------------------------------------------------------------*
* 获得光标所在的行
*----------------------------------------------------------------------*
* -->P_GRID text
* -->P_ROW text
* -->P_COL text
*----------------------------------------------------------------------*
FORM GET_GRID_CURRENT_CELL CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID P_ROW P_COL.
DATA: FRM_ROW TYPE I,
FRM_VALUE(100) TYPE C,
FRM_COL TYPE I,
FRM_ROW_ID TYPE LVC_S_ROW.
"取当前的记录信息(行,列,值等等)
CALL METHOD P_GRID->GET_CURRENT_CELL
IMPORTING
E_ROW = FRM_ROW
E_VALUE = FRM_VALUE
E_COL = FRM_COL
ES_ROW_ID = FRM_ROW_ID.
P_ROW = FRM_ROW.
P_COL = FRM_COL.
ENDFORM. "GET_GRID_CURRENT_CELL
*&---------------------------------------------------------------------*
*& Form ALV_SET_DYNNR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_DYNNR text
*----------------------------------------------------------------------*
FORM ALV_SET_DYNNR USING P_DYNNR.
ALV_SET_CUR_DYNNR = P_DYNNR.
ENDFORM. "ALV_SET_DYNNR
*&---------------------------------------------------------------------*
*& Form alv_get_dynnr
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_DYNNR text
*----------------------------------------------------------------------*
FORM ALV_GET_DYNNR CHANGING P_DYNNR.
DATA FRM_DYNNR LIKE SY-DYNNR.
* DATA FRM_UCOMM TYPE SY-UCOMM.
* PERFORM GET_GRID_TOOLBAR_UCOMM CHANGING FRM_UCOMM.
* IF GRID_E_UCOMM IS NOT INITIAL.
* FRM_DYNNR = GRID_E_UCOMM(4).
* ELSE.
IF ALV_SET_CUR_DYNNR IS INITIAL.
PERFORM FRM_GET_ALV_CURDYNNR. "取当前操作的屏幕号
IF ALV_CUR_DYNNR IS NOT INITIAL.
FRM_DYNNR = ALV_CUR_DYNNR.
ELSE.
FRM_DYNNR = SY-DYNNR.
ENDIF.
P_DYNNR = FRM_DYNNR.
ELSE.
P_DYNNR = ALV_SET_CUR_DYNNR.
CLEAR ALV_SET_CUR_DYNNR.
ENDIF.
ENDFORM. "alv_get_dynnr
*&---------------------------------------------------------------------*
*& Form SET_TOOLBAR_DEFINE_BUTTON
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_FUNCTION 功能代码
* -->P_ICON ICON图标
* -->P_TEXT 显示的文本
* -->P_QUICKINFO 摘要(当鼠标移到按钮上面时显示的文本)
* -->P_BUTN_TYPE ' '-无下拉菜单,1-有下拉菜单
* -->P_DISABLED 可否编辑
* -->P_CHECKED ‘X’-按下去状态
*----------------------------------------------------------------------*
FORM SET_TOOLBAR_DEFINE_BUTTON USING P_FUNCTION P_ICON P_TEXT P_QUICKINFO P_BUTN_TYPE P_DISABLED P_CHECKED.
DATA FRM_DYNNR LIKE SY-DYNNR.
PERFORM ALV_GET_DYNNR CHANGING FRM_DYNNR.
IT_TOOLBAR-DYNNR = FRM_DYNNR. "屏幕号
"IT_TOOLBAR-FUNCTION = P_FUNCTION.
IT_TOOLBAR-UCOMM = P_FUNCTION.
IT_TOOLBAR-ICON = P_ICON.
IF P_QUICKINFO IS INITIAL.
IT_TOOLBAR-QUICKINFO = P_TEXT.
ELSE.
IT_TOOLBAR-QUICKINFO = P_QUICKINFO.
ENDIF.
IT_TOOLBAR-BUTN_TYPE = P_BUTN_TYPE.
IT_TOOLBAR-DISABLED = P_DISABLED.
IT_TOOLBAR-TEXT = P_TEXT.
IT_TOOLBAR-CHECKED = P_CHECKED.
CONCATENATE IT_TOOLBAR-DYNNR IT_TOOLBAR-UCOMM INTO IT_TOOLBAR-FUNCTION.
COLLECT IT_TOOLBAR.
ENDFORM. "set_toolbar_define_button
*&---------------------------------------------------------------------*
*& Form SET_GRID_TITLE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_TITLE text
*----------------------------------------------------------------------*
FORM SET_CONTAINER_TITLE USING P_TITLE.
GRID_TITLE = P_TITLE.
ENDFORM. "SET_GRID_TITLE
*&---------------------------------------------------------------------*
*& Form set_col_width
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM SET_CONTIANER_GRID_WIDTH.
GRID_CWDTH_OPT = 'X'.
ENDFORM. "set_col_width
*&---------------------------------------------------------------------*
*& Form TOOLBAR_DEFINE_BUTTON
*&---------------------------------------------------------------------*
* 设置TOOLBAR的按钮
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM TOOLBAR_DEFINE_BUTTON USING E_OBJECT TYPE REF TO CL_ALV_EVENT_TOOLBAR_SET .
DATA: LS_TOOLBAR TYPE STB_BUTTON.
DATA: LS_TEXT(100).
"在标准工具栏后加上自定义的按钮方法
DEFINE SET_TOOLBAR.
CLEAR LS_TOOLBAR.
MOVE &1 TO LS_TOOLBAR-FUNCTION.
MOVE &2 TO LS_TOOLBAR-ICON.
MOVE &3 TO LS_TOOLBAR-QUICKINFO.
MOVE &4 TO LS_TOOLBAR-BUTN_TYPE.
MOVE &5 TO LS_TOOLBAR-DISABLED.
MOVE &6 TO LS_TOOLBAR-TEXT.
MOVE &7 TO LS_TOOLBAR-CHECKED.
APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
END-OF-DEFINITION.
DATA FRM_DYNNR LIKE SY-DYNNR.
PERFORM ALV_GET_DYNNR CHANGING FRM_DYNNR.
"调用加上自定义的按钮方法在工具栏上增加自定义按钮
LOOP AT IT_TOOLBAR WHERE DYNNR = FRM_DYNNR.
CONCATENATE ' 'IT_TOOLBAR-TEXT INTO LS_TEXT SEPARATED BY SPACE.
SET_TOOLBAR IT_TOOLBAR-FUNCTION IT_TOOLBAR-ICON IT_TOOLBAR-QUICKINFO IT_TOOLBAR-BUTN_TYPE IT_TOOLBAR-DISABLED LS_TEXT IT_TOOLBAR-CHECKED.
ENDLOOP.
ENDFORM. " TOOLBAR_DEFINE_BUTTON
*&---------------------------------------------------------------------*
*& Form get_grid_toolbar_ucomm
*&---------------------------------------------------------------------*
* 返回当前事件的SY-UCOMM
*----------------------------------------------------------------------*
* -->P_UCOMM text
*----------------------------------------------------------------------*
FORM GET_GRID_TOOLBAR_UCOMM CHANGING P_UCOMM TYPE SY-UCOMM.
P_UCOMM = GRID_E_UCOMM+4.
ENDFORM. "get_grid_toolbar_ucomm
*&---------------------------------------------------------------------*
*& Form REFRESH_SCREEN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM REFRESH_SCREEN .
"刷新屏幕
CALL METHOD CL_GUI_CFW=>SET_NEW_OK_CODE
EXPORTING
NEW_CODE = 'OK'.
ENDFORM. " REFRESH_SCREEN`
*&---------------------------------------------------------------------*
*& Form get_selectrow
*&---------------------------------------------------------------------*
* 获得选中的列号
*----------------------------------------------------------------------*
FORM GET_SELECTROW TABLES P_ROW_NO STRUCTURE LVC_S_ROID CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA: FRM_ROW_NO TYPE LVC_T_ROID.
REFRESH P_ROW_NO.
CALL METHOD P_GRID->GET_SELECTED_ROWS
IMPORTING
ET_ROW_NO = FRM_ROW_NO.
P_ROW_NO[] = FRM_ROW_NO[].
ENDFORM. "get_selectrow
*&---------------------------------------------------------------------*
*& Form selectall
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ITAB text
* -->P_GRID text
*----------------------------------------------------------------------*
FORM SELECTALL TABLES P_ITAB CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA: FRM_ROW_NO TYPE LVC_T_ROID,
FRM_ROWID TYPE I,
FRM_WA_ROW LIKE LINE OF FRM_ROW_NO.
CLEAR FRM_ROWID.
LOOP AT P_ITAB.
ADD 1 TO FRM_ROWID.
CLEAR FRM_ROW_NO.
FRM_WA_ROW-ROW_ID = FRM_ROWID.
APPEND FRM_WA_ROW TO FRM_ROW_NO.
ENDLOOP.
CALL METHOD P_GRID->SET_SELECTED_ROWS
EXPORTING
IT_ROW_NO = FRM_ROW_NO.
ENDFORM. "selectall
*&---------------------------------------------------------------------*
*& Form SET_CELL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_CELLID text
* -->P_GRID text
*----------------------------------------------------------------------*
FORM SET_CELL USING P_ROWID P_CELLID CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA: LVC_T_CENO TYPE LVC_T_CENO,
FRM_WA_CENO LIKE LINE OF LVC_T_CENO.
FRM_WA_CENO-ROW_ID = P_ROWID.
FRM_WA_CENO-COL_ID = P_CELLID.
APPEND FRM_WA_CENO TO LVC_T_CENO.
CALL METHOD P_GRID->SET_SELECTED_CELLS_ID
EXPORTING
IT_CELLS = LVC_T_CENO.
ENDFORM. "SET_CELL
*&
*& 1. 创建ALV_GRID.
*& FORM CONTAINER_CREATE TABLES P_IT_TAB "显示的内表
*& USING P_CONTAINER_NAME "控件名称
*& P_CONTAINER_EVENT "被调用事件的FORM
*& P_FRM_FIELDCAT_NAME "被调用显示字段的FORM
*& CHANGING P_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER "容器控件
*& P_GRID TYPE REF TO CL_GUI_ALV_GRID. "表格
*& 1)P_IT_TAB : GRID显示的数据内表
*& 2)P_CONTAINER_NAME : CONTIANER的字符串名称
*& 3)P_CONTAINER_EVENT : GRID的事件说明
*& 4)P_FRM_FIELDCAT_NAME : ALV显示的列属性设置
*&
*& 2. GRID 事件SET
*& FORM CONTAINER_SET_EVENT USING P_EVENT
*& P_CALL_FROM_NAME
*& CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
*& 1)P_EVENT(字符串):事件名变量,可从FORM中查到对就的值
*& 2)P_CALL_FROM_NAME (字符串): 事件将会调用的FORM名称
*&
*& 3. 显示字段的FORM设置
*& FORM CONTAINER_SET_FIELDCAT USING P_FIELDNAME "内表对应的字段名
*& P_TEXT "GRID显示的TITLE
*& P_LEN "字段的长度
*& P_JUST "内表的位置(L-左,C-中间,R-RIGHT)
*& P_REF_TABLE "参照的表名(加个对应的表名,可以在GRID中实现F4的功能)
*& P_REF_FIELD "参照的字段名
*& P_CHECKBOX "复选框
*& P_HOTSPOT "热键(可配合CLICK事件一起使用)
*& P_KEY "固定的列
*& P_EDIT "编辑状态('X'-可编辑,否则不可编辑)
*& P_DO_SUM. "合计
*&
*& 4. GRID标准的TOOLBAR上工具栏设置
*& FORM DIS_TOOLBAR USING P_MENUNAME TYPE STRING.
*& 1)P_MENUNAME : 工具栏的名称('明细 按升序排序 按降序排序 查找 查找下一个 设置筛选器 总计 小计 打印 视图 输出 ')
*& 传入参数时,只需要传入参数如: '明细 按升序排序' ,程序运行后,在GRID上就会出现在,明细和按升序排序的标准图标
*&
*& 5.当GRID修改值时,得到修改值
*& FORM GET_GRID_MODI TABLES P_MODI.
*& 1)P_MODI : 定义(IT_MODI TYPE LVC_T_MODI.)
*& 2)调用的该FORM之后只需LOOP AT IT_MODI...ENDLOOP将相对应的行跟列写入内表的相对应的字段
*&
*& 6.GIRD刷新(内表的值发生改变时,刷新数据到GRID)
*& FORM GRID_REFRESH CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
*&
*& 7.用于刷新GRID光标重新定位到刷新前的行列上
*& FORM GRID_SELECT_ROW USING P_ROW_ID CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
*&
*& 8.用于刷新GRID光标重新定位到刷新前的行列上
*& FORM GRID_SELECT_CELL USING P_ROW_ID P_CELL_ID CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
*& FORM GRID_SELECT_ROW_CELL USING P_ROW P_CELL CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
*&
*& 9.获得了光标所在的行,列
*& FORM GET_GRID_CURRENT_CELL CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID P_ROW P_COL.
*&
*& 10. 设置工具栏上的自定义按钮
*& FORM SET_TOOLBAR_DEFINE_BUTTON USING P_FUNCTION P_ICON P_TEXT P_QUICKINFO P_BUTN_TYPE P_DISABLED P_CHECKED.
*& -->P_FUNCTION 功能代码
*& -->P_ICON ICON图标
*& -->P_TEXT 显示的文本
*& -->P_QUICKINFO 摘要(当鼠标移到按钮上面时显示的文本)
*& -->P_BUTN_TYPE ' '-无下拉菜单,1-有下拉菜单
*& -->P_DISABLED 可否编辑
*& -->P_CHECKED ‘X’-按下去状态
*&
*& 11. 设置GRID的TITLE
*& FORM SET_CONTAINER_TITLE USING P_TITLE.
*&
*& 12. 列宽最优
*& FORM SET_CONTIANER_GRID_WIDTH.
*&
*& 13. 获得了当前的用户自定义代码
*& FORM GET_GRID_TOOLBAR_UCOMM CHANGING P_UCOMM TYPE SY-UCOMM.
*&
*& 14. 刷新屏幕
*& FORM REFRESH_SCREEN .
*&---------------------------------------------------------------------*
"定义控件所需的变量
DATA: ALV_CLASS_FIELDCAT TYPE LVC_T_FCAT.
DATA: ALV_CLASS_LAYOUT TYPE LVC_S_LAYO.
DATA: BEGIN OF WA_DISPLAY_TOOLBAR_CHECK.
DATA: DYNNR LIKE SY-DYNNR.
INCLUDE STRUCTURE ZRANGES.
DATA: END OF WA_DISPLAY_TOOLBAR_CHECK,
IT_DISPLAY_TOOLBAR_CHECK LIKE WA_DISPLAY_TOOLBAR_CHECK OCCURS 0 WITH HEADER LINE,
IT_DISPLAY_TOOLBAR LIKE ZRANGES OCCURS 0 WITH HEADER LINE. "显示标准菜单内表
DATA: BEGIN OF WA_EVENT,
DYNGR LIKE SY-DYNGR, "屏幕号
CONT_NAME(100),
EVENTID(100),
EVENTNAME(100),
END OF WA_EVENT,
IT_EVENT LIKE WA_EVENT OCCURS 0 WITH HEADER LINE.
DATA: GRID_MODI TYPE LVC_T_MODI.
DATA: BEGIN OF WA_GRID_ROW,
ID TYPE P,
END OF WA_GRID_ROW.
DATA: BEGIN OF WA_TOOLBAR,
DYNNR LIKE SY-DYNNR, "屏幕号
FUNCTION LIKE STB_BUTTON-FUNCTION,
ICON LIKE STB_BUTTON-ICON, " 图标的名称
QUICKINFO LIKE STB_BUTTON-QUICKINFO, "关于图标的简要信息
BUTN_TYPE LIKE STB_BUTTON-BUTN_TYPE, "工具栏按钮类型
DISABLED LIKE STB_BUTTON-DISABLED,"不能使用
TEXT LIKE STB_BUTTON-TEXT, "注释( 40个字符)
CHECKED LIKE STB_BUTTON-CHECKED, "打印的
UCOMM TYPE STRING,
END OF WA_TOOLBAR,
IT_TOOLBAR LIKE WA_TOOLBAR OCCURS 0 WITH HEADER LINE .
DATA: GRID_E_UCOMM TYPE SY-UCOMM.
DATA: GRID_TITLE TYPE LVC_S_LAYO-GRID_TITLE. "GRID的TITLE
DATA: GRID_CWDTH_OPT LIKE ALV_CLASS_LAYOUT-CWIDTH_OPT.
*----------------------------------------------------------------------*
* CLASS CL_EVENT DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS CL_EVENT DEFINITION.
PUBLIC SECTION.
METHODS:
"sy-ucomm
HANDLE_COMMAND
FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID
IMPORTING E_UCOMM,
"双击事件
HANDLE_DOUBLE_CLICK
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
IMPORTING E_OBJECT E_INTERACTIVE,
HANDLE_USER_COMMAND " toolbar UCOMM
FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID "用户自定义事件的设置
IMPORTING E_UCOMM,
HANDLE_ONDROP
FOR EVENT ONDROP OF CL_GUI_ALV_GRID
IMPORTING E_ROW E_COLUMN ES_ROW_NO E_DRAGDROPOBJ,
"单击事件
HANDLE_CLICK
FOR EVENT HOTSPOT_CLICK OF CL_GUI_ALV_GRID
IMPORTING E_ROW_ID E_COLUMN_ID ES_ROW_NO,
"数据变化事件
HANDLE_CHANGED
FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
IMPORTING ER_DATA_CHANGED,
HANDLE_CHANGED_FINISHED
FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
IMPORTING E_MODIFIED ET_GOOD_CELLS.
ENDCLASS . "cl_event DEFINITION
*----------------------------------------------------------------------*
* CLASS CL_EVENT IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS CL_EVENT IMPLEMENTATION.
METHOD HANDLE_COMMAND.
PERFORM HANDLE_CALL_FORM USING 'HANDLE_COMMAND'.
ENDMETHOD. "HANDLE_COMMAND
METHOD HANDLE_DOUBLE_CLICK.
PERFORM HANDLE_CALL_FORM USING 'HANDLE_DOUBLE_CLICK'.
ENDMETHOD. "handle_double_click
METHOD HANDLE_TOOLBAR.
REFRESH IT_TOOLBAR.
PERFORM HANDLE_CALL_FORM USING 'HANDLE_TOOLBAR'.
PERFORM HANDLE_SET_STANDART_TOOLBAR. "取工具栏上的标准的图标
DELETE E_OBJECT->MT_TOOLBAR WHERE QUICKINFO IN IT_DISPLAY_TOOLBAR. "设置标准的图标
PERFORM TOOLBAR_DEFINE_BUTTON USING E_OBJECT . "增加工具栏按钮
ENDMETHOD. "handle_toolbar
METHOD HANDLE_ONDROP.
ENDMETHOD. "HANDLE_ONDROP
*---------------user_command-----------------------------------*
"用户自定义按钮事件
METHOD HANDLE_USER_COMMAND.
GRID_E_UCOMM = E_UCOMM.
PERFORM HANDLE_CALL_FORM USING 'HANDLE_USER_COMMAND'.
ENDMETHOD. "lcl_event_receiver
METHOD HANDLE_CLICK.
PERFORM HANDLE_CALL_FORM USING 'HANDLE_CLICK'.
ENDMETHOD. "HANDLE_CLICK
METHOD HANDLE_CHANGED.
GRID_MODI[] = ER_DATA_CHANGED->MT_MOD_CELLS[].
PERFORM HANDLE_CALL_FORM USING 'HANDLE_CHANGED'.
ENDMETHOD. "HANDLE_CHANGED
METHOD HANDLE_CHANGED_FINISHED.
PERFORM HANDLE_CALL_FORM USING 'HANDLE_CHANGED_FINISHED'.
ENDMETHOD. "HANDLE_CHANGED
ENDCLASS. "CL_EVENT IMPLEMENTATION
"定义事件
DATA: ALV_EVENT TYPE REF TO CL_EVENT.
DATA: ALV_APPLI TYPE REF TO CL_EVENT. "
DATA: ALV_CUR_DYNNR TYPE STRING.
DATA: ALV_SET_CUR_DYNNR TYPE STRING.
DATA: ALV_CONT_NAME(100).
*&---------------------------------------------------------------------*
*& Form FRM_GET_ALV_CURDYNNR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM FRM_GET_ALV_CURDYNNR.
DATA: FRM_TYPE LIKE D020S-TYPE.
"检查是否为子屏幕
SELECT SINGLE TYPE INTO FRM_TYPE FROM D020S WHERE PROG = SY-REPID AND DNUM = SY-DYNNR.
IF FRM_TYPE EQ 'I' .
CLEAR ALV_CUR_DYNNR.
CLEAR ALV_CONT_NAME.
RETURN.
ENDIF.
"获得事件对象
DATA: FRM_EVENT TYPE REF TO CL_GUI_EVENT.
CALL METHOD CL_GUI_CFW=>GET_CURRENT_EVENT_OBJECT
RECEIVING
EVENT_OBJECT = FRM_EVENT.
IF FRM_EVENT IS INITIAL.
CLEAR ALV_CUR_DYNNR.
CLEAR ALV_CONT_NAME.
RETURN.
ENDIF.
"从事件对象获得事件源
DATA: FRM_SRC TYPE REF TO CL_GUI_CONTROL.
FRM_SRC = FRM_EVENT->EVENT_SRC.
"从事件源的GRID中获取屏幕号
DATA: FRM_SCREEN_NAME TYPE STRING.
CALL METHOD FRM_SRC->GET_NAME
RECEIVING
NAME = FRM_SCREEN_NAME.
"从事件源中获得容器对象
DATA: FRM_PARENT TYPE REF TO CL_GUI_CONTAINER.
FRM_PARENT = FRM_SRC->PARENT.
"从容器对象获得容器名
DATA:FRM_CONTAINER TYPE STRING.
CALL METHOD FRM_PARENT->GET_NAME
RECEIVING
NAME = FRM_CONTAINER.
ALV_CUR_DYNNR = FRM_SCREEN_NAME.
ALV_CONT_NAME = FRM_CONTAINER.
ENDFORM. "FRM_GET_alv_CURDYNNR
*&---------------------------------------------------------------------*
*& Form container_init
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM CONTAINER_CREATE TABLES P_IT_TAB "显示的内表
USING P_CONTAINER_GRID_TITLE " TITLE
P_CONTAINER_NAME "控件名称
P_CONTAINER_EVENT "被调用事件的FORM
P_FRM_FIELDCAT_NAME "被调用显示字段的FORM
CHANGING P_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER "容器控件
P_GRID TYPE REF TO CL_GUI_ALV_GRID. "表格
DATA: FRM_ROW TYPE I,FRM_CELL TYPE I.
ALV_CONT_NAME = P_CONTAINER_NAME .
IF P_CONTAINER IS INITIAL.
"创建应用
CREATE OBJECT ALV_APPLI.
"创建容器控件
CREATE OBJECT P_CONTAINER
EXPORTING
CONTAINER_NAME = P_CONTAINER_NAME.
"表格
CREATE OBJECT P_GRID
EXPORTING
I_PARENT = P_CONTAINER.
"事件注册(自动接受输入的内容)
CALL METHOD P_GRID->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER.
"事件定义
CREATE OBJECT ALV_EVENT.
SET HANDLER ALV_EVENT->HANDLE_TOOLBAR FOR P_GRID. "默认工具栏是没有标准按钮
IF P_CONTAINER_EVENT IS NOT INITIAL.
PERFORM (P_CONTAINER_EVENT) IN PROGRAM .
ENDIF.
"保存屏幕号到GRID的NAME中
DATA: FRM_DYNNR TYPE STRING.
FRM_DYNNR = SY-DYNNR.
CALL METHOD P_GRID->SET_NAME
EXPORTING
NAME = FRM_DYNNR
EXCEPTIONS
CNTL_ERROR = 1
PARENT_NO_NAME = 2
ILLEGAL_NAME = 3
OTHERS = 4.
ELSE.
"取当前的行号
PERFORM GET_GRID_CURRENT_CELL CHANGING P_GRID FRM_ROW FRM_CELL.
ENDIF.
"刷新显示字段内表
REFRESH ALV_CLASS_FIELDCAT.
CLEAR ALV_CLASS_LAYOUT.
ALV_CLASS_LAYOUT-ZEBRA = 'X'. "班马线
ALV_CLASS_LAYOUT-CWIDTH_OPT = GRID_CWDTH_OPT.
ALV_CLASS_LAYOUT-GRID_TITLE = P_CONTAINER_GRID_TITLE.
"动态调用FORM获得显示字段
IF P_FRM_FIELDCAT_NAME IS INITIAL.
MESSAGE S001(00) WITH '没有找显示字段(FIELDCAT)' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
PERFORM (P_FRM_FIELDCAT_NAME) IN PROGRAM. "动态调用FORM
"将内表数据发给ALV(MAIN)的数据
CALL METHOD P_GRID->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_LAYOUT = ALV_CLASS_LAYOUT
CHANGING
IT_OUTTAB = P_IT_TAB[]
IT_FIELDCATALOG = ALV_CLASS_FIELDCAT.
PERFORM GRID_SELECT_ROW USING FRM_ROW CHANGING P_GRID.
ENDFORM. "container_init
*&---------------------------------------------------------------------*
*& Form alv_clear_ucomm
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM ALV_CLEAR_UCOMM.
CLEAR GRID_E_UCOMM.
ENDFORM. "alv_clear_ucomm
*&---------------------------------------------------------------------*
*& Form SET_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM CONTAINER_SET_FIELDCAT USING P_FIELDNAME
P_TEXT
P_LEN
P_JUST
P_REF_TABLE
P_REF_FIELD
P_CHECKBOX
P_HOTSPOT
P_KEY
P_EDIT
P_DO_SUM.
DATA: WA_FIELDCAT LIKE LINE OF ALV_CLASS_FIELDCAT.
WA_FIELDCAT-EDIT = P_EDIT.
WA_FIELDCAT-COL_OPT = 'U'.
WA_FIELDCAT-CHECKBOX = P_CHECKBOX.
WA_FIELDCAT-FIELDNAME = P_FIELDNAME .
WA_FIELDCAT-HOTSPOT = P_HOTSPOT.
WA_FIELDCAT-SCRTEXT_M = P_TEXT.
WA_FIELDCAT-DO_SUM = P_DO_SUM.
WA_FIELDCAT-REF_FIELD = P_REF_FIELD.
WA_FIELDCAT-REF_TABLE = P_REF_TABLE.
WA_FIELDCAT-OUTPUTLEN = P_LEN.
WA_FIELDCAT-KEY = P_KEY.
WA_FIELDCAT-JUST = P_JUST.
COLLECT WA_FIELDCAT INTO ALV_CLASS_FIELDCAT.
ENDFORM. "SET_FIELDCAT
*&---------------------------------------------------------------------*
*& Form container_set_event
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM CONTAINER_SET_EVENT USING P_EVENT
P_CALL_FROM_NAME
CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
CLEAR IT_EVENT.
CASE P_EVENT.
WHEN 'USER_COMMAND' OR '自定义事件' OR 'UCOMM'. "sy-ucomm
SET HANDLER ALV_EVENT->HANDLE_USER_COMMAND FOR P_GRID.
IT_EVENT-EVENTID = 'HANDLE_USER_COMMAND'.
WHEN 'COMMAND'. "sy-ucomm
SET HANDLER ALV_EVENT->HANDLE_COMMAND FOR P_GRID.
IT_EVENT-EVENTID = 'HANDLE_COMMAND'.
WHEN 'TOOLBAR' OR '工具栏'."工具栏设置
SET HANDLER ALV_EVENT->HANDLE_TOOLBAR FOR P_GRID.
IT_EVENT-EVENTID = 'HANDLE_TOOLBAR'.
WHEN 'DBCLIKE' OR '双击' OR 'DBC'."双击事件
SET HANDLER ALV_EVENT->HANDLE_DOUBLE_CLICK FOR P_GRID.
IT_EVENT-EVENTID = 'HANDLE_DOUBLE_CLICK'.
WHEN 'CLICKED' OR '单击'."单击事件
SET HANDLER ALV_EVENT->HANDLE_CLICK FOR P_GRID.
IT_EVENT-EVENTID = 'HANDLE_CLICK'.
WHEN 'CHANGED' OR '变化' OR '修改' OR 'MODIFY' OR 'MOD'."数据变化事件
SET HANDLER ALV_EVENT->HANDLE_CHANGED FOR P_GRID.
IT_EVENT-EVENTID = 'HANDLE_CHANGED'.
WHEN 'ONDROP'.
SET HANDLER ALV_EVENT->HANDLE_CHANGED FOR P_GRID.
IT_EVENT-EVENTID = 'HANDLE_ONDROP'.
* WHEN 'CHANGED_FINISHED'."数据变化事件
* SET HANDLER ALV_EVENT->HANDLE_CHANGED FOR P_GRID.
* IT_EVENT-EVENT = 'HANDLE_CHANGED_FINISHED'.
ENDCASE.
IT_EVENT-DYNGR = SY-DYNNR. "屏幕号
IT_EVENT-EVENTNAME = P_CALL_FROM_NAME. "调用的事件名(FROM)
IT_EVENT-CONT_NAME = ALV_CONT_NAME.
COLLECT IT_EVENT.
ENDFORM. "container_set_event
*&---------------------------------------------------------------------*
*& Form DIS_TOOLBAR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_MENUNAME text
*----------------------------------------------------------------------*
FORM DIS_TOOLBAR USING P_MENUNAME TYPE STRING.
"*--------- 标准工具栏所有的功能按钮 ------------------
"明细 按升序排序 按降序排序 查找 查找下一个 设置筛选器
"总计 小计 打印 视图 输出 选择格式 显示图形 最终用户文档
"*----------------------------------------------------
DATA: FRM_ITAB TYPE TABLE OF STRING WITH HEADER LINE.
REFRESH IT_DISPLAY_TOOLBAR_CHECK.
CLEAR IT_DISPLAY_TOOLBAR_CHECK.
IT_DISPLAY_TOOLBAR_CHECK-DYNNR = SY-DYNNR. "屏幕号
IF P_MENUNAME IS NOT INITIAL.
SPLIT P_MENUNAME AT SPACE INTO TABLE FRM_ITAB.
LOOP AT FRM_ITAB.
IT_DISPLAY_TOOLBAR_CHECK-SIGN = 'E'.
IT_DISPLAY_TOOLBAR_CHECK-OPTION = 'CP'.
CONCATENATE '*' FRM_ITAB '*' INTO IT_DISPLAY_TOOLBAR_CHECK-LOW.
CONDENSE IT_DISPLAY_TOOLBAR_CHECK-LOW.
APPEND IT_DISPLAY_TOOLBAR_CHECK.
ENDLOOP.
ELSE.
IT_DISPLAY_TOOLBAR_CHECK-SIGN = 'E'.
IT_DISPLAY_TOOLBAR_CHECK-OPTION = 'CP'.
IT_DISPLAY_TOOLBAR_CHECK-LOW = '!!!'.
CONDENSE IT_DISPLAY_TOOLBAR_CHECK-LOW.
APPEND IT_DISPLAY_TOOLBAR_CHECK.
ENDIF.
ENDFORM. "alv_TOOLBAR
*&---------------------------------------------------------------------*
*& Form HANDLE_CHANGED
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ET_GOOD_CELLS text
*----------------------------------------------------------------------*
FORM HANDLE_CALL_FORM USING P_EVENTID.
DATA FRM_DYNNR LIKE SY-DYNNR.
PERFORM ALV_GET_DYNNR CHANGING FRM_DYNNR.
CLEAR IT_EVENT.
IF ALV_CONT_NAME IS INITIAL.
READ TABLE IT_EVENT WITH KEY DYNGR = FRM_DYNNR
EVENTID = P_EVENTID.
ELSE.
READ TABLE IT_EVENT WITH KEY DYNGR = FRM_DYNNR
CONT_NAME = ALV_CONT_NAME
EVENTID = P_EVENTID.
ENDIF.
IF SY-SUBRC EQ 0 AND IT_EVENT-EVENTNAME IS NOT INITIAL.
PERFORM (IT_EVENT-EVENTNAME) IN PROGRAM.
ENDIF.
ENDFORM. " HANDLE_CHANGED
*&---------------------------------------------------------------------*
*& Form HANDLE_SET_STANDART_TOOLBAR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM HANDLE_SET_STANDART_TOOLBAR.
IF IT_DISPLAY_TOOLBAR_CHECK[] IS INITIAL.
PERFORM DIS_TOOLBAR USING ''.
ENDIF.
REFRESH IT_DISPLAY_TOOLBAR.
CLEAR IT_DISPLAY_TOOLBAR.
LOOP AT IT_DISPLAY_TOOLBAR_CHECK WHERE DYNNR = SY-DYNNR. "屏幕号
MOVE-CORRESPONDING IT_DISPLAY_TOOLBAR_CHECK TO IT_DISPLAY_TOOLBAR.
COLLECT IT_DISPLAY_TOOLBAR.
ENDLOOP.
ENDFORM. "HANDLE_SET_STANDART_TOOLBAR
*&---------------------------------------------------------------------*
*& Form CONTAINER_ACCEPTTEXT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM CONTAINER_ACCEPTTEXT CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
CALL METHOD P_GRID->CHECK_CHANGED_DATA.
ENDFORM. "CONTAINER_ACCEPTTEXT
*&---------------------------------------------------------------------*
*& Form GET_GRID_MODI
*&---------------------------------------------------------------------*
* 获得GRID的值(非内表值)
*----------------------------------------------------------------------*
* -->P_MODI text
*----------------------------------------------------------------------*
FORM GET_GRID_MODI TABLES P_MODI STRUCTURE LVC_S_MODI.
SORT GRID_MODI BY ROW_ID.
P_MODI[] = GRID_MODI[].
ENDFORM. "GET_GRID_MODI
*&---------------------------------------------------------------------*
*& Form grid_refresh
*&---------------------------------------------------------------------*
* 刷新ALV
*----------------------------------------------------------------------*
FORM GRID_REFRESH CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA: FRM_ROW TYPE P,
FRM_COL TYPE P.
PERFORM GET_GRID_CURRENT_CELL CHANGING P_GRID FRM_ROW FRM_COL.
"刷新
CALL METHOD P_GRID->REFRESH_TABLE_DISPLAY.
ENDFORM. "grid_refresh
*&---------------------------------------------------------------------*
*& Form grid_select_row
*&---------------------------------------------------------------------*
* 光标跳到指定的行
*----------------------------------------------------------------------*
FORM GRID_SELECT_ROW USING P_ROW_ID CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
"滚动到选中的行
DATA: FRM_POS_ROW TYPE LVC_T_ROID,
FRM_WA_POS_ROW LIKE LINE OF FRM_POS_ROW.
FRM_WA_POS_ROW-ROW_ID = P_ROW_ID.
APPEND FRM_WA_POS_ROW TO FRM_POS_ROW.
CALL METHOD P_GRID->SET_SELECTED_ROWS
EXPORTING
IT_ROW_NO = FRM_POS_ROW.
ENDFORM. "grid_select_row
*&---------------------------------------------------------------------*
*& Form grid_set_cell
*&---------------------------------------------------------------------*
* 光标跳到指定的列
*----------------------------------------------------------------------*
* -->P_CELL_ID text
*----------------------------------------------------------------------*
FORM GRID_SELECT_CELL USING P_ROW_ID P_CELL_ID CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
"将光标定位在选中的字段上
DATA: FRM_CELL TYPE LVC_S_CENO OCCURS 0.
DATA: FRM_WA_CELL LIKE LINE OF FRM_CELL.
DATA: FRM_SET_COL TYPE LVC_S_COL,
FRM_SET_ROW TYPE LVC_S_ROW,
FRM_SET_VAL TYPE LVC_VALUE.
FRM_SET_ROW-INDEX = P_ROW_ID.
FRM_WA_CELL-ROW_ID = FRM_SET_ROW.
FRM_WA_CELL-COL_ID = P_CELL_ID.
APPEND FRM_WA_CELL TO FRM_CELL.
CALL METHOD P_GRID->SET_SELECTED_CELLS_ID
EXPORTING
IT_CELLS = FRM_CELL.
ENDFORM. "grid_set_cell
*&---------------------------------------------------------------------*
*& Form GRID_SELECT_ROW_BY_TAB
*&---------------------------------------------------------------------*
* 光标跳到指定的行列
*----------------------------------------------------------------------*
* -->P_IT_ROW text
* -->P_GRID text
*----------------------------------------------------------------------*
FORM GRID_SELECT_ROW_CELL USING P_ROW P_CELL CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
"光标定位在修改的行
PERFORM GRID_SELECT_ROW USING P_ROW CHANGING P_GRID.
"光标定位在修改的行的列上
PERFORM GRID_SELECT_CELL USING P_ROW P_CELL CHANGING P_GRID.
ENDFORM. "GRID_SELECT_ROW_BY_TAB
*&---------------------------------------------------------------------*
*& Form GET_GRID_CURRENT_CELL
*&---------------------------------------------------------------------*
* 获得光标所在的行
*----------------------------------------------------------------------*
* -->P_GRID text
* -->P_ROW text
* -->P_COL text
*----------------------------------------------------------------------*
FORM GET_GRID_CURRENT_CELL CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID P_ROW P_COL.
DATA: FRM_ROW TYPE I,
FRM_VALUE(100) TYPE C,
FRM_COL TYPE I,
FRM_ROW_ID TYPE LVC_S_ROW.
"取当前的记录信息(行,列,值等等)
CALL METHOD P_GRID->GET_CURRENT_CELL
IMPORTING
E_ROW = FRM_ROW
E_VALUE = FRM_VALUE
E_COL = FRM_COL
ES_ROW_ID = FRM_ROW_ID.
P_ROW = FRM_ROW.
P_COL = FRM_COL.
ENDFORM. "GET_GRID_CURRENT_CELL
*&---------------------------------------------------------------------*
*& Form ALV_SET_DYNNR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_DYNNR text
*----------------------------------------------------------------------*
FORM ALV_SET_DYNNR USING P_DYNNR.
ALV_SET_CUR_DYNNR = P_DYNNR.
ENDFORM. "ALV_SET_DYNNR
*&---------------------------------------------------------------------*
*& Form alv_get_dynnr
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_DYNNR text
*----------------------------------------------------------------------*
FORM ALV_GET_DYNNR CHANGING P_DYNNR.
DATA FRM_DYNNR LIKE SY-DYNNR.
* DATA FRM_UCOMM TYPE SY-UCOMM.
* PERFORM GET_GRID_TOOLBAR_UCOMM CHANGING FRM_UCOMM.
* IF GRID_E_UCOMM IS NOT INITIAL.
* FRM_DYNNR = GRID_E_UCOMM(4).
* ELSE.
IF ALV_SET_CUR_DYNNR IS INITIAL.
PERFORM FRM_GET_ALV_CURDYNNR. "取当前操作的屏幕号
IF ALV_CUR_DYNNR IS NOT INITIAL.
FRM_DYNNR = ALV_CUR_DYNNR.
ELSE.
FRM_DYNNR = SY-DYNNR.
ENDIF.
P_DYNNR = FRM_DYNNR.
ELSE.
P_DYNNR = ALV_SET_CUR_DYNNR.
CLEAR ALV_SET_CUR_DYNNR.
ENDIF.
ENDFORM. "alv_get_dynnr
*&---------------------------------------------------------------------*
*& Form SET_TOOLBAR_DEFINE_BUTTON
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_FUNCTION 功能代码
* -->P_ICON ICON图标
* -->P_TEXT 显示的文本
* -->P_QUICKINFO 摘要(当鼠标移到按钮上面时显示的文本)
* -->P_BUTN_TYPE ' '-无下拉菜单,1-有下拉菜单
* -->P_DISABLED 可否编辑
* -->P_CHECKED ‘X’-按下去状态
*----------------------------------------------------------------------*
FORM SET_TOOLBAR_DEFINE_BUTTON USING P_FUNCTION P_ICON P_TEXT P_QUICKINFO P_BUTN_TYPE P_DISABLED P_CHECKED.
DATA FRM_DYNNR LIKE SY-DYNNR.
PERFORM ALV_GET_DYNNR CHANGING FRM_DYNNR.
IT_TOOLBAR-DYNNR = FRM_DYNNR. "屏幕号
"IT_TOOLBAR-FUNCTION = P_FUNCTION.
IT_TOOLBAR-UCOMM = P_FUNCTION.
IT_TOOLBAR-ICON = P_ICON.
IF P_QUICKINFO IS INITIAL.
IT_TOOLBAR-QUICKINFO = P_TEXT.
ELSE.
IT_TOOLBAR-QUICKINFO = P_QUICKINFO.
ENDIF.
IT_TOOLBAR-BUTN_TYPE = P_BUTN_TYPE.
IT_TOOLBAR-DISABLED = P_DISABLED.
IT_TOOLBAR-TEXT = P_TEXT.
IT_TOOLBAR-CHECKED = P_CHECKED.
CONCATENATE IT_TOOLBAR-DYNNR IT_TOOLBAR-UCOMM INTO IT_TOOLBAR-FUNCTION.
COLLECT IT_TOOLBAR.
ENDFORM. "set_toolbar_define_button
*&---------------------------------------------------------------------*
*& Form SET_GRID_TITLE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_TITLE text
*----------------------------------------------------------------------*
FORM SET_CONTAINER_TITLE USING P_TITLE.
GRID_TITLE = P_TITLE.
ENDFORM. "SET_GRID_TITLE
*&---------------------------------------------------------------------*
*& Form set_col_width
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM SET_CONTIANER_GRID_WIDTH.
GRID_CWDTH_OPT = 'X'.
ENDFORM. "set_col_width
*&---------------------------------------------------------------------*
*& Form TOOLBAR_DEFINE_BUTTON
*&---------------------------------------------------------------------*
* 设置TOOLBAR的按钮
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM TOOLBAR_DEFINE_BUTTON USING E_OBJECT TYPE REF TO CL_ALV_EVENT_TOOLBAR_SET .
DATA: LS_TOOLBAR TYPE STB_BUTTON.
DATA: LS_TEXT(100).
"在标准工具栏后加上自定义的按钮方法
DEFINE SET_TOOLBAR.
CLEAR LS_TOOLBAR.
MOVE &1 TO LS_TOOLBAR-FUNCTION.
MOVE &2 TO LS_TOOLBAR-ICON.
MOVE &3 TO LS_TOOLBAR-QUICKINFO.
MOVE &4 TO LS_TOOLBAR-BUTN_TYPE.
MOVE &5 TO LS_TOOLBAR-DISABLED.
MOVE &6 TO LS_TOOLBAR-TEXT.
MOVE &7 TO LS_TOOLBAR-CHECKED.
APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
END-OF-DEFINITION.
DATA FRM_DYNNR LIKE SY-DYNNR.
PERFORM ALV_GET_DYNNR CHANGING FRM_DYNNR.
"调用加上自定义的按钮方法在工具栏上增加自定义按钮
LOOP AT IT_TOOLBAR WHERE DYNNR = FRM_DYNNR.
CONCATENATE ' 'IT_TOOLBAR-TEXT INTO LS_TEXT SEPARATED BY SPACE.
SET_TOOLBAR IT_TOOLBAR-FUNCTION IT_TOOLBAR-ICON IT_TOOLBAR-QUICKINFO IT_TOOLBAR-BUTN_TYPE IT_TOOLBAR-DISABLED LS_TEXT IT_TOOLBAR-CHECKED.
ENDLOOP.
ENDFORM. " TOOLBAR_DEFINE_BUTTON
*&---------------------------------------------------------------------*
*& Form get_grid_toolbar_ucomm
*&---------------------------------------------------------------------*
* 返回当前事件的SY-UCOMM
*----------------------------------------------------------------------*
* -->P_UCOMM text
*----------------------------------------------------------------------*
FORM GET_GRID_TOOLBAR_UCOMM CHANGING P_UCOMM TYPE SY-UCOMM.
P_UCOMM = GRID_E_UCOMM+4.
ENDFORM. "get_grid_toolbar_ucomm
*&---------------------------------------------------------------------*
*& Form REFRESH_SCREEN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM REFRESH_SCREEN .
"刷新屏幕
CALL METHOD CL_GUI_CFW=>SET_NEW_OK_CODE
EXPORTING
NEW_CODE = 'OK'.
ENDFORM. " REFRESH_SCREEN`
*&---------------------------------------------------------------------*
*& Form get_selectrow
*&---------------------------------------------------------------------*
* 获得选中的列号
*----------------------------------------------------------------------*
FORM GET_SELECTROW TABLES P_ROW_NO STRUCTURE LVC_S_ROID CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA: FRM_ROW_NO TYPE LVC_T_ROID.
REFRESH P_ROW_NO.
CALL METHOD P_GRID->GET_SELECTED_ROWS
IMPORTING
ET_ROW_NO = FRM_ROW_NO.
P_ROW_NO[] = FRM_ROW_NO[].
ENDFORM. "get_selectrow
*&---------------------------------------------------------------------*
*& Form selectall
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ITAB text
* -->P_GRID text
*----------------------------------------------------------------------*
FORM SELECTALL TABLES P_ITAB CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA: FRM_ROW_NO TYPE LVC_T_ROID,
FRM_ROWID TYPE I,
FRM_WA_ROW LIKE LINE OF FRM_ROW_NO.
CLEAR FRM_ROWID.
LOOP AT P_ITAB.
ADD 1 TO FRM_ROWID.
CLEAR FRM_ROW_NO.
FRM_WA_ROW-ROW_ID = FRM_ROWID.
APPEND FRM_WA_ROW TO FRM_ROW_NO.
ENDLOOP.
CALL METHOD P_GRID->SET_SELECTED_ROWS
EXPORTING
IT_ROW_NO = FRM_ROW_NO.
ENDFORM. "selectall
*&---------------------------------------------------------------------*
*& Form SET_CELL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_CELLID text
* -->P_GRID text
*----------------------------------------------------------------------*
FORM SET_CELL USING P_ROWID P_CELLID CHANGING P_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA: LVC_T_CENO TYPE LVC_T_CENO,
FRM_WA_CENO LIKE LINE OF LVC_T_CENO.
FRM_WA_CENO-ROW_ID = P_ROWID.
FRM_WA_CENO-COL_ID = P_CELLID.
APPEND FRM_WA_CENO TO LVC_T_CENO.
CALL METHOD P_GRID->SET_SELECTED_CELLS_ID
EXPORTING
IT_CELLS = LVC_T_CENO.
ENDFORM. "SET_CELL
相关文章推荐
- 基于Metronic的Bootstrap开发框架经验总结(18)-- 在代码生成工具Database2Sharp中集成对Bootstrap-table插件的分页及排序支持
- 根据powerdesigner的OO模型生成C#代码
- 与VS集成的若干种代码生成解决方案[博文汇总(共8篇)]
- 使用Eclipse的Generator MyBatis/iBatis Artifacts插件自动生成代码,与spring集成
- 如何在myeclipse中集成mybatis generator集成代码反向生成工具
- 一个轻量小巧的集成在vs里的代码生成工具
- 使用Eclipse的Generator MyBatis/iBatis Artifacts插件自动生成代码,与spring集成
- MVC 5 Scaffolder + EntityFramework+UnitOfWork Pattern 代码生成工具集成Visual Studio 2013
- 根据powerdesigner的OO模型生成C#代码
- J2ee项目从0搭建(八):集成Mybatis、mybatis-generator代码生成、Oracle数据库
- gcov和lcov的对C++代码覆盖率生成以及与Hudson的集成
- 集成框架 javaweb开发平台ssmy_m(生成代码) java struts2 mybatis spring maven jquery
- J2ee项目从0搭建(七):集成Mybatis、mybatis-generator代码生成、MySQL数据库
- dbsharper集成在vs中的代码生成工具
- 集成TFS Build生成与SonarQube获取代码分析结果
- 一个轻量小巧的集成在vs里的代码生成工具
- myEclipse2014集成MyBatis插件自动生成代码
- ALV自动生成代码
- YbSoftwareFactory 代码生成插件【二十三】:集成强大的公文流转系统
- myEclipse2014集成MyBatis插件自动生成代码