在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 DEFINITIONDATA 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_ONF4ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION