ALV DataChange EVENT

在CX项目中,根据需求,自定义一个表,维护供应商的银行账号信息,当输入供应商编号时,自动在供应商名称列里自动填写供应商名称,用到了ALV  DataChange 事件 ,下面是源代码:


*&---------------------------------------------------------------------*
*& REPORT  ZMM_LIFNR_BANK
*&
*&---------------------------------------------------------------------*
*& PROGRAM NAME     : ZMM_LIFNR_BANK
*& DESCRIPTION      :
*& AUTHOR           :
*& DATE WRITTEN     :
*& TCODE            :
*& NOTE             :
*&---------------------------------------------------------------------*

REPORT ZMM_LIFNR_BANK.
*INCLUDE ZMMLIFNRBANKTOP.



TABLES:ZXK001.
TYPE-POOLS:SLIS.

TYPES BEGIN OF TY_ITAB.
TYPES CHK.
      INCLUDE TYPE ZXK001.
TYPES END OF TY_ITAB.


DATA: IT_ZXK001 TYPE TABLE OF  TY_ITAB WITH HEADER LINE.
DATA: WA_IT_ZXK001 TYPE TY_ITAB.

DATA: ITZXK001 LIKE TABLE OF ZXK001 WITH HEADER LINE.

DATA: GT_FIELDCAT TYPE LVC_T_FCAT WITH HEADER LINE.
DATA: GC_GLAY TYPE LVC_S_GLAY.
DATA: GS_LAYOUT    TYPE LVC_S_LAYO,     "SLIS_LAYOUT_ALV,
      WK_REPID     LIKE SY-REPID.
DATA GS_GRID TYPE LVC_S_GLAY.
DATA TEM_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA GT_EVENTS TYPE SLIS_T_EVENT.
DATA GS_EVENTS LIKE LINE OF GT_EVENTS.


*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER DEFINITION"定义类 捕捉各种事件
  PUBLIC SECTION.
    METHODS HANDLE_MODIFY                   "回车
    FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
    IMPORTING E_MODIFIED ET_GOOD_CELLS.

    METHODS HANDLE_ONF4                     "F4
    FOR EVENT ONF4 OF CL_GUI_ALV_GRID
    IMPORTING E_FIELDNAME ES_ROW_NO ER_EVENT_DATA.
ENDCLASS.                    "LCL_EVENT_RECEIVER DEFINITION
DATA GT_EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER .


SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-B01.
SELECT-OPTIONS:
         S_LIFNR FOR ZXK001-LIFNR.
SELECTION-SCREEN END OF BLOCK B1.



START-OF-SELECTION.
  PERFORM GET_DATA.
  PERFORM DISPLAY_DATA.

*&---------------------------------------------------------------------*
*&      FORM  GET_DATA
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
FORM GET_DATA.


  SELECT * INTO CORRESPONDING FIELDS OF TABLE IT_ZXK001 FROM ZXK001 WHERE LIFNR IN S_LIFNR.


ENDFORM.                    "GET_DATA

*&---------------------------------------------------------------------*
*&      FORM  DISPLAY_DATA
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM DISPLAY_DATA .
  DEFINE FILL_ALV.
    CLEAR GT_FIELDCAT.
    GT_FIELDCAT-FIELDNAME = &1.
    GT_FIELDCAT-SCRTEXT_M = &2 .
*    GT_FIELDCAT-OUTPUTLEN = &3.
    GT_FIELDCAT-NO_ZERO   = &3.
    GT_FIELDCAT-DECIMALS_O   = &4.
    APPEND GT_FIELDCAT.
  END-OF-DEFINITION.

  FILL_ALV 'LIFNR'   '供应商编号    '  '' ''.
  FILL_ALV 'NAME1'   '供应商名称    '  '' ''.
  FILL_ALV 'BANKN'   '开户银行 '    '  ' ''.
  FILL_ALV 'IBAN'    '银行账号    '   '' ''.

  LOOP AT GT_FIELDCAT WHERE FIELDNAME = 'LIFNR'
                         OR  FIELDNAME = 'BANKN'
                         OR  FIELDNAME = 'NAME1'
                         OR  FIELDNAME = 'IBAN'.

    IF GT_FIELDCAT-FIELDNAME <> 'NAME1'.
       GT_FIELDCAT-EDIT = 'X'.
    ENDIF.

    IF GT_FIELDCAT-FIELDNAME = 'NAME1'.
       GT_FIELDCAT-OUTPUTLEN = '30'.
    ENDIF.
    IF GT_FIELDCAT-FIELDNAME = 'LIFNR'.
