屏幕逻辑流有PBO和PAI
PROCESS BEFORE OUTPUT(PBO).
该事件在屏幕出来之前被触发,之后的屏幕的每个操作都会走一遍PBO事件。
PROCESS AFTER INPUT(PAI).
该事件在屏幕出来之后,通过用户操作触发该事件。
剩下的两个POV (F4)和 POH(F1),其实是搜索帮助,也属于PAI事件
贴上实际操作例子。
屏幕格式加字段就不进行展示了
POV事件
1.给字段添加下拉框,有一点值得注意,这个字段有了KEY值,后续判断这个字段的值要以KEY值为主,后续PBO事件会进行解释。
这里面只用到了一个函数 VRM_SET_VALUES
进行简单的代码展示
PROCESS ON VALUE-REQUEST. *POV事件
FIELD zkna1_append_01-zzpay_cld
MODULE zf4_zzpay_cld. *F4搜索帮助
FIELD zkna1_append_01-zzjsgl
MODULE zkna1_append_01-zzjsgl_info. *字段下拉框
FIELD zkna1_append_01-zzckgz
MODULE zkna1_append_01-zzckgz_info.
MODULE zkna1_append_01-zzjsgl_info INPUT.
TYPES:
*-- Single Value in Value Set
BEGIN OF VRM_VALUE,
KEY(40) TYPE C,
TEXT(80) TYPE C,
END OF VRM_VALUE,
*-- Table of Values
VRM_VALUES TYPE VRM_VALUE OCCURS 0.
DATA: lt_list_ver TYPE vrm_values , " list box的值
lw_value_ver LIKE LINE OF lt_list_ver . " list box的结构
DATA : lw_tabix TYPE sy-tabix.
REFRESH lt_list_ver.
CLEAR lw_value_ver.
lw_value_ver-key = '1'.
lw_value_ver-text = '否'.
APPEND lw_value_ver TO lt_list_ver. *需要的值填入,需要几个就填几个。
CLEAR lw_value_ver.
lw_value_ver-key = '2'.
lw_value_ver-text = '是'.
APPEND lw_value_ver TO lt_list_ver.
* 调用函数显示listbox里面的值
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'ZKNA1_APPEND_01-ZZJSGL'
values = lt_list_ver.
ENDMODULE.
这样就完成了一个下拉框的设置。
2.字段的搜索帮助,搜索帮助可以在SE11表里进行定义好,在屏幕字段勾上就能形成,这里演示第二种方法,用代码进行设置。F4IF_INT_TABLE_VALUE_REQUEST
MODULE zz_process_end_cus_info_help INPUT.
PERFORM zz_process_end_cus_info_help.
ENDMODULE. " ZZ_PROCESS_END_CUS_INFO_HELP INPUT&-------------
FORM zz_process_end_cus_info_help .
TYPES : BEGIN OF ty_ztsd0067,
zabbtercus TYPE ztsd0067,
zzendcus TYPE ztsd0067,
END OF ty_ztsd0067.
TYPES: BEGIN OF ty_f4_data ,
vkbur TYPE ztsd0003-vkbur,
zzendcus TYPE ztsd0003-zzendcus,
zzcusdesc TYPE ztsd0003-zzcusdesc,
zabbtercus TYPE ztsd0067-zabbtercus,
END OF ty_f4_data.
DATA : lt_ztsd0003 TYPE TABLE OF ztsd0003,
la_ztsd0003 TYPE ztsd0003.
DATA : lt_ztsd0067 TYPE TABLE OF ztsd0067,
la_ztsd0067 TYPE ztsd0067.
DATA : lt_f4_data TYPE TABLE OF ty_f4_data,
la_f4_data TYPE ty_f4_data.
SELECT *
FROM ztsd0003
INTO TABLE lt_ztsd0003
WHERE vkbur = vbak-vkbur .
SORT lt_ztsd0003 BY zzendcus.
IF lt_ztsd0003 IS NOT INITIAL.
SELECT *
INTO TABLE lt_ztsd0067
FROM ztsd0067
FOR ALL ENTRIES IN lt_ztsd0003
WHERE zzendcus = lt_ztsd0003-zzendcus.
ENDIF.
SORT lt_ztsd0067 BY zzendcus.
LOOP AT lt_ztsd0067 INTO la_ztsd0067 .
la_f4_data-zabbtercus = la_ztsd0067-zabbtercus.
READ TABLE lt_ztsd0003 INTO la_ztsd0003 WITH KEY zzendcus = la_ztsd0067-zzendcus BINARY SEARCH.
IF sy-subrc = '0'.
la_f4_data-vkbur = la_ztsd0003-vkbur .
la_f4_data-zzendcus = la_ztsd0003-zzendcus .
la_f4_data-zzcusdesc = la_ztsd0003-zzcusdesc.
ENDIF.
APPEND la_f4_data TO lt_f4_data.
CLEAR la_ztsd0003.
CLEAR la_ztsd0067.
CLEAR la_f4_data.
ENDLOOP.
* F4搜索帮助
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'ZZENDCUS' 字段名
dynpprog = sy-repid
dynpnr = sy-dynnr
value_org = 'S'
callback_program = sy-repid
callback_form = 'FRM_F4_CALLBACK'
TABLES
value_tab = lt_f4_data
return_tab = lt_return
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
RETURN.
ENDIF.
* 如果字段不可输,则返回
LOOP AT SCREEN.
IF screen-name = 'VBAP-ZZCVBELN' AND screen-input = 0.
RETURN.
ENDIF.
ENDLOOP.
READ TABLE lt_return INDEX 3.
IF sy-subrc <> 0.
RETURN.
ENDIF.
ENDFORM. " FRM_CALCULATE
3.PBO事件,本次展示这里对字段的功能,主要是默认字段,和字段可以输入的判断。可以看到这里的判断值就是下拉框的KEY值,如果不输入KEY值屏幕就会显示重复。
因为是更具字段的状态来判断是否可以字段输入,所以就要放到PBO,屏幕输出前执行一遍,之后的每次操作都会执行PBO,这样就会稳定的判断出当前屏幕的值是否符合条件。
PROCESS BEFORE OUTPUT.
MODULE status_9001.
MODULE field_default.
MODULE field_default OUTPUT.
"默认字段做一个非空判断
IF zkna1_append_01-zzjsgl IS INITIAL. 判断的是KEY值
zkna1_append_01-zzjsgl = '1' .
ENDIF.
IF zkna1_append_01-zzckgz IS INITIAL.
zkna1_append_01-zzckgz = '1' .
ENDIF.
LOOP AT SCREEN . " 根据出口管制状态来判定字段是否必输状态
IF zkna1_append_01-zzckgz = '2'. "必输情况 判断的是KEY值
CASE screen-name.
WHEN 'ZKNA1_APPEND_01-ZZQSRQ'.
screen-required = '1'.
WHEN 'ZKNA1_APPEND_01-ZZJZRQ'.
screen-required = '1'.
ENDCASE.
MODIFY SCREEN.
ELSE. "不必输情况
CASE screen-name.
WHEN 'ZKNA1_APPEND_01-ZZQSRQ'.
screen-input = '1'.
WHEN 'ZKNA1_APPEND_01-ZZJZRQ'.
screen-input = '1' .
ENDCASE.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDMODULE.
4.PAI 事件,这里的效果是当保存时检查日期的大小,放到PAI事件中,当进行了屏幕操作按钮等等就会执行PAI事件。
PROCESS AFTER INPUT.
FIELD zkna1_append_01-zzqsrq MODULE check ON INPUT."有效
MODULE check INPUT.
IF zkna1_append_01-zzjzrq > zkna1_append_01-zzqsrq .
IF sy-subrc NE 0.
MESSAGE text-001 TYPE 'E'.
ENDIF.
ENDIF.
ENDMODULE.
好了,每个事件都展示了一遍,也大致展示了每个事件能带来什么样的功能,能展示出基本的操作。