[SAP ABAP开发技术总结]搜索帮助Search Help (F4)

 

12.10.              Search help F4

12.10.1.       VALUE CHECK fixed Values Value Table

PARAMETERS p_1 TYPE zmy_dm_200 VALUE CHECK . " 注: SELECT-OPTIONS 没有此选项

如果选择屏幕字段参考数据元素所对应的 Domaim 设置了 固定值 fixed Values )或 值表 Value Table )时,使用 VALUE CHECK 选项后,会验证输入值是否在固定值或值表( 若要使值表检查生效 ,则首先需要将此 Domain 引用到表字段,再对此表字段通过 image108 按钮进行外键分配,并且外键一定是来自的值表的主键,最后使用 PARAMETERS 定义屏幕参数时要参照此表字段,否则如果只是直接参照所对应的 DataElement 是不起作用, Value Table 一定要经过转换为 Check Table 后再起作用 )范围之内

注: 如果要使用 VALUE CHECK 选项,则 Domain 的类型只能是 C 或者 N 类型 否则运行会抛异常。另外, 如果未使用该选项,但 F4 Help 还是会出现 (有固定值或检查表的情况下),但不进行有效性检查了

image109

12.10.2.       检查表 Check Table --- Value Table

也可以在 Domain 中指定一个值表( Value Table )作为字段取值范围的限制,但是与指定 固定值 的方式不同的是:为一个 Domain 简单地指定一个取值表不会导致用户的输入被自动校验,也不会自动出现 F4 Help 只有 通过表外键 image110 按钮将该 Value Table 指定为主表之后,一个值表才能真正成为 Check Table 。所以要想成为真正有效的 Check Table ,必须要做两个操作:

一是 要为字段对应的 Domain 设置 Value Table (即主表 ,其实这一步不是必须的,在通过 image110[1] 按钮指定主表时,可以不用指定为字段所参照的元素所对应 Domain 所设置的 Value Table ,而是指定其他的主表也是可以的—— 但最好不要这样做 Value Check 时会出其他问题) ,二是 要为表字段通过 image110[2] 为它设置外键

12.10.3.       SE11 检查表与搜索帮助 关系

当某个表字段有检查表,并且又有搜索帮助,则 数据一般来自源于检查表 ,而 F4 输入输出则由搜索帮助来决定

PARAMETERS p_carid TYPE sbook - carrid VALUE CHECK .
PARAMETERS p_cuter TYPE sbook - counter VALUE CHECK .

image111

命中清单中的 ID 列即 CARRID 背景色不是蓝色,所以选择一条时,不会自动填充屏幕字段 P_CARID 原因是对应的 Search Help 中的 CARRID 参数对应的 EXP 没有打上钩:

image112

如果将这个钩打上,则会相应列背景色会为蓝色,且会自动填充, 达到联动效果

image113

一般 当某个外键所参照主表的主键上如果设置了搜索帮助 (如上面 COUNTER 外键所引用的主表主键字段 SCOUNTER-COUNTNUM 已分配搜索帮助“ SCOUNTER_CARRIER_AIRPORT ”: image114 ), 则这个主表主键上的搜帮助会自动带到从表中相应外键上来 ,请看上面的 SBOOK-COUNTER 外键字段的搜索帮助也为“ SCOUNTER_CARRIER_AIRPORT ”,该搜索帮助 决定了整个 F4 Help 处理及显示过程 (如哪些列将作为联动查询条件、哪些列将显示在 F4 列表中、 F4 列表中的哪些列会输出到相应屏幕字段中)。另外,虽然主表主键上的搜索帮助会带到相应外键上来,但带过来后还可以修改,比如上面示例中带过来的搜索帮助中, CARRID 参数所对应的 EXP 没有钩上,所以不能使用命中清单中的 ID 列来自动填充示例中的屏幕字段 P_CARID ,所以我们可以新建一个搜索帮助,并将 CARRID 搜索参数所对应的 EXP 钩上,则可达到自动上屏幕的效果;

