Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2472073
  • 博文数量: 1576
  • 博客积分: 19423
  • 博客等级: 上将
  • 技术积分: 16112
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-19 21:36
个人简介

专注专心

文章分类

全部博文(1576)

文章存档

2020年(10)

2018年(8)

2016年(6)

2015年(21)

2014年(32)

2013年(279)

2012年(516)

2011年(309)

2010年(260)

2009年(92)

2008年(15)

2007年(28)

我的朋友

分类: IT职场

2020-09-24 20:24:05

魔鬼在细节中:你不一定知道的SAP程序变式和选择变量

小哈公社关注
2018.09.07 11:37:03字数 3,958阅读 3,120

文 | SAP油瓶哥

前言

说起SAP中的变式(Variant),SAP从业者肯定不会陌生,对于选择屏幕复杂的程序界面,我们可以使用变式来简化界面(比如隐藏不相关字段),对于经常使用的并且每次都需要输入相同筛选条件的程序(比如每月都要执行的报表),可以设定和调用变式来简化操作,此外当我们需要需要设定后台JOB时,我们也需要为后台程序指定相应的变式。

本文尝试为变式相关概念做些总结,并再简单说下变式中的选择变量(Selection variables)的用法。

维护变式

当我们新定义一个变式时,我们需要:

进入程序界面,在选择屏幕输入选择条件

点击保存按钮进入变式属性界面

填上变式名字和描述

保存

或者我们也可以通过SE38,填上程序名,选择子对象变式,点击显示或修改按钮进入变式维护界面。

当我们需要从前台调用时变式时,只要点击变式按钮双击想调用的变式即可。

需要注意的是当一个程序的变式数大于10个时,点击变式按钮会弹出额外的选择界面:

这些常规操作,大家应该都非常熟悉,这里我们来看下变式属性的其他选项,看看他们都有什么作用。

变式属性

使用屏幕分配 (Use screen assignment)

如果一个程序包含多个选择屏幕(例如:COOIS),当我们只想编辑某一个选择屏幕的变式属性时,可以先在右侧勾选选择屏幕号,然后再点击使用屏幕分配按钮,这时下方的窗格就会只显示对应的选择屏幕字段,当然SAP中大多数程序还是只有一个选择屏幕界面,所以这个按钮用到的情况并不多。

仅用于后台处理 (Only for Background Processing)

如果勾上了此项,那么变式就不能在前台被调用了,只能用于后台JOB。

保护变式 (Protect Variant)

勾选后,该变式其他用户无法修改。

仅在目录中显示 (Only Display in Catalog)

勾选后,点击变式按钮不会看见此变式,变式也不会出现在SE38的变式子界面的搜索帮助中,只能在变式目录中找到此变式。

变式目录可以在SE38的变式子界面,通过如下菜单位置找到:

仅出现在变式目录中的变式依然可以被用于定义后台JOB:

系统变式 (System Variant)

该选项无法手工勾选,当定义新的系统变式或查看系统变式时会自动勾上。

关于系统变式可以分享的几点如下:

A. 系统变式命名以SAP&或CUS&开头,SAP&表示SAP原生定义的系统变式,CUS&表示客户自定义的系统变式

B. 无法为本地程序定义系统变式,否则系统会给出DB248报错

C. 系统变式不会被覆盖并且只能由创建者或最后修改者修改

D. 系统变式保存时会触发自动传输(Workbench类型,传输对象是 LIMU VARI)

E. 当传输程序时,对应的系统变式会一起被传输

F. 系统变式不区分Client (not client-specific),系统变式只能从Client 000中调用T类型选择变量(静态变量),这个下面会谈到。

屏幕字段类型 (Type)

屏幕字段一共有两种类型,P和S , P表示参数(PARAMETERS),S表示选择选项(SELECTION-OPTIONS),从前台界面上来看就会一下子明白。(这里需要说明的是,并不是屏幕上看到单个空格的就一定是P类型,用SELECTION-OPTIONS定义的选择屏幕也是可以实现单个空格效果的)。

不同类型的屏幕字段也只能调用相应类型的选择变量,这个下面会谈到。

保护字段 (Protect field)

勾选后,当程序调用此变式执行时,字段在前台选择屏幕上可见,但不接受用户输入,只能在维护变式时录入。

隐藏字段 (Hide field / Hide field 'TO')

勾选后,当程序调用此变式执行时,字段在前台选择屏幕上将不可见,但在维护变式时录入的值依然有效。

保存无值的字段 (Save field without values)

