[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 引用到表字段,再对此表字段通过 按钮进行外键分配,并且外键一定是来自的值表的主键,最后使用 PARAMETERS 定义屏幕参数时要参照此表字段,否则如果只是直接参照所对应的 DataElement 是不起作用, 即 Value Table 一定要经过转换为 Check Table 后再起作用 )范围之内
注: 如果要使用 VALUE CHECK 选项,则 Domain 的类型只能是 C 或者 N 类型 , 否则运行会抛异常。另外, 如果未使用该选项,但 F4 Help 还是会出现 (有固定值或检查表的情况下),但不进行有效性检查了
12.10.2. 检查表 Check Table --- Value Table
也可以在 Domain 中指定一个值表( Value Table )作为字段取值范围的限制,但是与指定 固定值 的方式不同的是:为一个 Domain 简单地指定一个取值表不会导致用户的输入被自动校验,也不会自动出现 F4 Help 。 只有 通过表外键 按钮将该 Value Table 指定为主表之后,一个值表才能真正成为 Check Table 。所以要想成为真正有效的 Check Table ,必须要做两个操作:
一是 要为字段对应的 Domain 设置 Value Table (即主表 ,其实这一步不是必须的,在通过 按钮指定主表时,可以不用指定为字段所参照的元素所对应 Domain 所设置的 Value Table ,而是指定其他的主表也是可以的—— 但最好不要这样做 , Value Check 时会出其他问题) ,二是 要为表字段通过 为它设置外键 。
12.10.3. SE11 检查表与搜索帮助 关系
当某个表字段有检查表,并且又有搜索帮助,则 数据一般来自源于检查表 ,而 F4 的 输入输出则由搜索帮助来决定 !
PARAMETERS p_carid TYPE sbook - carrid VALUE CHECK .
PARAMETERS p_cuter TYPE sbook - counter VALUE CHECK .
命中清单中的 ID 列即 CARRID 背景色不是蓝色,所以选择一条时,不会自动填充屏幕字段 P_CARID , 原因是对应的 Search Help 中的 CARRID 参数对应的 EXP 没有打上钩:
如果将这个钩打上,则会相应列背景色会为蓝色,且会自动填充, 达到联动效果 。
一般 当某个外键所参照主表的主键上如果设置了搜索帮助 (如上面 COUNTER 外键所引用的主表主键字段 SCOUNTER-COUNTNUM 已分配搜索帮助“ SCOUNTER_CARRIER_AIRPORT ”: ), 则这个主表主键上的搜帮助会自动带到从表中相应外键上来 ,请看上面的 SBOOK-COUNTER 外键字段的搜索帮助也为“ SCOUNTER_CARRIER_AIRPORT ”,该搜索帮助 决定了整个 F4 Help 处理及显示过程 (如哪些列将作为联动查询条件、哪些列将显示在 F4 列表中、 F4 列表中的哪些列会输出到相应屏幕字段中)。另外,虽然主表主键上的搜索帮助会带到相应外键上来,但带过来后还可以修改,比如上面示例中带过来的搜索帮助中, CARRID 参数所对应的 EXP 没有钩上,所以不能使用命中清单中的 ID 列来自动填充示例中的屏幕字段 P_CARID ,所以我们可以新建一个搜索帮助,并将 CARRID 搜索参数所对应的 EXP 钩上,则可达到自动上屏幕的效果;
另外, 有些外键所参照的主表主键没有指定搜索帮助 ,此时参照从表的屏幕字段的 F4 Help 就只有简单的一列了 (如何让检查表 SCURX 中的 CURRDEC 字段也显示出来,请看后面的 F4 搜索帮助联动的决定因素 ),如下面 SBOOK-LOCCURKEY 字段:
PARAMETERS p_cur TYPE sbook - LOCCURKEY VALUE CHECK .
12.10.4. F4 搜索帮助联动的决定因素
上节 SE11 检查表与搜索帮助关系 中,屏幕字段参考 sbook - LOCCURKEY 时,搜索帮助输出列表只有简单一列,如果要让主表中的 SCURX - CURRDEC 列也显示出来,则需要为 sbook - LOCCURKEY 字段绑定一个搜索帮助,该搜索帮助数据来源于主表(或检查表) SCURX ,搜索参数包括 CURRKEY 、 CURRDEC 两列,并且让这两列在 F4 输出列表中显示(即在搜索参数“列表”栏位编号):
由于 SBOOK 不能直接修改, ZSBOOK 从 SBOOK 拷贝过来,将搜索帮助 ZSCURX_JZJ 绑定到 ZSBOOK- LOCCURKEY :
PARAMETERS p_cur TYPE zsbook - LOCCURKEY VALUE CHECK .
上面检查表中的 SCURX-CURRDEC 列(即 F4 中的小数位)已显示来了,但如何让其背景色为蓝色( 虽然上面已将搜索参数 CURRDEC 的 EXP 打上了钩,但底色还是白色的 ),即选择时自动填充到屏幕上去?由于上面在将搜索帮助 ZSCURX_JZJ 绑定到从表字段 zsbook - LOCCURKEY 字段上时,搜索帮助中的搜索参数 CURRDEC (即主表中的字段 SCURX- CURRDEC )在从表 ZSBOOK 找不到相应的外键,所以上图绑定过程中,搜索参数 CURRDEC 为空。但在这里可以手动分配一个,由于在从表 ZSBOOK 中找不到此字段,所以就暂时参照自己 ( 主表 SCURX-CURRDEC) 吧:
如果此时选择屏幕的代码还是上面那样:
PARAMETERS p_cur TYPE zsbook - LOCCURKEY VALUE CHECK .
则 F4 搜索输出列表中的“小数位”列底色还是白色,但如果 加上 以下屏幕参数,但会变以蓝色,并可联动( 如果搜索帮助的 CURRDEC 参数的 IMP 打上钩,还可以实现联动查询 ):
PARAMETERS p_cur2 TYPE SCURX-CURRDEC VALUE CHECK
此时的下拉框也会只有两列:
PARAMETERS p_cur3 TYPE zsbook - LOCCURKEY as LISTBOX VISIBLE LENGTH 20 .
所以,联动的决定性条件是要求选择屏幕上的字段要参照 SE11 为表字段所绑定搜索帮助过程中 所分配的表字段 ,如下图中的 zsbook-loccurkey 、 scurx-currdec ,这两个字段分别与搜索帮助的 CURRKEY 、 CURRDEC 参数绑定了,所以屏幕上参照这两个表字段时,就会具有联动效果了:
12.11. 搜索帮助参数说明
2 IMP :输入参数。表示屏幕上相应字段是否作为搜索帮助的过滤条件(即 报表选择屏幕上的字段的值是否从报表选择屏幕上传递到搜索帮助中去 )
如果是 F4 字段时,屏幕字段中的值包含“ * ”时,才会将 F4 字段传递到 Search Help 中。除开 F4 屏幕字段外,而其他只要是 Link 到了相应的 Search Help 参数的屏幕字段,只要相应屏幕字段中有值,则会传入到搜索中作为过滤条件(而其他非 F4 屏幕字段所对应的 Help 参数不管是否钩上 IMP 都会传递 ? )
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 ,数据来源于内表
[SAP ABAP开发技术总结]搜索帮助Search Help (F4)相关推荐
- [SAP ABAP开发技术总结]ABAP调优——代码优化
11.2. 程序 1. READ TABLE ...WITH [TABLE] KEY...BINARY SEARCH读取标准内表使用二分查找 2. 在循环(LOOP AT ...WHE ...
- [SAP ABAP开发技术总结]选择屏幕——SELECT-OPTIONS
12.4. SELECT-OPTIONS. 89 12.4.1. 输入ABAP程序默认值时,需要加上"=". 89 12.4.2. 选择条件内表多条 ...
- [SAP ABAP开发技术总结]ABAP调优——Open SQL优化
11.1. 数据库编程方面优化 1. 不要使用 SELECT * ...,选择需要的字段, SELECT * 既浪费CPU,又浪费网络带宽资源,还需占用大量的ABAP内存 2. 不要使 ...
- [SAP ABAP开发技术总结]SD销售订单定价过程
16.3.2. 定价过程 16.3.2.1. 条件技术七要素 16.3.2.2. 条件表V/03.V/04.V/05 16.3.2.3. ...
- [SAP ABAP开发技术总结]EXIT-COMMAND
12.8. EXIT-COMMAND 12.8.1. MODULE <mod> AT EXIT-COMMAND 对话屏幕中,对于E类型的Function Cod ...
- [SAP ABAP开发技术总结]动态语句、动态程序
在ABAP中写动态的程序,灵活的程序,一定要知道的 1.13. 动态语句 1.13.1. 内表动态访问 1.13.2. 动态类型 1.13.3. 动态SQL 1 ...
- [SAP ABAP开发技术总结]ABAP读写、解析XML文件
20.6. XML. 236 20.6.1. 生成... 237 20.6.2. 解析... 240 20.6. XML if_ixml if_ixml_doc ...
- [SAP ABAP开发技术总结]屏幕跳转
12.18. 屏幕跳转 LEAVE SCREEN. or LEAVE TO SCREEN <next screen>. LEAVE SCREEN语句会结束当前屏幕并 ...
- [SAP ABAP开发技术总结]CLEAR、REFRESH、FREE内表清理区别
1.8. CLEAR.REFRESH.FREE 内表:如果使用有表头行的内表,CLEAR 仅清除表格工作区域.要重置整个内表而不清除表格工作区域,使用REFRESH语句或 CLEAR 语句CLEAR ...
- [SAP ABAP开发技术总结]权限对象检查
20.14. 权限检查 AT SELECTION-SCREEN. DATA: BEGIN OF lt_bukrs OCCURS 0, bukrs TYPE t001 ...
最新文章
- c语言程序设计入门导论,程序设计入门——C语言
- 006_FastDFS文件上传
- java B2B2C Springcloud电子商务平台源码-服务网关过滤器
- Deep Learning菜鸡篇,我的第一个深度神经网络
- .NET Core HttpClient源码探究
- mac bigsur 360极速浏览器闪退问题解决方法
- 架构之美阅读笔记06
- 获得学士学位的机器学习工程工作
- WinRAR 5.60 官方简体中文无广告弹窗版本
- WES 7 FBWF灾难性故障
- 马尔可夫链 以及 隐马尔可夫模型(HMM)
- 关于ZBRUSH弯折功能使用问题
- 通过session实现用户的登录与登出功能
- Snapseed玩出新高度,分分钟让你成p图大神! 转
- 如何解决hbase中数据热点问题
- 使用python计算马哈顿距离、切比雪夫距离、欧式距离、夹角余弦
- HC32F460开发之看门狗功能
- PC购买XGP至游玩的记录-Xbox游戏不显示x下载速度慢解决
- docker 安装与实践
- 009 | JavaWeb企业门户网站项目源码 | 大学生毕业设计 | 极致技术工厂
热门文章
- LVM实现将2块磁盘总空间“合二为一”并挂载到同一目录/移除磁盘
- Vue单页面与多页面的区别
- python 期货程序化_文华财经程序化以外,Python量化是更好的选择
- 校长办公室管理系统c语言,【锦城故事】学软硬结合理论做智慧超群系统是锦城电子的必经之路...
- 《OpenGL编程指南(原书第9版)》——2.8 SPIR-V
- Bigemap APP(Android)手机离线地图使用说明
- MySQL的刷脏页策略
- 如何用Python写一个小游戏(2)
- Youtube 开发通过遥控机控制实现快进快退功能
- Loongson_灵珑9S2A 逸珑8089 3B1500龙芯电脑的使用感触