利用SE11创建表维护视图后,我们可以通过SE51修改自动生成的屏幕来编写自定义F4以及其它事件。
首先需要找到相应的FUNCTION GROUP
SE80进入FUNCTION GROUP的编辑页面
修改屏幕的PBO,PAI事件。(出了MDL开头的MUDOLE,其它代码均为系统自动生成)
PROCESS BEFORE OUTPUT.
MODULE liste_initialisieren.
LOOP AT extract WITH CONTROL
tctrl_zfit_037_sfx CURSOR nextline.
MODULE liste_show_liste.
MODULE mdl_screen_init.
ENDLOOP.
*
PROCESS AFTER INPUT.
MODULE liste_exit_command AT EXIT-COMMAND.
MODULE liste_before_loop.
LOOP AT extract.
MODULE liste_init_workarea.
CHAIN.
FIELD zfit_037_sfx-zsfxmid .
FIELD zfit_037_sfx-zsfxmbm .
FIELD zfit_037_sfx-zsfxmmc1 .
FIELD zfit_037_sfx-zsfxmmc2 .
FIELD zfit_037_sfx-zsfxmmc3 .
* FIELD zfit_037_sfx-ztxt20 .
* FIELD ZFIT_037_SFX-ZTF_TYPE .
* FIELD ZFIT_037_SFX-ZTF_STATUS .
FIELD zfit_037_sfx-saknr_dr .
FIELD zfit_037_sfx-saknr_cr .
FIELD zfit_037_sfx-ztxt50 .
* FIELD ZFIT_037_SFX-ZATTRIBUTE1 .
* FIELD ZFIT_037_SFX-ZATTRIBUTE2 .
* FIELD ZFIT_037_SFX-ZATTRIBUTE3 .
* FIELD ZFIT_037_SFX-ZATTRIBUTE4 .
* FIELD ZFIT_037_SFX-ZATTRIBUTE5 .
MODULE set_update_flag ON CHAIN-REQUEST.
ENDCHAIN.
CHAIN.
FIELD zfit_037_sfx-saknr_dr.
FIELD zfit_037_sfx-saknr_cr.
MODULE mdl_change_txt.
ENDCHAIN.
FIELD vim_marked MODULE liste_mark_checkbox.
CHAIN.
FIELD zfit_037_sfx-zsfxmid .
FIELD zfit_037_sfx-zsfxmbm .
MODULE liste_update_liste.
ENDCHAIN.
ENDLOOP.
MODULE liste_after_loop.
PROCESS ON VALUE-REQUEST.
FIELD zfit_037_sfx-saknr_dr MODULE mdl_f4_saknr.
FIELD zfit_037_sfx-saknr_cr MODULE mdl_f4_saknr1.
MODULE mdl_screen_init. "添加自定义事件,借方科目和贷方科目只能输入一个。
ZFIT_037_SFX-SAKNR_DR与ZFIT_037_SFX-SAKNR_CR为借方与贷方科目字段。
*----------------------------------------------------------------------*
***INCLUDE LZFI_F037_SFXO02.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module MDL_SCREEN_INIT OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE mdl_screen_init OUTPUT.
IF ZFIT_037_SFX-SAKNR_CR IS NOT INITIAL.
LOOP AT SCREEN.
IF screen-name = 'ZFIT_037_SFX-SAKNR_DR'.
screen-input = '0'.
ELSE.
screen-input = '1'.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
IF ZFIT_037_SFX-SAKNR_dR IS NOT INITIAL.
LOOP AT SCREEN.
IF screen-name = 'ZFIT_037_SFX-SAKNR_CR'.
screen-input = '0'.
ELSE.
screen-input = '1'.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDIF.
ENDMODULE.
MDL_CHANGE_TXT."选择科目后自动带出科目文本
MODULE mdl_change_txt INPUT.
IF zfit_037_sfx-saknr_dr IS NOT INITIAL.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = zfit_037_sfx-saknr_dr
IMPORTING
output = zfit_037_sfx-saknr_dr.
SELECT SINGLE txt50 FROM skat INTO zfit_037_sfx-ztxt50
WHERE saknr = zfit_037_sfx-saknr_dr.
* MODIFY zfit_037_sfx FROM zfit_037_sfx .
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input = zfit_037_sfx-saknr_dr
IMPORTING
output = zfit_037_sfx-saknr_dr.
ELSE.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = zfit_037_sfx-saknr_cr
IMPORTING
output = zfit_037_sfx-saknr_cr.
SELECT SINGLE txt50 FROM skat INTO zfit_037_sfx-ztxt50
WHERE saknr = zfit_037_sfx-saknr_cr.
* MODIFY zfit_037_sfx FROM zfit_037_sfx .
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input = zfit_037_sfx-saknr_cr
IMPORTING
output = zfit_037_sfx-saknr_cr.
ENDIF.
ENDMODULE.
在POV事件中加入F4事件。
FIELD zfit_037_sfx-saknr_dr MODULE mdl_f4_saknr.
*----------------------------------------------------------------------*
***INCLUDE LZFI_F037_SFXI02.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module MDL_F4_SAKNR INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE mdl_f4_saknr INPUT.
DATA:
l_row LIKE sy-tabix,
lt_return_tab TYPE TABLE OF ddshretval,
ls_return_tab LIKE LINE OF lt_return_tab,
lt_systems LIKE dynpread OCCURS 0 WITH HEADER LINE.
*取出屏幕行
CALL FUNCTION 'DYNP_GET_STEPL'
IMPORTING
povstepl = l_row.
*调用帮助函数
CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
EXPORTING
tabname = 'SKAT'
fieldname = 'SAKNR'
dynpprog = sy-repid
dynpnr = '0110' "你的屏幕号
dynprofield = 'ZFIT_037_SFX-SAKNR_DR'
stepl = l_row
multiple_choice = ''
display = ''
TABLES
return_tab = lt_return_tab
EXCEPTIONS
field_not_found = 1
no_help_for_field = 2
inconsistent_help = 3
no_values_found = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
READ TABLE lt_return_tab INTO ls_return_tab INDEX 1.
*更新屏幕上已经修改的字段
lt_systems-fieldname = 'ZFIT_037_SFX-SAKNR_DR'.
lt_systems-stepl = l_row.
lt_systems-fieldvalue = ls_return_tab-fieldval.
APPEND lt_systems.
CALL FUNCTION 'DYNP_VALUES_UPDATE'
EXPORTING
dyname = sy-repid
dynumb = '100'
TABLES
dynpfields = lt_systems
EXCEPTIONS
invalid_abapworkarea = 1
invalid_dynprofield = 2
invalid_dynproname = 3
invalid_dynpronummer = 4
invalid_request = 5
no_fielddescription = 6
undefind_error = 7
OTHERS = 8.
IF sy-subrc <> 0.
ENDIF.
ENDIF.
ENDMODULE.