VA01VA02VA03销售订单根据定价和步骤校验权限隐藏价格二

作者:斌将军 约 6 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:SD, 销售分销
VA01VA02VA03销售订单根据定价和步骤校验权限隐藏价格二 - 封面图
VA01VA02VA03销售订单根据定价和步骤校验权限隐藏价格二 - 封面图

## 1.1、内容回顾

> 之前发表过相关文章《VA01/VA02/VA03 销售订单根据定价和步骤校验权限隐藏价格(一)》,本篇文章对上一篇文章做补充说明

>

> 斌将军,公众号:斌将军 [ VA01/VA02/VA03 销售订单根据定价和步骤校验权限隐藏价格(一)

> ](https://mp.weixin.qq.com/s?__biz=Mzg5OTg3ODg2MQ==&mid=2247485356&idx=1&sn=fa8e02d9b2ca0876af73f21c7fc691a7&chksm=c04ddd0ef73a54181b3112e5cea291d86814b18617da13fc7e56e33b4adad5aacd433e36a904#rd)

第一篇文章是通过拥有权限,则隐藏价格的模式,即对需要隐藏价格的用户,配置权限对象,使其通过权限校验,然后隐藏价格;没有配置权限对象的用户,权限校验不通过,则不隐藏价格。

## **1.2、问题说明**

此处存在两个问题:(如果项目忽略这两个问题,则还可以参照第一篇文章的方式实现)

1.对于自定义权限对象,如果将其添加到SAP_ALL中,会导致拥有SAP_ALL权限的用户,也校验通过,并且看不到价格。(主要问题)

VA01VA02VA03销售订单根据定价和步骤校验权限隐藏价格二 - 封面图
VA01VA02VA03销售订单根据定价和步骤校验权限隐藏价格二 - 封面图

2.该方法较反常规,属于拥有权限,但是不能查看价格的反向控制(当然这点不是关键问题)

因此,在实际项目中,为了防止正式机拥有ALL权限的用户无法查看价格,则实施没有权限,隐藏价格,有权限,则查看价格的方式,如此也更能符合思维习惯。

## 2.1、权限分配

可以查看所有价格的用户,配置定价过程字段为ZKG001,配置步骤编号字段为 *

只能查看部分价格的用户,配置定价过程字段为 ZKG0 01 ,配置步骤编号字段为401 - 800,0-400步骤编号的价格则看不到

## 2.2、仅修改权限判断(存在问题)

想要实现没有权限,则隐藏价格,可能直接更改权限的IF判断就可以实现,本来是IF = 0(有权限)隐藏,更改为IF <> 0(无权限)隐藏。

### 2.2.1、存在的问题

在原文中,关于条件页签里面的价格控制可以这么实现,但是对于抬头和条件页签上部的这几个价格字段(步骤编号属于0-400)的控制,是只校验了定价过程,

VA01VA02VA03销售订单根据定价和步骤校验权限隐藏价格二 - 封面图
VA01VA02VA03销售订单根据定价和步骤校验权限隐藏价格二 - 封面图
VA01VA02VA03销售订单根据定价和步骤校验权限隐藏价格二 - 封面图
VA01VA02VA03销售订单根据定价和步骤校验权限隐藏价格二 - 封面图

因为此增强点处没有步骤编号字段,按照原逻辑,此处校验成功了,就可以隐藏价格了。

但是改成当前逻辑,校验成功了,就可以显示价格了,那么只要配置定价过程 ZKG0 01

的用户,就都可以看到,其中也包括配置了定价过程但限制查看价格的用户

VA01VA02VA03销售订单根据定价和步骤校验权限隐藏价格二 - 封面图
VA01VA02VA03销售订单根据定价和步骤校验权限隐藏价格二 - 封面图
VA01VA02VA03销售订单根据定价和步骤校验权限隐藏价格二 - 封面图
VA01VA02VA03销售订单根据定价和步骤校验权限隐藏价格二 - 封面图

因此,只修改IF判断,抬头价格控制不住。

## 2.3、根据用户权限值判断

针对以上两处增强点的修改,通过用户权限值进行判断,因为该权限对象只会存在两种情况:

1.用户维护了定价过程 ZKG0 01 ,步骤编号为*

2.用户维护了定价过程 ZKG0 01 ,步骤编号为401-800

所以只用判断步骤编号是*,则抬头这些价格要显示。如果是范围值,则肯定不显示。

_该方法是根据项目上的实际情况设计的,读者可根据自己项目上的情况,发散思维,找到更加合适的办法。_

### 2.3.1、获取用户维护的权限对象值

通过函数GET_AUTH_VALUES获取当前用户已经配置的权限对象Z_KONH_KLS维护的值

"--------------------@斌将军-------------------- "获取用户权限对象的值 CALL FUNCTION 'GET_AUTH_VALUES' EXPORTING object1 = 'Z_KONH_KLS' user = sy-uname tcode = sy-tcode* optimize = TABLES values = gt_us335 EXCEPTIONS user_doesnt_exist = 1 OTHERS = 2. IF sy-subrc <> 0.* Implement suitable error handling here ENDIF."--------------------@斌将军--------------------

### 2.3.2、参考代码

因为这些增强点是会反复调用,所以定义全局内表gt_us335,如果已经获取过权限值,就不再重复获取,提高代码效率

VA01VA02VA03销售订单根据定价和步骤校验权限隐藏价格二 - 封面图
VA01VA02VA03销售订单根据定价和步骤校验权限隐藏价格二 - 封面图

程序MV45AFZZ→USEREXIT_FIELD_MODIFICATION

"--------------------@斌将军--------------------FORM userexit_field_modification.ENHANCEMENT 1 ZSD007_VA01_PRICE. "active versionIF sy-tcode = 'VA01' OR sy-tcode = 'VA02' OR sy-tcode = 'VA03'.IF screen-name = 'KOMV-KBETR' OR screen-name = 'VBAK-NETWR'"抬头 净值 OR screen-name = 'VBAK-WAERK'"抬头 货币 OR screen-name = 'VBAP-NETPR'"项目 净价 OR screen-name = 'VBAP-NETWR'."项目 净值

IF gt_us335 IS INITIAL. "获取用户权限对象的值 CALL FUNCTION 'GET_AUTH_VALUES' EXPORTING object1 = 'Z_KONH_KLS' user = sy-uname tcode = sy-tcode* optimize = TABLES values = gt_us335 EXCEPTIONS user_doesnt_exist = 1 OTHERS = 2. IF sy-subrc <> 0.* Implement suitable error handling here ENDIF.

SORT gt_us335 BY object field lowval highval. DELETE ADJACENT DUPLICATES FROM gt_us335 COMPARING object field lowval highval. "抛内存到LV69AF01 FREE zcl_sd_memory_id=>sd005. CLEAR:gv_sd007_hide_price. READ TABLE gt_us335 WITH KEY field = 'ZSTUNR' lowval = '*' TRANSPORTING NO FIELDS. IF sy-subrc NE 0. gv_sd007_hide_price = 'X'."不显示 EXPORT gv_sd007_hide_price TO MEMORY ID zcl_sd_memory_id=>sd005. ENDIF. ENDIF.

IF gv_sd007_hide_price = 'X'. screen-active = 0. MODIFY SCREEN. ENDIF. ENDIF.ENDIF.ENDENHANCEMENT."--------------------@斌将军--------------------

程序LV69AF01→TCTRL_KONDITIONEN_INIT

"--------------------@斌将军--------------------FORM tctrl_konditionen_init. DATA: da_tfill LIKE sy-tabix.

• Refresh table control if screen number has changed STATICS: last_dynnr TYPE dynnr. IF sy-dynnr NE last_dynnr AND gf_called_by_lord IS INITIAL. last_dynnr = sy-dynnr. REFRESH CONTROL 'tctrl_konditionen' FROM SCREEN sy-dynnr. ENDIF.

DESCRIBE TABLE xkomv LINES da_tfill.

......

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(1)*$*$-Start: (1)---------------------------------------------------------------------------------$*$*ENHANCEMENT 6 ZSD007_SALES_PRICE. "active versionIF sy-tcode = 'VA01' OR sy-tcode = 'VA02' OR sy-tcode = 'VA03'. DATA:gv_sd007_hide_price TYPE char1."X 不显示 LOOP AT SCREEN. IF screen-name = 'KOMP-NETWR' "净值 OR screen-name = 'KOMK-WAERK' "货币 OR screen-name = 'KOMP-MWSBP'. "税收. IMPORT gv_sd007_hide_price FROM MEMORY ID zcl_sd_memory_id=>sd005. IF gv_sd007_hide_price = 'X'."不显示 screen-active = 0. MODIFY SCREEN. ENDIF. ENDIF. ENDLOOP.ENDIF.ENDENHANCEMENT.ENDFORM. "tctrl_konditionen_init"--------------------@斌将军--------------------

条件页签列表里面的价格控制,和第一篇文章的一致,只用更改权限的IF判断即可,此处不再赘述

到此,通过权限配置,正向控制隐藏部分价格的增强就完成了

斌将军

关于作者:斌将军

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「VA01VA02VA03销售订单根据定价和步骤校验权限隐藏价格二.md」整理生成,仅用于内部技术分享与学习交流。