原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
一
前言
选择屏幕是SAP的一个基本概念, 可以通过简单语法完成选择屏幕的定义
• PARAMETERS
• SELECT-OPTIONS
变式是标准选择屏幕的基本功能,可以把特定的查询条件保存起来,方便后续载入使用.
动态选择屏幕则可以基于程序的需求,通过代码指定表/字段,临时产生一个选择屏幕.
动态选择屏幕没有提供变式功能
**本文主要介绍怎么给动态选择屏幕补充变式功能**
二
标准选择屏幕及变式
标准选择屏幕可以通过标准工具栏中的保存功能创建变式.
如果存在变式,可以通过载入功能读取保存的变式并载入,获取之前保存的选择条件.
三
动态选择屏幕
SAP提供的两个函数实现,如图一
FREE_SELECTIONS_INIT
FREE_SELECTIONS_DIALOG
详细的使用方式可以参考SAP标准DEMO 程序 DEMO_FREE_SELECTIONS
动态选择屏幕会列出指定表的所有字段, 可以传递参数设定字段默认作为选择字段, 也可以在选择界面中双击特定字段作为选择字段, 如图二
图一
图二
四
变式相关函数
标准选择屏幕的变式相关处理函数
RS_CREATE_VARIANT 创建函数Creating a variant (not using a selection screen)
RS_VARIANT_CONTENTS 获取变式内容Select-options + Parameter (mit Werten)
函数组SVAR中包含了所有标准选择屏幕的变式处理函数.
通过对上述两个基本函数的测试发现:变式相关函数都需要传递程序名, RS_CREATE_VARIANT
函数对于程序中不存在的选择字段,即使传递了内容到函数中. 后续处理逻辑还是会根据程序的选择字段判断是否保存传递的选择条件内容.
对于程序不存在的选择字段. 通过函数RS_CREATE_VARIANT传递虽然不会报错. 但通过RS_VARIANT_CONTENTS函数无法读取.
**这也能解释为何动态选择屏幕不提供变式功能,因为变式相关的函数仅支持标准选择屏幕.**
五
动态选择屏幕的应用场景
公众号中介绍的很多通用程序都应用了动态选择屏幕
比如
> 数据同步平台,详见链接 无峰,公众号:ABAP 技巧与实战 [ SAP 工具箱 数据同步平台(八 改进数据过滤机制)
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247487684&idx=1&sn=f321832e37db563aa0ac23b844025e4c&chksm=cf5dcdf2f82a44e4be9bf4d54abd5b25886d7676e64a7b82a2357d72404e5c8d7d40a8a323d1&token=568307911&lang=zh_CN#rd)
> 动态报表,详见链接 无峰,公众号:ABAP 技巧与实战 [ 动态报表D-Query简介
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247486429&idx=1&sn=8cbab08040255baa4c7495e6e106230d&chksm=cf5dd6ebf82a5ffdf6cd2cca5ef3b3a298dcb7e3aac2b4cae5073af9c6720bf57b5544c57a49&token=568307911&lang=zh_CN#rd)
> 通用修改程序,详见链接 无峰,公众号:ABAP 技巧与实战 [ SAP工具箱 通用修改程序(一 简介)
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247487788&idx=1&sn=fc797a64874c042d31da33bb91f2e0dc&chksm=cf5dcc1af82a450cd38be3ebf1e10cf5ccc12c3d9b52ac95bfdfbce7c8a7f3b7881eec609aee&token=568307911&lang=zh_CN#rd)
……
动态选择屏幕的应用让通用程序可以灵活的支持多种应用场景.
六
动态选择屏幕变式功能介绍
下面介绍动态选择屏幕中增加的变式功能. 相对于标准变式功能.
添加了变式的全局/本地属性. 用户通过该属性控制其他人是否能使用用户创建的变式.
没有动态设定日期功能,后续考虑是否能增加该功能(该功能在动态报表中可以通过其它方式配置)
以动态报表为例
调用TCODE执行动态报表,在动态生成的选择屏幕上增加了三个按钮
• 保存变式
• 载入变式
• 退出
保存变式
• 变式ID 系统带出变式ID,该变式ID无法修改,基于不同的场景确定变式ID的内容. 对于动态报表,传递动态报表的查询ID.
• 变式名称
• 变式描述
• 变式类型 ,可以控制该变式仅自己可用还是所有人都可用(A 全局变式所有人可见.U 仅所有者可见)
如果变式已经存在, 如果该变式所有者是当前用户,则弹窗提示覆盖. 如果该变式所有者是他人. 则报错. 用户需要使用一个新的变式名称.
提示变式保存成功
变式载入功能
弹窗列出系统中已保存的变式.(所有者=当前用户的变式及变式属性是A的变式),
选中,确认. 动态选择屏幕回填变式中的内容
如果某个选择字段当前没有激活.但是变式中有该选择字段. 载入时,会自动激活该选择条件并带出之前保存的内容
七
实现方式
变式功能需要考虑的关键点
• 添加屏幕功能
• 从动态选择屏幕获取内容
• 内容保存
• 保存的内容更新动态选择屏幕内容
_**01** _
**定义表**
创建表ZTSEL_VARIANT 动态选择屏幕变式
用来记录动态选择屏幕保存的变式信息
• 其中 VARID 变式ID(特定的事务代码/动态报表查询ID/修改配置ID 等等) 用来识别区分不同功能的变式
• INDX_ID 从动态报表获取的变式内容存放在INDX中.
INDX是一种特殊的表 通过EXPORT/IMPORT 访问. INDX_ID通过号码范围获取号码,作为写入INDX的LOGID
详见链接
_**02** _
**定义函数组**
ZBC_SSEL_VARIANT_FUNCTION
包含函数和GUI状态
• Z_BC_SSEL_VARIANT_LOAD 载入变式
• Z_BC_SSEL_VARIANT_SAVE 保存变式
• 002 Dynamic selections as dialog box
GUI状态中添加三个按钮 保存变式/载入变式/退出
_**03** _
**增强标准程序**
因为动态选择屏幕的函数组 SSEL 系统禁止了增强. 所以只能直接修改标准程序
把修改标准程序的部分整合在了两个INCLUDE 中
• ZBC_SSEL_INCLUDE 动态选择屏幕添加功能按钮的执行逻辑
• ZBC_SSEL_INDLUDE_OUTPUT 替代动态选择屏幕的GUI状态
这两个INCLUDE程序的引入点如下
_**04** _
**传递VARID**
调用动态选择屏幕函数FREE_SELECTIONS_DIALOG 之前. 先传递VARID内容
EXPORT lv_varid = gv_varid TO MEMORY ID 'ZVARID'.用于判断是否给动态选择屏幕添加变式相关按钮及实现变式功能,保存变式时需要记录VARID内容
_**05** _
**源代码**
详见文末
八
总结
动态选择屏幕功能提供了在程序中根据需要的表/字段生成选择屏幕并获取选择屏幕中填写的值. 对于动态编程有极大的便利.
动态报表的选择屏幕就围绕动态选择屏幕功能实现了选择屏幕的可配置性(授权检查,默认值,仅显示等)
SAP提供的动态选择屏幕不支持变式保存功能, 补充变式保存功能将让动态选择屏幕更好用.
**约定**
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
源代码部分付费查看
包含
• 2个include程序
• 2个函数
• 1个函数变量定义