另外, 有些外键所参照的主表主键没有指定搜索帮助 ,此时参照从表的屏幕字段的 F4 Help 就只有简单的一列了 (如何让检查表 SCURX 中的 CURRDEC 字段也显示出来,请看后面的 F4 搜索帮助联动的决定因素 ),如下面 SBOOK-LOCCURKEY 字段:

image115

PARAMETERS p_cur TYPE sbook - LOCCURKEY VALUE CHECK .

image116

12.10.4.       F4 搜索帮助联动的决定因素

上节 SE11 检查表与搜索帮助关系 中,屏幕字段参考 sbook - LOCCURKEY 时,搜索帮助输出列表只有简单一列,如果要让主表中的 SCURX - CURRDEC 列也显示出来,则需要为 sbook - LOCCURKEY 字段绑定一个搜索帮助,该搜索帮助数据来源于主表(或检查表) SCURX ,搜索参数包括 CURRKEY CURRDEC 两列,并且让这两列在 F4 输出列表中显示(即在搜索参数“列表”栏位编号):

image117

由于 SBOOK 不能直接修改, ZSBOOK SBOOK 拷贝过来,将搜索帮助 ZSCURX_JZJ 绑定到 ZSBOOK- LOCCURKEY

image118

PARAMETERS p_cur TYPE zsbook - LOCCURKEY VALUE CHECK .

image119

上面检查表中的 SCURX-CURRDEC 列(即 F4 中的小数位)已显示来了,但如何让其背景色为蓝色( 虽然上面已将搜索参数 CURRDEC EXP 打上了钩,但底色还是白色的 ),即选择时自动填充到屏幕上去?由于上面在将搜索帮助 ZSCURX_JZJ 绑定到从表字段 zsbook - LOCCURKEY 字段上时,搜索帮助中的搜索参数 CURRDEC (即主表中的字段 SCURX- CURRDEC )在从表 ZSBOOK 找不到相应的外键,所以上图绑定过程中,搜索参数 CURRDEC 为空。但在这里可以手动分配一个,由于在从表 ZSBOOK 中找不到此字段,所以就暂时参照自己 ( 主表 SCURX-CURRDEC) 吧:

image120

如果此时选择屏幕的代码还是上面那样:
PARAMETERS p_cur TYPE zsbook - LOCCURKEY VALUE CHECK .

F4 搜索输出列表中的“小数位”列底色还是白色,但如果 加上 以下屏幕参数,但会变以蓝色,并可联动( 如果搜索帮助的 CURRDEC 参数的 IMP 打上钩,还可以实现联动查询 ):

PARAMETERS p_cur2 TYPE SCURX-CURRDEC VALUE CHECK

image121

此时的下拉框也会只有两列:

PARAMETERS p_cur3 TYPE zsbook - LOCCURKEY as LISTBOX VISIBLE LENGTH   20 .

image122

所以,联动的决定性条件是要求选择屏幕上的字段要参照 SE11 为表字段所绑定搜索帮助过程中 所分配的表字段 ,如下图中的 zsbook-loccurkey scurx-currdec ,这两个字段分别与搜索帮助的 CURRKEY CURRDEC 参数绑定了,所以屏幕上参照这两个表字段时,就会具有联动效果了:

image123

12.11.              搜索帮助参数说明

image124

