搜索帮助篇
介绍开发过程中几种常用的搜索帮助
文章目录
前言
介绍几种常用的搜索帮助:如Dialog PROCESS ON VALUE-REQUEST事件;根据屏幕字段值动态显示搜索帮助;根据搜索帮助自动带出屏幕其他字段内容;修改搜索帮助字段描述及控制筛选项默认值是否可编辑等。
一、Dialog 搜索帮助
1.常用搜索帮助
注:本示例是获取采购申请已转订单且收货完成数据。
(1) PROCESS ON VALUE-REQUEST 定义
(2)代码实现
***--> 采购申请及对应内部订单数据
SELECT a~banfn,
a~bnfpo,
a~ernam,
a~erdat,
a~dispo,
a~bsart,
b~aufnr,
c~ktext,
c~auart
FROM eban AS a
INNER JOIN ebkn AS b ON a~banfn = b~banfn AND a~bnfpo = b~bnfpo AND b~zebkn = '01'
INNER JOIN aufk AS c ON c~aufnr = b~aufnr
WHERE a~knttp EQ 'F'
AND a~loekz EQ @space
AND c~autyp EQ '01'
INTO TABLE @DATA(lt_data_tmp).
***--> 采购申请转采购订单数据
SELECT a~ebeln,a~ebelp,a~banfn,a~bnfpo
FROM ekpo AS a
INNER JOIN @lt_data_tmp AS b ON a~banfn = b~banfn AND a~bnfpo = b~bnfpo
WHERE loekz = ''
INTO TABLE @DATA(lt_data_tmp_a).
SORT lt_data_tmp_a BY banfn bnfpo.
IF lt_data_tmp_a IS INITIAL .
MESSAGE s001(zmm) DISPLAY LIKE 'E'.
RETURN.
ENDIF.
***--> 剔除未转订单数据
LOOP AT lt_data_tmp INTO DATA(ls_data_tmp).
DATA(lv_index) = sy-tabix.
READ TABLE lt_data_tmp_a INTO DATA(ls_data_tmp_a) WITH KEY banfn = ls_data_tmp-banfn bnfpo = ls_data_tmp-bnfpo BINARY SEARCH.
IF sy-subrc <> 0.
DELETE lt_data_tmp INDEX lv_index.
ENDIF.
ENDLOOP.
***--> 采购订单收货数据 正负累加计算是否收货
DATA(lt_data_tmp_b) = lt_data_tmp_a.
SORT lt_data_tmp_b BY ebeln ebelp.
DELETE ADJACENT DUPLICATES FROM lt_data_tmp_b COMPARING ebeln ebelp.
SELECT a~ebeln,a~ebelp,SUM( CASE WHEN shkzg = 'S' THEN menge ELSE 0 - menge END ) AS menge
FROM mseg AS a
INNER JOIN @lt_data_tmp_b AS b ON a~ebeln = b~ebeln AND a~ebelp = b~ebelp
WHERE bwart IN ( '101' , '102' )
GROUP BY a~ebeln,a~ebelp
INTO TABLE @DATA(lt_data_tmp_c).
SELECT a~ebeln,a~ebelp,a~menge
FROM @lt_data_tmp_c AS a
WHERE menge > 0
INTO TABLE @DATA(lt_data_tmp_d).
SORT lt_data_tmp_d BY ebeln ebelp.
IF lt_data_tmp_d IS INITIAL .
MESSAGE s001(zmm) DISPLAY LIKE 'E'.
RETURN.
ENDIF.
***--> 剔除未收货数据
LOOP AT lt_data_tmp INTO ls_data_tmp.
CLEAR lv_index.
lv_index = sy-tabix.
READ TABLE lt_data_tmp_a INTO ls_data_tmp_a WITH KEY banfn = ls_data_tmp-banfn bnfpo = ls_data_tmp-bnfpo BINARY SEARCH.
IF sy-subrc = 0.
READ TABLE lt_data_tmp_d INTO DATA(ls_data_tmp_d) WITH KEY ebeln = ls_data_tmp_a-ebeln ebelp = ls_data_tmp_a-ebelp BINARY SEARCH.
IF sy-subrc <> 0.
DELETE lt_data_tmp INDEX lv_index.
ENDIF.
ENDIF.
ENDLOOP.
SORT lt_data_tmp BY banfn bnfpo.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'BANFN'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'EBAN-BANFN'
value_org = 'S'
* callback_program = sy-repid
* callback_form = 'VAL_REQ_BANFN'
TABLES
value_tab = lt_data_tmp
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
2.根据搜索帮助自动带出屏幕其他字段的值
注:选择项目编码自动带出相应的项目描述
*&---------------------------------------------------------------------*
*& Form SUB_HELP_POST1
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM sub_help_post1 .
IF gt_pspnr[] IS INITIAL.
SELECT pspnr post1
INTO CORRESPONDING FIELDS OF TABLE gt_pspnr
FROM proj AS a
INNER JOIN jest AS b
ON a~objnr = b~objnr
WHERE a~loevm EQ space
AND b~stat EQ 'I0002'
AND b~inact EQ space.
ENDIF.
SORT gt_pspnr BY pspid ASCENDING post1.
DELETE ADJACENT DUPLICATES FROM gt_pspnr COMPARING pspid.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'POST1'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'ZR000TB_PS301-POST1'
value_org = 'S'
callback_program = sy-repid
callback_form = 'VAL_REQ_PSPID'
TABLES
value_tab = gt_pspnr
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " SUB_HELP_POST1
*&---------------------------------------------------------------------*
*& Form VAL_REQ_PSPID
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->RECORD_TAB text
* -->SHLP text
* -->CALLCONTROL text
*----------------------------------------------------------------------*
FORM val_req_pspid TABLES record_tab STRUCTURE seahlpres
CHANGING shlp TYPE shlp_descr_t
callcontrol LIKE ddshf4ctrl.
DATA:interface LIKE LINE OF shlp-interface.
READ TABLE shlp-interface INTO interface INDEX 1.
interface-shlpfield+4(1) = '1'.
interface-valfield = 'GT_PS303-PSPID'.
APPEND interface TO shlp-interface.
ENDFORM. "VAL_REQ_PSPID
3.根据屏幕字段值动态显示搜索帮助
注:若界面输入采购申请,根据输入的采购申请动态获取对应的内部订单(采购申请输入后,无需回车);采购申请为空,获取标准搜索帮助
DATA: lv_banfn TYPE eban-banfn.
DATA:
l_shlp TYPE shlp_descr_t,
ls_shlp_descr_t_interface TYPE ddshiface,
lt_return TYPE TABLE OF ddshretval WITH HEADER LINE,
lt_dynpfields TYPE TABLE OF dynpread WITH HEADER LINE.
CLEAR: lt_dynpfields, lt_dynpfields[].
lt_dynpfields-fieldname = 'EBAN-BANFN'. "填入需要读值的字段名
APPEND lt_dynpfields.
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
dyname = sy-repid
dynumb = sy-dynnr
translate_to_upper = 'X'
TABLES
dynpfields = lt_dynpfields
EXCEPTIONS
OTHERS = 9.
IF sy-subrc = 0.
READ TABLE lt_dynpfields WITH KEY fieldname = 'EBAN-BANFN'.
lv_banfn = lt_dynpfields-fieldvalue.
ENDIF.
IF lv_banfn IS INITIAL .
CALL FUNCTION 'F4IF_GET_SHLP_DESCR'
EXPORTING
shlpname = 'ASH_ORDE'
shlptype = 'SH'
IMPORTING
shlp = l_shlp.
LOOP AT l_shlp-interface INTO ls_shlp_descr_t_interface.
IF ls_shlp_descr_t_interface = 'AUFNR'.
ls_shlp_descr_t_interface-valfield = 'X'.
MODIFY l_shlp-interface FROM ls_shlp_descr_t_interface.
ENDIF.
ENDLOOP.
CLEAR:lt_return,lt_return[].
CALL FUNCTION 'F4IF_START_VALUE_REQUEST'
EXPORTING
shlp = l_shlp
maxrecords = 500
* multisel = 'X'
TABLES
return_values = lt_return.
READ TABLE lt_return INDEX 1.
IF sy-subrc = 0.
goitem-aufnr = lt_return-fieldval.
ENDIF.
ELSE.
***--> 采购申请及对应内部订单数据
lv_banfn = |{ lv_banfn ALPHA = IN }|.
SELECT b~aufnr,
c~ktext,
c~auart
FROM eban AS a
INNER JOIN ebkn AS b ON a~banfn = b~banfn AND a~bnfpo = b~bnfpo AND b~zebkn = '01'
INNER JOIN aufk AS c ON c~aufnr = b~aufnr
WHERE a~knttp EQ 'F'
AND a~loekz EQ @space
AND c~autyp EQ '01'
AND a~banfn EQ @lv_banfn
INTO TABLE @DATA(lt_data_tmp_aufnr).
SORT lt_data_tmp_aufnr BY aufnr.
DELETE ADJACENT DUPLICATES FROM lt_data_tmp_aufnr COMPARING aufnr.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'AUFNR'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'GOITEM-AUFNR'
value_org = 'S'
* callback_program = sy-repid
* callback_form = 'VAL_REQ_PSPID'
TABLES
value_tab = lt_data_tmp_aufnr
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.
4.字段域值搜索帮助,通过下拉框显示
DATA:l_values_tab TYPE dd07v OCCURS 0 WITH HEADER LINE,
list TYPE vrm_values WITH HEADER LINE,
id TYPE vrm_id.
CLEAR:list[],l_values_tab[].
CALL FUNCTION 'GET_DOMAIN_VALUES'
EXPORTING
domname = 'ZR000DM_PS494'
TABLES
values_tab = l_values_tab
EXCEPTIONS
no_values_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
REFRESH l_values_tab.
ENDIF.
DELETE l_values_tab WHERE domvalue_l = 'Y'.
DELETE l_values_tab WHERE domvalue_l = 'U'.
LOOP AT l_values_tab.
list-key = l_values_tab-domvalue_l.
list-text = l_values_tab-ddtext.
APPEND list. CLEAR list.
ENDLOOP.
id = 'T_PS301-ZSTATUS'.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = id
values = list[].
5.搜索帮助筛选项默认值、是否可输入、搜索帮助字段描述更改
注:通过参数callback_program及callback_form控制
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'CHKNO'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'ZR000TB_PS008-CHKNO'
value_org = 'S'
callback_program = sy-repid
callback_form = 'CB_FORM'
TABLES
value_tab = lt_chkno
return_tab = t_f4_return
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
*&---------------------------------------------------------------------*
*& Form CB_BACK
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->RECORD_TAB text
* -->SHLP text
* -->CALLCONTROL text
*----------------------------------------------------------------------*
FORM cb_form TABLES record_tab STRUCTURE seahlpres
CHANGING shlp TYPE shlp_descr_t
callcontrol LIKE ddshf4ctrl.
DATA:interface LIKE LINE OF shlp-interface,
fielddescr LIKE LINE OF shlp-fielddescr.
fielddescr-fieldname+4(1) = '4'.
fielddescr-fieldtext = '验收类别'.
fielddescr-reptext = '验收类别'.
fielddescr-scrtext_s = '验收类别'.
fielddescr-scrtext_m = '验收类别'.
fielddescr-scrtext_l = '验收类别'.
MODIFY shlp-fielddescr FROM fielddescr TRANSPORTING fieldtext reptext scrtext_s scrtext_m scrtext_l WHERE fieldname+4(1) = '4'.
fielddescr-fieldname+4(1) = '5'.
fielddescr-fieldtext = '合同验收日期'.
fielddescr-reptext = '合同验收日期'.
fielddescr-scrtext_s = '合同验收日期'.
fielddescr-scrtext_m = '合同验收日期'.
fielddescr-scrtext_l = '合同验收日期'.
MODIFY shlp-fielddescr FROM fielddescr TRANSPORTING fieldtext reptext scrtext_s scrtext_m scrtext_l WHERE fieldname+4(1) = '5'.
READ TABLE shlp-interface INTO interface INDEX 1.
interface-shlpfield+4(1) = '3'.
interface-valfield = 'ZR000TB_PS008-CHKNO'.
APPEND interface TO shlp-interface.
CLEAR interface-f4field.
interface-shlpfield+4(1) = '1'."字段位于第几行
interface-valfield = 'OTNUM'."字段名
interface-value = zr000tb_ps008-otnum."字段默认值
interface-dispfield = 'X'."默认显示 不可修改
APPEND interface TO shlp-interface.
interface-shlpfield+4(1) = '2'.
interface-valfield = 'HTNAME'.
interface-value = zr000tb_mm028-htname.
interface-dispfield = 'X'.
APPEND interface TO shlp-interface.
ENDFORM. "CB_BACK
6.调用其他报表程序用于搜索帮助
DATA: t_dynpread LIKE TABLE OF dynpread WITH HEADER LINE.
SUBMIT zr000mmrp014 AND RETURN.
GET PARAMETER ID 'ZR000MM_EBELN' FIELD p_ebeln.
GET PARAMETER ID 'ZR000MM_BELNR' FIELD p_mblnr.
t_dynpread-fieldname = 'P_MBLNR'.
t_dynpread-fieldvalue = p_mblnr.
APPEND t_dynpread.
CALL FUNCTION 'DYNP_VALUES_UPDATE'
EXPORTING
dyname = 'ZR000MMDG013'
dynumb = '1000'
TABLES
dynpfields = t_dynpread[].
IF sy-subrc <> 0.
ENDIF.
7.调用se11自定义搜索帮助、标准搜索帮助
注:订单标准搜索帮助
DATA:
l_shlp TYPE shlp_descr_t,
ls_shlp_descr_t_interface TYPE ddshiface,
lt_return TYPE TABLE OF ddshretval WITH HEADER LINE.
CALL FUNCTION 'F4IF_GET_SHLP_DESCR'
EXPORTING
shlpname = 'ASH_ORDE'
shlptype = 'SH'
IMPORTING
shlp = l_shlp.
LOOP AT l_shlp-interface INTO ls_shlp_descr_t_interface.
IF ls_shlp_descr_t_interface = 'AUFNR'.
ls_shlp_descr_t_interface-valfield = 'X'.
MODIFY l_shlp-interface FROM ls_shlp_descr_t_interface.
ENDIF.
ENDLOOP.
BREAK-POINT.
CALL FUNCTION 'F4IF_START_VALUE_REQUEST'
EXPORTING
shlp = l_shlp
maxrecords = 500
* multisel = 'X'
TABLES
return_values = lt_return.
READ TABLE lt_return INDEX 1.
IF sy-subrc = 0.
goitem-aufnr = lt_return-fieldval.
ENDIF.
二、选择屏幕搜索帮助
1.引用SE11自定义搜索帮助
s_konnr1 FOR eban-konnr MATCHCODE OBJECT zmmsh003,
2.自定义搜索帮助
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_konnr1-low .
PERFORM frm_f4_konnr.
*&---------------------------------------------------------------------*
*& Form frm_f4_konnr
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_f4_konnr .
TYPES: BEGIN OF typ_value,
ebeln TYPE ekko-ebeln,
verkf TYPE ekko-verkf,
bsart TYPE ekko-bsart,
ekgrp TYPE ekko-ekgrp,
lifnr TYPE ekko-lifnr,
name1 TYPE lfa1-name1,
kdatb TYPE ekko-kdatb,
kdate TYPE ekko-kdate,
END OF typ_value.
DATA: ls_value TYPE typ_value,
lt_value TYPE TABLE OF typ_value.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE lt_value
FROM ekko
INNER JOIN lfa1 ON ekko~lifnr = lfa1~lifnr
WHERE bstyp = 'K'
AND bsart LIKE 'ZK%'
AND kdate >= sy-datum.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'EBELN'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'S_KONNR'
value_org = 'S'
callback_program = sy-repid
callback_form = 'CB_FORM'
TABLES
value_tab = lt_value
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
三.常用搜索帮助
1 年月搜索帮助
CALL FUNCTION 'POPUP_TO_SELECT_MONTH'
EXPORTING
ACTUAL_MONTH = SY-DATUM(6)
IMPORTING
SELECTED_MONTH = S_SPMON-LOW
EXCEPTIONS
FACTORY_CALENDAR_NOT_FOUND = 1
HOLIDAY_CALENDAR_NOT_FOUND = 2
MONTH_NOT_FOUND = 3
OTHERS = 4.
2 日期搜索帮助 用于dialog
BU_DATE_CHAR
3 时间搜索帮助 用于dialog
SRM_F4_UZEIT
4 成本中心组搜索帮助
TYPES: BEGIN OF convert,
class LIKE sethier-setclass,
shnam LIKE sethier-shortname,
kokrs LIKE tka01-kokrs,
ktopl LIKE tka01-ktopl,
setid LIKE sethier-setid,
seafd LIKE sethier-searchfld,
END OF convert.
DATA: l_conv TYPE convert,
l_field LIKE rgsbs-field,
l_table LIKE rgsbs-table,
l_title LIKE rgsbs-title,
sign_multi LIKE sy-datar VALUE '*'.
l_conv-shnam = p_cbzxz.
IF l_conv-shnam NA sign_multi.
l_conv-shnam = sign_multi.
ENDIF.
CALL FUNCTION 'K_GROUP_SELECT'
EXPORTING
class = '0101'
field_name = 'KOSTL'
searchfld_input = ''
table = 'CCSS'
kokrs = 'DP00'
ktopl = 'CNDP'
fikrs = 'DP00'
set = l_conv-shnam
IMPORTING
class_name = l_conv-class
set_name = l_conv-shnam
set_title = l_title
table_name = l_table
setid = l_conv-setid
EXCEPTIONS
no_set_picked = 1.
IF sy-subrc > 0.
MESSAGE s041(oh).
ELSE.
p_cbzxz = l_conv-shnam.
ENDIF.
5 成本要素搜索帮助
TYPES: BEGIN OF convert,
class LIKE sethier-setclass,
shnam LIKE sethier-shortname,
kokrs LIKE tka01-kokrs,
ktopl LIKE tka01-ktopl,
setid LIKE sethier-setid,
seafd LIKE sethier-searchfld,
END OF convert.
DATA: l_conv TYPE convert,
l_field LIKE rgsbs-field,
l_table LIKE rgsbs-table,
l_title LIKE rgsbs-title,
sign_multi LIKE sy-datar VALUE '*'.
l_conv-shnam = p_cbysz.
IF l_conv-shnam NA sign_multi.
l_conv-shnam = sign_multi.
ENDIF.
CALL FUNCTION 'K_GROUP_SELECT'
EXPORTING
class = '0102'
field_name = 'KSTAR'
searchfld_input = ''
table = 'CCSS'
kokrs = 'DP00'
ktopl = 'CNDP'
fikrs = 'DP00'
set = l_conv-shnam
IMPORTING
class_name = l_conv-class
set_name = l_conv-shnam
set_title = l_title
table_name = l_table
setid = l_conv-setid
EXCEPTIONS
no_set_picked = 1.
IF sy-subrc > 0.
MESSAGE s041(oh).
ELSE.
p_cbysz = l_conv-shnam.
ENDIF.
6 文件路径搜索帮助
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
PERFORM frm_open_dialog.
DATA: l_files TYPE filetable,
h_files TYPE file_table,
l_rc LIKE sy-subrc.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
file_filter = 'TXT Files,*.txt;All Files,*.*.'
CHANGING
file_table = l_files
rc = l_rc
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 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.
ENDIF.
READ TABLE l_files INDEX 1 INTO h_files.
p_file = h_files-filename.
CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
CHANGING
file_name = p_file
EXCEPTIONS
mask_too_long = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
总结
这里介绍了我们开发过程中常用的几种搜索帮助,有问题欢迎大家批评指正。