ALV F4帮助

这篇文章展示了如何在SAPABAP环境中处理ALV(ABAPListViewer)表格的事件,包括F4帮助、数据改变和数据保存。代码定义了数据结构,设置了表格字段,注册了事件处理器,并实现了用户交互功能,如双击插入、复制、删除和保存数据。此外,还包括了数据验证和界面反馈的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


* 类型池
TYPE-POOLS:SLIS.

* 在这个类未真正定义之前暂时定义,供其他类或者变量参照定义(如 row-30 )
CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED.

*&---------------------------------------------------------------------*
*& TYPES定义
*&---------------------------------------------------------------------*
TYPES: BEGIN OF TYP_EDIT ,
         MANDT TYPE MANDT,  " 客户端
         PERNR TYPE PERSNO, " 人员号
         NACHN TYPE NACHN,  " 姓
         ZSEX  TYPE CHAR2,  " 性别
         SCORE TYPE CHAR5,  " 分数
       END OF TYP_EDIT.
*&---------------------------------------------------------------------*
*& DATA定义
*&---------------------------------------------------------------------*
DATA: GT_FCAT   TYPE LVC_T_FCAT,
      GS_FCAT   TYPE LVC_S_FCAT,
      GT_F4     TYPE LVC_T_F4,
      GS_F4     TYPE LVC_S_F4,
      GS_EVENT  TYPE SLIS_ALV_EVENT,
      GT_EVENT  TYPE SLIS_T_EVENT,
      GS_LAYOUT TYPE LVC_S_LAYO,
      GS_GLAY   TYPE LVC_S_GLAY.

* 处理ALV用
DATA:
  EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER,
  GO_GRID        TYPE REF TO CL_GUI_ALV_GRID. " ALV List Viewer

* ALV结构
DATA:
  BEGIN OF GS_DATA ,
    PERNR  TYPE PERSNO,                          " 人员号
    NACHN  TYPE NACHN,                           " 姓
    ZSEX   TYPE CHAR2,                           " 性别
    SCORE  TYPE CHAR5,                           " 分数
    SEL(1),                              "被显示的内表,添加一个专用字段
    LIGHT  TYPE ICONNAME,                        "指示灯
    MSG    TYPE STRING,                          "消息
  END OF GS_DATA,
  GT_DATA LIKE STANDARD TABLE OF GS_DATA.

* F4帮助
DATA:
  BEGIN OF GS_F4VALUE,
    GESCH TYPE GESCH,
    ZTEXT TYPE TEXT,
  END OF GS_F4VALUE,
  GT_F4VALUE LIKE TABLE OF GS_F4VALUE.

*&---------------------------------------------------------------------*
*&       CLASS LCL_EVENT_RECEIVER DEFINITION
*&---------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER DEFINITION. " 定义
  PUBLIC SECTION.
    METHODS:
*     F4帮助
      HANDLE_F4 FOR EVENT ONF4 OF CL_GUI_ALV_GRID
        IMPORTING E_FIELDNAME
                  E_FIELDVALUE
                  ES_ROW_NO
                  ER_EVENT_DATA
                  ET_BAD_CELLS
                  E_DISPLAY,

*     DATA_CHANGED
      HANDLE_DATA_CHANGED FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
        IMPORTING ER_DATA_CHANGED,

*      DATA_CHANGED_FINISHED
      HANDLE_MODIFY FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
        IMPORTING E_MODIFIED
                  ET_GOOD_CELLS.

ENDCLASS.
*&---------------------------------------------------------------------*
*&        CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*&---------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION." 实施

  METHOD HANDLE_F4.

    PERFORM F_F4_HELP USING E_FIELDNAME
                            ES_ROW_NO.

    ER_EVENT_DATA->M_EVENT_HANDLED = 'X' .

    PERFORM REFRESH_TABLE_ALV.

  ENDMETHOD.

  METHOD HANDLE_DATA_CHANGED.

    PERFORM FRM_HANDLE_CHANGED USING ER_DATA_CHANGED.

  ENDMETHOD.                    "HANDLE_DATA_CHANGED

  METHOD HANDLE_MODIFY.

    PERFORM FRM_HANDLE_CHANGED_FINISHED USING E_MODIFIED ET_GOOD_CELLS.

  ENDMETHOD.                    "HANDLE_MODIFY

ENDCLASS.

*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.
* 获取数据
  PERFORM FRM_GET_DATA.
* 展示数据
  PERFORM FRM_SHOW_DATA.

*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       获取数据
*----------------------------------------------------------------------*
FORM FRM_GET_DATA .

  SELECT *
    INTO CORRESPONDING FIELDS OF TABLE GT_DATA
    FROM ZALV_EDIT.

  CLEAR GS_F4VALUE.
  GS_F4VALUE-GESCH = 1.
  GS_F4VALUE-ZTEXT = '男'.
  APPEND GS_F4VALUE TO GT_F4VALUE.
  CLEAR GS_F4VALUE.
  GS_F4VALUE-GESCH = 2.
  GS_F4VALUE-ZTEXT = '女'.
  APPEND GS_F4VALUE TO GT_F4VALUE.

ENDFORM.                    " FRM_GET_DATA
*&---------------------------------------------------------------------*
*&      Form  FRM_SHOW_DATA
*&---------------------------------------------------------------------*
*       展示数据
*----------------------------------------------------------------------*
FORM FRM_SHOW_DATA.

  DATA:
    LS_LAYOUT TYPE LVC_S_LAYO.

* 宏:编辑fieldcat
  DEFINE %%FCAT.
    CLEAR gs_fcat.
    gs_fcat-fieldname = &1.
    gs_fcat-scrtext_l = &2.
    gs_fcat-KEY = &3.
    gs_fcat-edit = &4.
    IF &1 = 'ZSEX'.
      gs_fcat-f4availabl = 'X'.
    ENDIF.
    gs_fcat-NO_OUT = &5.
    APPEND gs_fcat TO gt_fcat.
  END-OF-DEFINITION.

  %%FCAT: 'LIGHT'   '红绿灯' 'X' 'X' 'X',
          'PERNR'   '人员编号' 'X' 'X' '',
          'NACHN'   '姓名'     'X' 'X' '',
          'ZSEX'    '性别'     ''  'X' '',
          'SCORE'  '分数'     ''  'X' '',
          'MSG'  '消息'     ''  'X' 'X'.

* layout设定
  LS_LAYOUT-ZEBRA = ABAP_TRUE.
  LS_LAYOUT-CWIDTH_OPT  = ABAP_TRUE.
  LS_LAYOUT-BOX_FNAME = 'SEL'.  "指定这个字段为【选择块】

* 注册事件
  GS_EVENT-NAME = 'CALLER_EXIT'.
  GS_EVENT-FORM = 'F_CALLER_EXIT'.
  APPEND GS_EVENT TO GT_EVENT.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-CPROG
      I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
      I_CALLBACK_USER_COMMAND  = 'FRM_USER_COMMAND'
      IS_LAYOUT_LVC            = LS_LAYOUT
      IT_FIELDCAT_LVC          = GT_FCAT
      IT_EVENTS                = GT_EVENT
    TABLES
      T_OUTTAB                 = GT_DATA.

ENDFORM.                    " FRM_SHOW_DATA
*&---------------------------------------------------------------------*
*&      Form  F_F4_HELP
*&---------------------------------------------------------------------*
*       设置GUI状态
*----------------------------------------------------------------------*
FORM PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
  SET PF-STATUS 'STANDARD_001'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_USER_COMMAND
*&---------------------------------------------------------------------*
*& user_command功能实现
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_USER_COMMAND  USING UCOMM       TYPE SY-UCOMM
                             SELFIELD    TYPE SLIS_SELFIELD.
  DATA: LR_GRID TYPE REF TO CL_GUI_ALV_GRID.
  DATA: L_ANSWER TYPE CHAR1.
  DATA: LS_LAYOUT TYPE LVC_S_LAYO.
  DATA LT_EDIT TYPE TABLE OF TYP_EDIT.
  DATA LS_EDIT TYPE TYP_EDIT.

  LS_LAYOUT-ZEBRA = ABAP_TRUE.
  LS_LAYOUT-CWIDTH_OPT  = ABAP_TRUE.
  LS_LAYOUT-BOX_FNAME = 'SEL'.  "指定这个字段为【选择块】

  SELFIELD-REFRESH = 'X'.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = LR_GRID.

  LR_GRID->CHECK_CHANGED_DATA( ).       "refresh alv

*  LR_GRID->REFRESH_TABLE_DISPLAY( ).       "refresh alv
  CASE UCOMM.
    WHEN 'F03' OR 'F15'.
      LEAVE PROGRAM.
