用OO生成ALV集成代码

*&  调用说明:
*&
*&  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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值