原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
一
前言
SQVI是SAP中创建查询报表的一种工具, 可以快速创建并生成简单的ALV输出的查询报表.项目中常常会有用户在生产系统中直接通过SQVI创建报表,
并创建事务代码调用该报表.
由此也产生了问题, 当该报表需要修改的时候, 因为当初的用户离职,其他人无法调整该报表
**本文介绍怎么识别SQVI创建的报表并且使用任意账号修改特定的SQVI报表**
二
初识
> 详见链接 故事与茶,公众号:ABAP开发技巧 [ 玩转SAP 基础|SQVI快速配置ALV报表
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247484992&idx=1&sn=c1a3532913f0c2ec29e006297abcb8da&chksm=cf5ddb76f82a52601648e0193e58ee94c88b2e7afe15e3ee657f6eed6b68916ad9f72507e15a&token=1550017738&lang=zh_CN#rd)
> SQVI进阶
>
> 无峰,公众号:ABAP 技巧与实战 [ SAP小技巧 去掉SQVI中的连接限制(多层左连接)
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247488232&idx=1&sn=5ee3e0591408eaac2e2d14516c6fb615&chksm=cf5dcfdef82a46c87067422692cf0c81220ff473b187fcc5f883410c58a09630ae125823066b&token=1550017738&lang=zh_CN#rd)
三
追踪
特定的SQVI生成的报表, 只有创建查询的用户才能修改查询,重新生成报表.
那问题来了: 怎么获取SQVI生成报表程序的对应的用户名?
SQVI创建的查询生成的程序名
AQTGSYSTQV000020ZSDF09========
其中包含了查询分组和查询名信息
可以确定 ZSDF09是查询名
通过表 AQLTQ 可以找到查询分组,可惜 该表中并未记录用户和用户组的关系. 该用户组是系统生成的用户组, 无法通过SQ03查看.
可以通过跟踪的方法查询到
程序 LAQIEXBF01 121行左右设置断点
执行SQVI 中断到断点位置, 内表 DBBG中包含了查询组和用户的关系.
通过上述逻辑可以写一个简单程序查询到SQVI生成的程序是由哪个用户生成的.该程序从AQGDB(aq)中读取用户组和用户的关系,内表DBBG.
四
篡位
解决了上面的问题了, 又会产生新的问题,如果不知道该用户的密码, 或者该用户已经被删除,又怎么修改该用户创建的查询呢?
可以在程序 MS38A_STATE 175行左右设置断点, 修改 函数返回的用户组.
最好在函数RSAQ_QUICK_VIEW_USER_GROUP
结束位置通过隐射增强调整用户的用户组到指定的用户组(通过配置表指定),这样特定用户就可以通过简单配置修改任意其它用户创建的SQVI查询了.
把用户组修改成查询对应的用户组, 这样任何一个用户通过SQVI就可以查询到该用户组的查询了.
可以直接修改这个查询 . 修改后,可能会变成你的查询(该结论未验证,不过已经不太重要了).
五
正常查询的事务代码
项目一般建议通过SQ03/SQ02/SQ01创建查询. 并创建事务代码调用查询, 因为查询的事务代码创建有些需要注意的, 特意标记如下.
其中 REPORT 的内容 使用 用户组占用 12位 + G(表示全局)
六
总结
项目中不建议执直接在生产系统通过SQVI创建报表, 一般情况是在开发系统通过SQ03/SQ02/SQ01 创建用户组->分配用户->创建数据集->创建查询.
这个过程会产生传输请求, 最后再创建事务代码调用报表. 最后把用户组,数据集,查询,事务代码传递到生产系统使用.
** THE **
** END **
**约定**
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
syjf1976
sharry_xlp
Yannick_Duan
申请进入公众号讨论群提问或者参与话题讨论