*      GT_FIELDCAT-REF_FIELD = 'LIFNR'.
*      GT_FIELDCAT-REF_TABLE = 'LFA1'.
      GT_FIELDCAT-OUTPUTLEN = '20'.

    ENDIF.
    IF GT_FIELDCAT-FIELDNAME = 'BANKN'.
      GT_FIELDCAT-REF_FIELD = 'BANKN'.
      GT_FIELDCAT-REF_TABLE = 'TIBAN'.
      GT_FIELDCAT-OUTPUTLEN = '35'.

    ENDIF.
    IF GT_FIELDCAT-FIELDNAME = 'IBAN'.
      GT_FIELDCAT-REF_FIELD = 'IBAN'.
      GT_FIELDCAT-REF_TABLE = 'TIBAN'.
      GT_FIELDCAT-OUTPUTLEN = '34'.
    ENDIF.


    MODIFY GT_FIELDCAT.
  ENDLOOP.

  GS_LAYOUT-STYLEFNAME   = 'FSTYLE'.
  GS_LAYOUT-ZEBRA        = 'X'.
*  GS_LAYOUT-CWIDTH_OPT   = 'X'.
  GS_LAYOUT-BOX_FNAME = 'CHK'.

  GS_GRID-EDT_CLL_CB = 'X'.

*  **************定义事件FORM名称*********************
  GS_EVENTS-NAME = 'CALLER_EXIT'.
  GS_EVENTS-FORM = 'CALLER_EXIT'.
  APPEND GS_EVENTS TO GT_EVENTS.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_USER_COMMAND  = 'USER_COMMAND'
*      I_CALLBACK_TOP_OF_PAGE   = 'TOP_OF_PAGE'
      I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS'
      IT_FIELDCAT_LVC          = GT_FIELDCAT[]
      I_GRID_SETTINGS          = GS_GRID
      IS_LAYOUT_LVC            = GS_LAYOUT
      I_SAVE                   = 'X'
      IT_EVENTS                = GT_EVENTS
    TABLES
      T_OUTTAB                 = IT_ZXK001.


ENDFORM.                    " DISPLAY_DATA

*&---------------------------------------------------------------------*
*&      FORM  SET_PF_STATUS
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->EXTAB      TEXT
*----------------------------------------------------------------------*
FORM SET_PF_STATUS  USING EXTAB TYPE SLIS_T_EXTAB.          "#EC CALLED
  SET PF-STATUS '1000' .
ENDFORM.                    "WHOLE_TOOLBAR

*&---------------------------------------------------------------------*
*&      FORM  USER_COMMAND
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->RF_UCOMM   TEXT
*      -->RS         TEXT
*----------------------------------------------------------------------*
FORM USER_COMMAND USING RF_UCOMM LIKE SY-UCOMM
                          RS TYPE SLIS_SELFIELD.
  DATA:P_COUNT TYPE I.
  DATA: P_ANSWER(1).
  DATA: LR_GRID TYPE REF TO CL_GUI_ALV_GRID.
  DATA LV_ANSWER.
  DATA LS_STYLEROW TYPE LVC_S_STYL .
  DATA LT_STYLETAB TYPE LVC_T_STYL .

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = LR_GRID.
  CALL METHOD LR_GRID->CHECK_CHANGED_DATA.
  RS-REFRESH = 'X'.  "自动刷新

  CASE RF_UCOMM.
    WHEN '&NEW'.
        IT_ZXK001-LIFNR = ''.
        IT_ZXK001-NAME1 = ''.
        IT_ZXK001-BANKN = ''.
        IT_ZXK001-IBAN  = ''.
        APPEND IT_ZXK001.
        CLEAR IT_ZXK001.

    WHEN '&DEL'.

        CLEAR P_COUNT.

        LOOP AT IT_ZXK001 WHERE CHK = 'X'.
              P_COUNT = 1.
              EXIT.
        ENDLOOP.

        IF P_COUNT <= 0.
            MESSAGE '请选择要删除的数据!' TYPE 'I'.
            RETURN.
        ELSE.
            CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
                     EXPORTING
                         TEXTLINE1            = '确认要删除所选记录吗?'
                         TITEL                = '确认提示'
                         CANCEL_DISPLAY       = ''
                     IMPORTING
                         ANSWER               = P_ANSWER.
                CHECK P_ANSWER = 'J'.
                IF P_ANSWER = 'J'.
                    LOOP AT IT_ZXK001 WHERE CHK = 'X'.
                         DELETE FROM ZXK001 WHERE LIFNR = IT_ZXK001-LIFNR.
                         DELETE IT_ZXK001.
                    ENDLOOP.
                ENDIF.
        ENDIF.
    WHEN '&SAVE'.

        CLEAR P_COUNT.

        LOOP AT IT_ZXK001 WHERE LIFNR = ''.
              P_COUNT = 1.
              EXIT.
        ENDLOOP.
        IF P_COUNT > 0.
            MESSAGE '供应商字段不能为空!' TYPE 'I'.
            RETURN.
        ELSE.

            REFRESH ITZXK001.
            CLEAR ITZXK001.
            LOOP AT IT_ZXK001.
                  MOVE-CORRESPONDING IT_ZXK001 TO ITZXK001.
                  APPEND ITZXK001.
                  CLEAR ITZXK001.
            ENDLOOP.

            MODIFY ZXK001 FROM TABLE ITZXK001.
            IF SY-SUBRC EQ 0.
               COMMIT WORK.
               MESSAGE S000(ZMM001).
            ELSE.
               ROLLBACK WORK.
               MESSAGE S001(ZMM001).
            ENDIF.
        ENDIF.

    WHEN OTHERS.

  ENDCASE.
