SAP ABAP 自定义屏幕字段功能

屏幕逻辑流有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.

好了,每个事件都展示了一遍,也大致展示了每个事件能带来什么样的功能,能展示出基本的操作。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页