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
總結
以上是生活随笔為你收集整理的ALV DataChange EVENT的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OOALV 中DATA_CHANGED_
- 下一篇: MIGO相关的3个BADI增强点