ENDFORM.                    "USER_COMMAND

*&---------------------------------------------------------------------*
*&      FORM  CALLER_EXIT
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->E_GRID     TEXT
*----------------------------------------------------------------------*
FORM CALLER_EXIT USING E_GRID TYPE SLIS_DATA_CALLER_EXIT.

  DATA: L_FIELD TYPE LVC_FNAME,
        LT_F4   TYPE LVC_T_F4,
        LS_F4   TYPE LVC_S_F4.

*  LS_F4-FIELDNAME  = 'UMSKZ'.
*  LS_F4-REGISTER   = 'X'.
  "LS_F4-GETBEFORE  = 'X'. "打'X'会在弹出窗体之前先刷新ALV数据
  "LS_F4-CHNGEAFTER = 'X'. "打'X'会在关闭窗体之后刷新ALV数据
  "LS_F4-INTERNAL   = ''.
  INSERT LS_F4 INTO TABLE LT_F4.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = TEM_GRID.

  CALL METHOD TEM_GRID->REGISTER_EDIT_EVENT     "注册GRID事件
    EXPORTING
      I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER"事件:回车
    EXCEPTIONS
      ERROR      = 1
      OTHERS     = 2.

*  CALL METHOD TEM_GRID->REGISTER_F4_FOR_FIELDS
*    EXPORTING
*      IT_F4 = LT_F4.

  CREATE OBJECT GT_EVENT_RECEIVER.
  SET HANDLER GT_EVENT_RECEIVER->HANDLE_MODIFY FOR TEM_GRID.
  SET HANDLER GT_EVENT_RECEIVER->HANDLE_ONF4   FOR TEM_GRID.

ENDFORM.                    "CALLER_EXIT




*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION"实现类 处理回车事件

  METHOD HANDLE_MODIFY.
    DATA LS_STYLEROW TYPE LVC_S_STYL .
    DATA LT_STYLETAB TYPE LVC_T_STYL .
    DATA STBL TYPE LVC_S_STBL.


    LOOP AT IT_ZXK001 INTO WA_IT_ZXK001.


         SELECT SINGLE
                NAME1
                INTO WA_IT_ZXK001-NAME1
                FROM LFA1
                WHERE LIFNR = WA_IT_ZXK001-LIFNR.
         MODIFY IT_ZXK001 FROM WA_IT_ZXK001.
    ENDLOOP.

    STBL-ROW = 'X'." 基于行的稳定刷新
    STBL-COL = 'X'." 基于列稳定刷新
    CALL METHOD TEM_GRID->REFRESH_TABLE_DISPLAY
      EXPORTING
        IS_STABLE = STBL.
  ENDMETHOD.                    "HANDLE_MODIFY

  METHOD HANDLE_ONF4.
    DATA :PT_RET TYPE TABLE OF DDSHRETVAL ,
          PS_RET TYPE DDSHRETVAL ,
          LS_MODI TYPE LVC_S_MODI.
    FIELD-SYMBOLS <MODTAB> TYPE LVC_T_MODI.

*    SELECT SHBKZ AS UMSKZ
*           LTEXT
*      INTO TABLE ITHELP
*      FROM T074T
*      WHERE KOART = 'D'
*      AND   SPRAS = '1'.
*
*    CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
*      EXPORTING
*        RETFIELD        = 'UMSKZ'        "内表的关键字段名
*        VALUE_ORG       = 'S'             "'S'
*        DYNPPROG        = SY-REPID      "文本框PROGRAM
*        DYNPNR          = SY-DYNNR       "文本框所在屏幕
*        DYNPROFIELD     = '特殊总账标识'  "文本框名
*        WINDOW_TITLE    = '标题'         "窗体标题
*      TABLES
*        VALUE_TAB       = ITHELP "内表
*                                                                                                                                                                                                                                   "FIELD_TAB       = T_FIELD
*        RETURN_TAB      = PT_RET "返回选择的数据
*      EXCEPTIONS
*        PARAMETER_ERROR = 1
*        NO_VALUES_FOUND = 2
*        OTHERS          = 3.

**    处理 PT_RET 返回的数据,更新ALV CELL即可
    READ TABLE PT_RET INTO PS_RET INDEX 1 .
    IF SY-SUBRC = 0.
      LS_MODI-ROW_ID = ES_ROW_NO-ROW_ID.
      LS_MODI-FIELDNAME = E_FIELDNAME.
      LS_MODI-VALUE = PS_RET-FIELDVAL.
      ASSIGN ER_EVENT_DATA->M_DATA->* TO <MODTAB>.
      APPEND LS_MODI TO <MODTAB>.
    ENDIF.

    ER_EVENT_DATA->M_EVENT_HANDLED = 'X'"通知系统搜索事件处理完毕,停止调用系统标准的SEARCH HELP。
  ENDMETHOD.                    "HANDLE_ONF4
ENDCLASS.                    "LCL_EVENT_RECEIVER IMPLEMENTATION

原文地址:https://www.cnblogs.com/dyllove98/p/3162920.html