*      LEAVE LIST-PROCESSING. " 返回选择屏幕
    WHEN 'F12'.
      LEAVE PROGRAM.         " 退出程序
    WHEN '&INSERT'.  " 双击事件
      CLEAR GS_DATA.
      INSERT GS_DATA INTO GT_DATA INDEX 1.
      CLEAR GS_DATA.
      SELFIELD-REFRESH = 'X'.
    WHEN '&COPY'.
      READ TABLE GT_DATA WITH KEY SEL = 'X' INTO GS_DATA.

      IF SY-SUBRC = 0.
        DATA(L_I_DATA) = GT_DATA.
        DELETE L_I_DATA WHERE SEL <> ABAP_TRUE.
        APPEND LINES OF L_I_DATA TO GT_DATA.
      ELSE.
        MESSAGE '请选择复制行' TYPE 'S' DISPLAY LIKE 'E'.
      ENDIF.
    WHEN '&DELETE'.
      DELETE GT_DATA INDEX SELFIELD-TABINDEX.
    WHEN '&DATA_SAVE'.

      LOOP AT GT_DATA INTO GS_DATA.
        MOVE-CORRESPONDING GS_DATA TO LS_EDIT.
        LS_EDIT-MANDT = SY-MANDT.
        APPEND LS_EDIT TO LT_EDIT.
        CLEAR:GS_DATA,LS_EDIT.
      ENDLOOP.
      DELETE FROM ZALV_EDIT.
      INSERT  ZALV_EDIT FROM TABLE LT_EDIT.
      IF SY-SUBRC = 0.
        COMMIT WORK.
*        MESSAGE '保存成功' TYPE 'S'.
        DATA(ZFLG) = ABAP_TRUE.

      ELSE.
        CLEAR ZFLG.
        ROLLBACK WORK.
        MESSAGE '保存失败' TYPE 'S' DISPLAY LIKE 'E'.
      ENDIF.
      LOOP AT GT_DATA ASSIGNING FIELD-SYMBOL(<FS_L_DATA>).

        IF ZFLG = ABAP_TRUE.
          <FS_L_DATA>-LIGHT = ICON_GREEN_LIGHT.
          <FS_L_DATA>-MSG = '保存成功'.
        ELSE.
          <FS_L_DATA>-LIGHT = ICON_RED_LIGHT.
          <FS_L_DATA>-MSG = '保存失败'.
        ENDIF.

      ENDLOOP.
      PERFORM F_REFRESH_ALV
        USING LR_GRID.

    WHEN OTHERS.
*      LR_GRID->SET_FRONTEND_LAYOUT( LS_LAYOUT ).
*      LR_GRID->REFRESH_TABLE_DISPLAY( ).       "refresh alv
  ENDCASE.


ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  F_CALLER_EXIT
*&---------------------------------------------------------------------*
*       注册事件
*----------------------------------------------------------------------*
FORM F_CALLER_EXIT
  USING E_GRID TYPE SLIS_DATA_CALLER_EXIT.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = GO_GRID.

* 注册F4字段
  GS_F4-FIELDNAME = 'ZSEX'.
  GS_F4-REGISTER = 'X'.

  INSERT GS_F4 INTO TABLE GT_F4.

  CALL METHOD GO_GRID->REGISTER_F4_FOR_FIELDS
    EXPORTING
      IT_F4 = GT_F4[].


* 创建事件对象
  CREATE OBJECT EVENT_RECEIVER.

*注册事件
  SET HANDLER EVENT_RECEIVER->HANDLE_F4 FOR GO_GRID.
  SET HANDLER EVENT_RECEIVER->HANDLE_MODIFY FOR GO_GRID.
  SET HANDLER EVENT_RECEIVER->HANDLE_DATA_CHANGED FOR GO_GRID.

* 设置相应方式
  CALL METHOD GO_GRID->REGISTER_EDIT_EVENT
    EXPORTING
      I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER
    EXCEPTIONS
      ERROR      = 1
      OTHERS     = 2.

  CALL METHOD GO_GRID->REGISTER_EDIT_EVENT
    EXPORTING
      I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED
    EXCEPTIONS
      ERROR      = 1
      OTHERS     = 2.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  F_F4_HELP
*&---------------------------------------------------------------------*
*       F4帮助
*----------------------------------------------------------------------*
FORM F_F4_HELP
  USING E_FIELDNAME TYPE LVC_FNAME ES_ROW_NO TYPE LVC_S_ROID.

  DATA: LT_DDSHRETVAL TYPE STANDARD TABLE OF DDSHRETVAL,
        LS_DDSHRETVAL TYPE DDSHRETVAL.

  CHECK E_FIELDNAME = 'ZSEX'.
  REFRESH LT_DDSHRETVAL.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      RETFIELD         = 'ZSEX'    " Name of return field in FIELD_TAB
      DYNPPROG         = SY-REPID
      DYNPNR           = SY-DYNNR
      DYNPROFIELD      = 'ZTEXT'   " Name of screen field for value return
      VALUE_ORG        = 'S'
      CALLBACK_PROGRAM = SY-REPID
    TABLES
      VALUE_TAB        = GT_F4VALUE
      RETURN_TAB       = LT_DDSHRETVAL
    EXCEPTIONS
      PARAMETER_ERROR  = 1
      NO_VALUES_FOUND  = 2
      OTHERS           = 3.

  IF SY-SUBRC = 0 AND LT_DDSHRETVAL IS NOT INITIAL .
    CLEAR LS_DDSHRETVAL.
    READ TABLE LT_DDSHRETVAL INTO LS_DDSHRETVAL INDEX 1.
    IF LS_DDSHRETVAL-FIELDVAL IS NOT INITIAL.
      CLEAR GS_DATA.
      READ TABLE GT_DATA INTO GS_DATA INDEX ES_ROW_NO-ROW_ID.
      GS_DATA-ZSEX = LS_DDSHRETVAL-FIELDVAL.
      MODIFY GT_DATA FROM GS_DATA INDEX ES_ROW_NO-ROW_ID
                       TRANSPORTING ZSEX.
    ENDIF.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  F_F4_HELP
