SAP工具箱 动态选择屏幕添加变式功能

前言

选择屏幕是SAP的一个基本概念, 可以通过简单语法完成选择屏幕的定义

  • PARAMETERS

  • SELECT-OPTIONS

变式是标准选择屏幕的基本功能,可以把特定的查询条件保存起来,方便后续载入使用.

动态选择屏幕则可以基于程序的需求,通过代码指定表/字段,临时产生一个选择屏幕.

动态选择屏幕没有提供变式功能

本文主要介绍怎么给动态选择屏幕补充变式功能

标准选择屏幕及变式

标准选择屏幕可以通过标准工具栏中的保存功能创建变式.

如果存在变式,可以通过载入功能读取保存的变式并载入,获取之前保存的选择条件.

25ffb6752c53ec7eb7f3efdafa97f093.png

1ced21b627e7551888b77989a6c6a34b.png

cd662d834d05733265bfd7c55d19a045.png

动态选择屏幕

SAP提供的两个函数实现,如图一

FREE_SELECTIONS_INIT

FREE_SELECTIONS_DIALOG

详细的使用方式可以参考SAP标准DEMO 程序 DEMO_FREE_SELECTIONS

动态选择屏幕会列出指定表的所有字段, 可以传递参数设定字段默认作为选择字段, 也可以在选择界面中双击特定字段作为选择字段, 如图二

db6994d468cbd724deb9ff788dd76bf6.png

图一

819448e3273097002fc43f636a7dc675.png

图二

变式相关函数

标准选择屏幕的变式相关处理函数

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函数无法读取.

这也能解释为何动态选择屏幕不提供变式功能,因为变式相关的函数仅支持标准选择屏幕.

0bd5d4de10a9763f18483412fbd73bb0.png

动态选择屏幕的应用场景

公众号中介绍的很多通用程序都应用了动态选择屏幕

比如

数据同步平台,详见链接

无峰,公众号:ABAP 技巧与实战SAP 工具箱 数据同步平台(八 改进数据过滤机制)

动态报表,详见链接

无峰,公众号:ABAP 技巧与实战动态报表D-Query简介

通用修改程序,详见链接

无峰,公众号:ABAP 技巧与实战SAP工具箱 通用修改程序(一 简介)

……

动态选择屏幕的应用让通用程序可以灵活的支持多种应用场景.

动态选择屏幕变式功能介绍

下面介绍动态选择屏幕中增加的变式功能. 相对于标准变式功能. 

添加了变式的全局/本地属性. 用户通过该属性控制其他人是否能使用用户创建的变式.

没有动态设定日期功能,后续考虑是否能增加该功能(该功能在动态报表中可以通过其它方式配置)

以动态报表为例

9c49655f3f89beccd707048d3709ff81.png

调用TCODE执行动态报表,在动态生成的选择屏幕上增加了三个按钮

  • 保存变式

  • 载入变式

  • 退出

96537698f117feeed7b35fe204ecfdfc.png

保存变式

  • 变式ID 系统带出变式ID,该变式ID无法修改,基于不同的场景确定变式ID的内容. 对于动态报表,传递动态报表的查询ID.

  • 变式名称

  • 变式描述

  • 变式类型 ,可以控制该变式仅自己可用还是所有人都可用(A 全局变式所有人可见.U 仅所有者可见)

9cebfa2ce6d71d0af24c318956b73f0d.png

如果变式已经存在, 如果该变式所有者是当前用户,则弹窗提示覆盖. 如果该变式所有者是他人. 则报错. 用户需要使用一个新的变式名称.

e480a7dd45f7362317fcbfbc17679f61.png

提示变式保存成功

197f31b337f89bf681118621bb48ad96.png

变式载入功能

弹窗列出系统中已保存的变式.(所有者=当前用户的变式及变式属性是A的变式),

选中,确认. 动态选择屏幕回填变式中的内容

如果某个选择字段当前没有激活.但是变式中有该选择字段. 载入时,会自动激活该选择条件并带出之前保存的内容

4a816fabe101f92c8d3c7267da614e87.png

实现方式

变式功能需要考虑的关键点

  • 添加屏幕功能

  • 从动态选择屏幕获取内容

  • 内容保存

  • 保存的内容更新动态选择屏幕内容

01

定义表

创建表ZTSEL_VARIANT 动态选择屏幕变式

用来记录动态选择屏幕保存的变式信息

  • 其中 VARID 变式ID(特定的事务代码/动态报表查询ID/修改配置ID 等等) 用来识别区分不同功能的变式

  • INDX_ID  从动态报表获取的变式内容存放在INDX中.

INDX是一种特殊的表 通过EXPORT/IMPORT 访问. INDX_ID通过号码范围获取号码,作为写入INDX的LOGID

详见链接

b81ff1acb348e8c726f34baf782deaca.png

02

定义函数组

ZBC_SSEL_VARIANT_FUNCTION

包含函数和GUI状态

  • Z_BC_SSEL_VARIANT_LOAD 载入变式

  • Z_BC_SSEL_VARIANT_SAVE 保存变式

  • 002 Dynamic selections as dialog box

GUI状态中添加三个按钮 保存变式/载入变式/退出 

969d523fd7afc64fcb16c1de6d1c71f2.png

0872d7d3d6db5074462463518301c898.png

03

增强标准程序

因为动态选择屏幕的函数组 SSEL 系统禁止了增强. 所以只能直接修改标准程序

把修改标准程序的部分整合在了两个INCLUDE 中

  • ZBC_SSEL_INCLUDE               动态选择屏幕添加功能按钮的执行逻辑

  • ZBC_SSEL_INDLUDE_OUTPUT        替代动态选择屏幕的GUI状态

这两个INCLUDE程序的引入点如下

f94d98f3120e753b50ae6fca267dbece.png

cf2652b1bb0eaf411636991a933efbcd.png

04

传递VARID

调用动态选择屏幕函数FREE_SELECTIONS_DIALOG 之前. 先传递VARID内容

 EXPORT lv_varid = gv_varid TO MEMORY ID 'ZVARID'.

用于判断是否给动态选择屏幕添加变式相关按钮及实现变式功能,保存变式时需要记录VARID内容

ed2e06de3f6503846ff86b6f4f3822bc.png

05

源代码

详见文末

总结

动态选择屏幕功能提供了在程序中根据需要的表/字段生成选择屏幕并获取选择屏幕中填写的值. 对于动态编程有极大的便利.

动态报表的选择屏幕就围绕动态选择屏幕功能实现了选择屏幕的可配置性(授权检查,默认值,仅显示等)

SAP提供的动态选择屏幕不支持变式保存功能,补充变式保存功能将让动态选择屏幕更好用.

约定

如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.       

源代码部分付费查看

包含

  • 2个include程序

  • 2个函数

  • 1个函数变量定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值