使用后,系统在保存变式时会不考虑录入的字段值。

如果该字段与MEMORY ID无关,那么对该字段系统将以空值保存在变式中。

如果该字段与MEMORY ID有关,那么系统在调用变式时该字段值会受到SAP memory中的值和用户变量的影响,具体三者间的关系,后面会谈到。关于MEMORY ID下面也会聊到。

GPA关闭 (Switch GPA off)

这里的GPA指的是SPA/GPA, 即SELECT/GET Parameter ID,也就是用户参数文件中的SET/GET 参数标识(可以用SU3或SU01维护),Parameter ID(pid)存在表TPARA中。

要讨论这个选项,我们需要先说下SAP memory。我们在日常操作中肯定注意过这种现象,就是有时我们进入到一些程序时(注意:不是用变式启动),会发现有些字段的值已经自动填写上了,这里其实用到了SAP memory机制。在这种机制下,当一个屏幕被调用时,那些用MEMORY ID语法定义的屏幕字段会去SAP memory中搜寻当前值,并自动填充到屏幕上。SAP memory是与用户ID绑定的,这种机制提高了用户的操作体验。

下面我们先看一个例子,理解下这个自动填充的逻辑:

登录SAP, 我们在SU3中维护PID WRK = 8000

进入MB51, 会发现工厂字段是自动填写上8000的

我们手工改为6000 (注意:要按下回车才会进入SAP memory),退出MB51

再次进入MB51,会发现工厂字段默认带出了6000 (其实进入MB52也会发现工厂字段自动会带出6000)

我们手工改为空,退出MB51

再次进入MB51,会发现工厂字段默认为空

登出SAP,再次登录SAP,进入MB51,会发现工厂字段自动带出了8000

退出MB51,进入SU3修改WRK = 6010

再次进入MB51,会发现工厂字段默认带出了6010

这里我们就可以明白这个SAP memory的工作原理了,当我们以无变式方式进入一个程序屏幕时,假如A字段用到了MEMORY ID语句关联了PID,并且没有在语法中给出默认值,那么当SAP memory中有值时系统会优先调用(注意:包括其他屏幕操作写入的值、空值和新保存在用户参数文件中的值),当SAP memory中还没有值时(比如刚登录系统,未进行其他操作),系统会去检查用户参数文件中有无维护PID,如果有,就调用PID值(包括空值),如果没有,那么就以初始值显示(即空值)。

回到GPA关闭这个选项上来,首先这个选项只对使用了MEMORY ID定义的屏幕字段有效,对其他屏幕字段来说这个选项是不可编辑的。如果我们勾选了GPA关闭,那么当我们调用变式时,就不会触发SAP memory机制。

更详细的举例可以参加后面的组合测试部分。

要求的字段 (Required field)

使用后,当程序调用此变式执行时,该字段在选择屏幕上变为必输项。

选择变量 (Selection variable)

选择变量可以帮助我们更灵活去管理变式,目前SAP支持的选择变量一共有4种:

静态变量,即表TVARVC中的值 (类型T)

动态日期计算 (类型D、X)

动态时间计算 (类型Z、Y)

用户变量 (类型B)

下面我们依次来看下这几种变量的用法。

T类型选择变量:表TVARVC中的值

我们可以直接将表TVARVC中定义的值用在变式中,这样当选择条件发生小的变更时,就不用每次都去变更已有的变式,只要更新表TVARVC中的静态变量即可。

T类型选择变量也可以配合保护字段一起使用。

假如我们每月需要为所有的工厂执行一系列的报表或程序,我们为这些程序创建了变式,并设定了后台JOB,随着业务的增长,每当有新的工厂被创建后,我们需要为这一系列程序去修改变式。如果我们在表TVARVC中定义了一个ZPLANT的变量(类型:选择选项),并将这个变量应用在所有的变式中,这样当业务环境发生变化时,我们就仅需要去修改ZPLANT这个变量值,这将大大简化我们的工作量。

关于T类型的选择变量,其他需要说明的有:

A. T类型选择变量存储在表TVARV和TVARVC中,TVARV不区分Client,TVARVC区分Client

B. 自Release 610开始, TVARV 被TVARVC所替代,可以用程序RSTVARVCLIENTDEPENDENT来将 TVARV的值拷贝至TVARVC

C. 事务码STVARV可以用来维护当前Client的表TVARVC中的值,事务码STVARVC可以在任一Client维护Client 000的表TVARVC的值。也可以在变式属性定义界面通过菜单>环境>定义选择变量进行维护。