*&---------------------------------------------------------------------*
*       稳定刷新
*----------------------------------------------------------------------*
FORM REFRESH_TABLE_ALV.

  DATA: LS_STBL TYPE LVC_S_STBL.

  LS_STBL-ROW = 'X'."
  LS_STBL-COL = 'X'.
  CALL METHOD GO_GRID->REFRESH_TABLE_DISPLAY
    EXPORTING
      IS_STABLE = LS_STBL.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form F_REFRESH_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM F_REFRESH_ALV
  USING UR_GRID TYPE REF TO CL_GUI_ALV_GRID.

  CLEAR GT_FCAT.

  CALL METHOD UR_GRID->GET_FRONTEND_FIELDCATALOG
    IMPORTING
      ET_FIELDCATALOG = GT_FCAT[].

  LOOP AT GT_FCAT ASSIGNING FIELD-SYMBOL(<FS_L_FACT>)
    WHERE FIELDNAME = 'LIGHT'
       OR FIELDNAME = 'MSG'.

    <FS_L_FACT>-NO_OUT = SPACE.
    <FS_L_FACT>-EDIT = SPACE.

  ENDLOOP.

  CALL METHOD UR_GRID->SET_FRONTEND_FIELDCATALOG
    EXPORTING
      IT_FIELDCATALOG = GT_FCAT[].

  CALL METHOD UR_GRID->GET_FRONTEND_LAYOUT
    IMPORTING
      ES_LAYOUT = GS_LAYOUT.

  CALL METHOD UR_GRID->SET_FRONTEND_LAYOUT
    EXPORTING
      IS_LAYOUT = GS_LAYOUT.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_HANDLE_CHANGED_FINISHED
*&---------------------------------------------------------------------*
*& 当数据修改完成后触发
*&---------------------------------------------------------------------*
*&      --> E_MODIFIED
*&      --> ET_GOOD_CELLS
*&---------------------------------------------------------------------*
FORM FRM_HANDLE_CHANGED_FINISHED
  USING UP_MODIFIED UP_I_GOOD_CELLS.
  DATA: LI_MODI TYPE LVC_T_MODI,
        LW_MODI TYPE LVC_S_MODI.

  DATA: LW_STABLE TYPE LVC_S_STBL,
        LW_S_COL  TYPE LVC_S_COL.

  CLEAR: LW_STABLE .
*  CLEAR LI_DATA.
  MOVE UP_I_GOOD_CELLS  TO LI_MODI.
  READ TABLE LI_MODI INDEX 1 INTO LW_MODI.

  IF LW_MODI-FIELDNAME = 'SCORE'.
    READ TABLE GT_DATA ASSIGNING FIELD-SYMBOL(<FS_L_DATA>) INDEX LW_MODI-ROW_ID.

    IF <FS_L_DATA> IS ASSIGNED.
      IF LW_MODI-VALUE < 0.
        <FS_L_DATA>-LIGHT = ICON_RED_LIGHT.
        <FS_L_DATA>-MSG = '分数不能小于0啊'.
      ELSE.
        <FS_L_DATA>-LIGHT = ICON_GREEN_LIGHT.
        <FS_L_DATA>-MSG = ''.
      ENDIF.

    ENDIF.
  ELSE.
    RETURN.
  ENDIF.

*刷新ALV
  DATA:O_GRID TYPE REF TO CL_GUI_ALV_GRID.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = O_GRID.

  PERFORM F_REFRESH_ALV
    USING O_GRID.

  LW_STABLE-ROW = 'X'.
  LW_STABLE-COL = 'X'.

  "刷新ALV
  CALL METHOD O_GRID->REFRESH_TABLE_DISPLAY
    EXPORTING
      I_SOFT_REFRESH = 'X'
      IS_STABLE      = LW_STABLE.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_HANDLE_CHANGED
*&---------------------------------------------------------------------*
*& 在可编辑字段的数据发生变化时触发,可用来检查数据的输入正确性
*&---------------------------------------------------------------------*
*&      --> ER_DATA_CHANGED
*&---------------------------------------------------------------------*
FORM FRM_HANDLE_CHANGED
  USING UP_ER_DATA_CHANGED TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL.
  BREAK-POINT.
ENDFORM.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值