【ABAP】选择屏幕搜索帮助和DIALOG搜索帮助

选择屏幕搜索帮助

在选择屏幕事件

at  SELECTION-SCREEN on VALUE-REQUEST FOR p_mon."搜索帮助 P_MON是定义的屏幕字段
  PERFORM set_search_help. 

FORM SET_SEARCH_HELP .
  "step1 填充数据

  DO 12 TIMES.
    GT_MON sy-index.
    append gt_mon.
  ENDDO.
  " step2 调用F4函数
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
*     DDIC_STRUCTURE         = ' '
      RETFIELD    'MONTH'
*     PVALKEY     = ' '
      DYNPPROG    SY-CPROG
      DYNPNR      SY-DYNNR
      DYNPROFIELD 'P_MON'
*     STEPL       = 0
*     WINDOW_TITLE           =
*     VALUE       = ' '
      VALUE_ORG   'S'
*     MULTIPLE_CHOICE        = ' '
*     DISPLAY     = ' '
*     CALLBACK_PROGRAM       = ' '
*     CALLBACK_FORM          = ' '
*     CALLBACK_METHOD        =
*     MARK_TAB    =
*    IMPORTING
*     USER_RESET  =
    TABLES
      VALUE_TAB   GT_MON[]
*     FIELD_TAB   =
*     RETURN_TAB  =
*     DYNPFLD_MAPPING        =
*    EXCEPTIONS
*     PARAMETER_ERROR        = 1
*     NO_VALUES_FOUND        = 2
*     OTHERS      = 3
    .
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.



ENDFORM.

目前发现dialog实现搜索帮助有2种办法,一种是代码,另一种就是去SE11里创建搜索帮助,然后给dialog。

因为日期是常用的,系统有标准的日期搜索帮助,所以在dialog里日期搜索帮助我们可以直接使用。

三,代码方式


在PBO,PAI后加POV。

PROCESS BEFORE OUTPUT.

  "MODULE STATUS_4000. *
PROCESS AFTER INPUT.   MODULE user_command_3000.

 

PROCESS ON VALUE-REQUEST .
  FIELD p_mon MODULE frm_F4_mon. 

例如我这里只需要年月的搜索帮助

因为有系统标准的年月函数,所以

MODULE frm_f4_mon INPUT.
  DATA l_date TYPE isellist-month.
  l_date sy-datum+0(6).
  CALL FUNCTION 'POPUP_TO_SELECT_MONTH'
    EXPORTING
      actual_month               l_date
    IMPORTING
      selected_month             p_mon
    EXCEPTIONS
      factory_calendar_not_found 1
      holiday_calendar_not_found 2
      month_not_found            3
      OTHERS                     4.
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
  CLEAR:l_date.
ENDMODULE.

那如果没有标准的,就需要用的F4搜索帮助函数了。

例如年份的,

MODULE f4_p_year INPUT.
  DATA:BEGIN OF ls_year,
         year TYPE char4,
       END OF ls_year.
  DATA lt_year LIKE TABLE OF ls_year.
  ls_year-year 1970.
  DO 100 TIMES.
    ls_year-year ls_year-year + 1.
    APPEND ls_year TO lt_year.
  ENDDO.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        'YEAR'
      dynpnr          sy-dynnr
      dynpprog        sy-repid
      dynprofield     'P_YEAR'
      value_org       'S'
    TABLES
      value_tab       lt_year
    EXCEPTIONS
      parameter_error 1
      no_values_found 2
      OTHERS          3.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.
  "  CLEAR:ls_year,lt_year..

ENDMODULE.

还有一点要注意,点击搜索帮助后,显示的值还没经过PAI,所以有时需要调用函数DYNP_VALUES_READ来读取屏幕字段值。也可以按回车,但是客户不希望这样吧,

比如这种情况,屏幕上有2个关联字段,NAME1和NAME2,当字段NAME2触发搜索帮助的时候,必须参照用户在NAME1中的录入值。由于PAI尚未被执行,屏幕字段NAME1的字符串值尚未更新到程序变量NAME1。

此时我们可以在NAME2搜索帮助module的F4函数前调用DYNP_VALUES_READ来实现。
DATA: dynpfields TYPE TABLE OF dynpread WITH HEADER LINE.

CLEAR: dynpfields, dynpfields[].
dynpfields-fieldname = 'NAME1'. "填入需要读值的字段名
APPEND dynpfields.

CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
dyname = sy-repid
dynumb = sy-dynnr
translate_to_upper = 'X'
TABLES
dynpfields = dynpfields
EXCEPTIONS
OTHERS = 9.
IF sy-subrc = 0.
READ TABLE dynpfields WITH KEY fieldname = 'NAME1'.
name1 = dynpfields-fieldvalue. "备注
ENDIF.

二,使用现成或SE11创建的搜索帮助(非代码方式)

可以进layout里填,也可以在SE80界面填(比较方便)

 

给TA打赏
共{{data.count}}人
人已打赏
ABAPSAP

【ABAP】新语法

2021-3-31 10:11:06

ABAPSAP

【ABAP】760GUI端smartforms文本框不能编辑

2021-4-13 15:44:21

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索