2   IMP :输入参数。表示屏幕上相应字段是否作为搜索帮助的过滤条件(即 报表选择屏幕上的字段的值是否从报表选择屏幕上传递到搜索帮助中去

如果是 F4 字段时,屏幕字段中的值包含“ * ”时,才会将 F4 字段传递到 Search Help 中。除开 F4 屏幕字段外,而其他只要是 Link 到了相应的 Search Help 参数的屏幕字段,只要相应屏幕字段中有值,则会传入到搜索中作为过滤条件(而其他非 F4 屏幕字段所对应的 Help 参数不管是否钩上 IMP 都会传递

image125

image126

2   EXP :输出参数,表示 搜索帮助的此列会从搜索帮助中传递到报表选择屏幕 上(表示 F4 选中一条记录后显示到屏幕上文本框中的值——背景字段为浅蓝色的列的数据会被输出,输出的数据可能是多列。注: 只有当 EXP 钩上且相应字段出现在了屏幕上 ,才会自动填充到相应屏幕字段,如果没有钩上——没钩上的字段背景色为白色,即使相应参数字段出现在了屏幕上,选择命中清单时也不会自动填充),且 F4 字段一定要将 EXP 钩上 (否则选择后 F4 字段不能上屏)

2   LPOS (列表): F4 输出 命中清单中各列的显示顺序 ,如果为 0 或留空的列则不会显示

2   SPOS :相应的字段是否在搜索帮助 选择屏幕上显示出来 ,在命中清单显示之前,如果弹出限制对话框,则可以进一步修改那些从选择屏幕上带过来的条件值。此数字就是限制搜索帮助选择条件屏幕字段摆放顺序,如果为 0 或留空的列则不会出在限制条件页中

2   SDis :如果勾选了,则在弹出的限制对话框中对应的字段用户 不可输入 ,是只读的。

12.12.              F4IF_SHLP_EXIT_EXAMPLE 帮助出口

12.12.1.       修改数据源

FUNCTION zfvbeln_find_exit .
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  TABLES
*"      SHLP_TAB TYPE  SHLP_DESCT
*"     RECORD_TAB STRUCTURE  SEAHLPRES
*"  CHANGING
*"     VALUE(SHLP) TYPE  SHLP_DESCR
*"     VALUE( CALLCONTROL ) LIKE  DDSHF4CTRL STRUCTURE  DDSHF4CTRL
*"----------------------------------------------------------------------
 
" 此内表用于存储命中清单数据 . 注:字段的名称一定要与搜索参数名一样,但顺序可以不同,
 
DATA : BEGIN OF lt_tab OCCURS 0 ,
        wbstk
TYPE wbstk ,
        lfdat
TYPE lfdat_v ,
        vbeln
TYPE vbeln_vl ,
   
END OF lt_tab .
 
" 用于存储从选择屏幕上传进的屏幕字段的选择条件值
 
DATA : r_vbeln TYPE RANGE   OF vbeln_vl WITH HEADER LINE ,
        r_lfdat
TYPE RANGE   OF lfdat_v WITH HEADER LINE ,
        r_wbstk
TYPE RANGE   OF wbstk WITH HEADER LINE ,
        wa_selopt
LIKE LINE OF shlp - selopt . "
  "callcontrol-step
该字段的值是由系统设置,并且你可以在程序中进行修改它。出口函数会在处理的每一步(时间点)都会调用一次

 
IF callcontrol - step
= 'SELECT' . " 如果有弹出限制对话框,则会在弹出限制对话框中点击确认按钮后 step 值才为 SELECT
    "shlp-selopt
存储的是经过映射转换后选择屏幕上字段的值,而不是直接为
   
" 选择屏幕字段名,而是转映射为 Help 参数名后再存储到 selopt 内表中,
   
" 屏幕字段到 Help 参数映射是通过 shlp-interface 来映射的
   
LOOP AT shlp - selopt INTO wa_selopt .
     
CASE  wa_selopt - shlpfield .
       
WHEN 'VBELN' . " 由于屏幕字段已映射为了 Help 相应参数,所以这里不是 S_VBELN
         
MOVE-CORRESPONDING wa_selopt TO r_vbeln .
         
APPEND r_vbeln .
       
WHEN 'LFDAT' .
         
MOVE-CORRESPONDING wa_selopt TO r_lfdat .
         
APPEND r_lfdat .
       
WHEN 'WBSTK' .
         
MOVE-CORRESPONDING wa_selopt TO r_wbstk .
         
APPEND r_wbstk .
     
ENDCASE .
   
ENDLOOP .
   
" 根据屏幕上传进的条件查询数据
   
SELECT likp ~ vbeln likp ~ lfdat vbuk ~ wbstk INTO CORRESPONDING   FIELDS OF TABLE lt_tab
     
FROM likp INNER JOIN vbuk ON likp ~ vbeln = vbuk ~
vbeln
     
WHERE likp ~ vbeln IN r_vbeln AND

            likp
~ lfdat IN r_lfdat AND
            vbuk
~ wbstk IN r_wbstk .
   
" 该函数的作用是将内表 lt_tab 中的数据转换成 record_tab ,即将某内表中的数据显示在命中清单中
   
CALL FUNCTION 'F4UT_RESULTS_MAP'
     
TABLES
        shlp_tab   
= shlp_tab
        record_tab 
=
record_tab
        source_tab 
=
lt_tab
     
CHANGING

        shlp       
= shlp
        callcontrol
= callcontrol .

   
" 注:下一个时间点一定要直接设置为 DISP ,否则命中清单不会有值,也不显示出来
   
" 从表面上看, SELECT 时间点下一个就是 DISP 时间点,按理是不需要设置为 DISP
   
" 但如果不设置为 DISP ,出口函数在执行完后,系统会转入 DISP 时间点执行(即再次调用此出口函数)
   
" ,但再次进入此出口函数时, record_tab 内表已经被清空了(是否可以通过判断 callcontrol-step 的值来决定走什么新的逻辑代码来解决此问题?)。如果这里直接设置为 DISP ,就好比欺骗了系统一样,告诉系统当前执行的正是 DISP 时间点,而不是 SELECT ,系统就不会再转到 DISP 时间点了而是直接显示
    callcontrol
- step   =
  'DISP' .   "DISP 在命中清单显示之前调用 ,表示数据已经查出,下一步就该显示了。该时间用于控制搜索帮助的输出结果。例如,在输出搜索结果时对用户检查权限,删除未授权的数据
 
ENDIF .
ENDFUNCTION .

12.12.2.       删除重复

FUNCTION zeh_lxsecond .
   IF callcontrol - step
= 'DISP' .
   
SORT RECORD_TAB .
      
DELETE ADJACENT DUPLICATES FROM RECORD_TAB COMPARING ALL FIELDS . "zsecond.
   
EXIT .
 
ENDIF .
ENDFUNCTION .

12.13.              搜索帮助优先级

P ROCESS O N V ALUE-REQUEST AT SELECTION-SCREEN ON VALUE-REQUEST

PARAMETERS/ SELECT-OPTIONS MATCHCODE OBJECT

检查表 Check Table ,再 (或 结构 字段是否 绑定 搜索帮助

data element 是否 绑定 帮助 ,再 domain 是否存在 fixed values

最后才是 DATS TIMS

 

Domain 只设置 Value Table 也可以出 F4 ,同时 Data Element 绑定了搜索帮助,则 DataElement 上绑定的搜索帮助优先于 Domain 上的 Value Table????????

12.14.              搜索帮助创建函数

在屏幕的 ON VALUE-REQUEST 事件里可以通过下面几个函数来创建搜索帮助:

F4IF_ FIELD _VALUE_REQUEST 函数的作用是在运行时,可以 动态 的为某个屏幕字段 指定 Search Help ,这个被引用的 Help 来自某个表(或结构)字段上绑定的 Help

F4IF_ INT_TABLE _VALUE_REQUEST 在程序运行时, 将某个内表动态的用作 Search help 的数据来源 ,即使用该函数可以将某个内表转换为 Search help ,可实现联动效果

TR_F4_HELP 简单实现 Search Help ,数据来源于内表

posted @ 2015-02-01 09:48  江正军  阅读(20343)  评论(2编辑  收藏  举报