D. Client 000中的表TVARVC中的值是给系统变式用的。

E. P类型的屏幕字段可以调用表TVARVC中的参数值,S类型的屏幕字段可以调用表TVARVC中的选择选项值

F. 因为动态期间计算不能涵盖所有场景,我们可以根据需要在表TVARVC创建变量,并开发一个程序进行定期更新。

比如事务码IDCNACCTBLN中的年份和期间这两个字段不能使用动态计算,我们可以在表TVARVC创建变量ZCURRENT_YEAR(本年)和ZLAST_PERIOD(上月),通过一个自开发程序每月去更新ZCURRENT_PERIOD,每年去更新ZCURRENT_YEAR。

注意:T类型的选择变量会影响到所有调用它的变式

D、X类型选择变量:动态日期计算

只有数据类型为DATS的屏幕字段才能使用动态日期计算。D类型动态日期计算使用的是本地日期,X类型使用的是系统日期。

SAP支持的动态日期计算选择如下:

Z、Y类型选择变量:动态时间计算

只有数据类型为TIMS的的屏幕字段才能使用动态时间计算。Z类型动态日期计算使用的是本地时间,Y类型使用的是系统时间。

SAP支持的动态时间计算选择如下:

B类型选择变量:用户变量 (User-specific Selection Variables)

最后来看下用户变量,用户变量是与用户ID绑定的选择变量,如果我们要在变式中使用用户变量,需要满足3个条件:

No.1 该屏幕字段用到了MEMORY ID语法关联到了PID;

No.2 表TUVID 中有相应的PID值;

No.3 已经维护了相应的用户变量值 (用户变量存储在表TVARUVN中)。

当以上条件达到时,我们在维护变式时就可以选择类型B作为选择变量,并且系统会自动带出变量名称。

维护用户变量

维护用户变量的方法有两种:

一. 通过菜单

A. 在选择屏幕中,通过菜单>转到>用户变量进入维护界面

B. 单击要维护的PID

C. 眼镜按钮会显示当前的用户参数值,笔按钮会进入修改界面,如果点击获取,会读取当前的用户参数值并填到屏幕字段上

D. 点击笔后,选择变量,填上参数值保存即可。(注意:需要点击删除才会保存成功,如果选择保存空,就会以空值保存

E. 点击笔后,如果点击选择屏幕,系统会读取当前屏幕上的值做出输入参照

F. 如果要删除用户变量值,需要进入修改界面然后将参数值改为空,最后选择删除即可

二. 调用功能

用户变量也可以通过SE37调用功能来修改,相关的功能如下:

VARI_USER_VARS_GET: 读取现有变量值

VARI_USER_VARS_SET: 修改现有变量值

VARI_USER_VARS_COPY:复制变量值

VARI_USER_VARS_DELETE:删除变量值

VARI_USER_VARS_RENAME:重命名变量值

VARI_USER_VARS_DIALOG:出现对话框输入变量值

组合测试

我们可以看到用户变量和SAP memory都关联到了PID,那么它们间的关系又是怎样的呢?我自己花了点时间测试了下保存无值字段,GPA关闭及用户变量这几个易混淆的选项,在此也把测试的结果分享给大家,希望大家看过后可以了然于胸。

测试对象:

测试场景:

测试结果:

从上面可以看出,如果不考虑保存无值字段的影响,系统取值时优先级最高的是用户变量,然后是创建变式时手工录入的字段值,最后是GPA(SAP memory)

文件链接:

密码: u9cu

后记

本篇缘起年前的一次用户培训上,在讲到如何设置变式中的动态计算变量时,用户提到为什么事务码IDCNACCTBLN中的年度和期间不能设置动态计算,一开始只是想弄清这个,没曾想写的过程中觉得,要不看看所有的变式属性都有什么用,哎,系统变式是啥,以前没注意过啊,GPA是什么东东?反正不会是大学成绩绩点,保存无值字段该怎么理解,怎么还有个B类型的选择变量。。

我觉得我某种程度是有强迫症的。

以上。

参考资料

1746893 - Dynamic date and time calculation in variant

1994216 - How to maintain variant variables in table TVARVC

557314 - As of Release 610: TVARV replaced with TVARVC

770084 - Maintaining TVARVC in transaction STVARV

372724 - Maintenance of report variants

Dynamic date selection in Variants

Dynamic Dates in Screen Variants

Create SAP Dynamic Variant using Date Calculation

SAP Documentation: Variant Maintenance

SAP Documentation: SPA/GPA Parameters as Default Values


阅读(406) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~