原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
一
前言
SQVI/SQ02中有个图形化建立表连接的方式,如下图,通过拖动源表字段到目标表字段, 即可建立连接.
标准功能在连续左连接时,会报错,阻止已经是左连接的右表参与左连接.如图的连接,标准功能是不允许的.
**本文主要介绍怎么突破图形化连接中的多层左连接限制**
二
连续左连接的业务含义
比如预留执行情况报表中期望查询到预留产生采购申请,采购申请产生采购订单的情况.
有三种可能的数据情况
• 一.预留产生,没有产生采购申请,
• 二.预留产生,产生了采购申请,没有产生采购订单
• 三.预留产生,产生了采购申请,产生了采购订单
用连续的内连接 预留 INNER JOIN 采购申请 ,采购申请INNER JOIN 采购订单 只能显示 (三) 的数据.
预留 LEFT JOIN 采购申请 , 采购申请LEFT JOIN 采购订单 可以显示所有数据.
预留 LEFT JOIN 采购申请, 采购申请INNER JOIN 采购订单. 等同于 连接内连接,只能显示(三)的数据
三
连接字段限制
之前介绍了突破图形界面连接的字段长度限制.
> 详见链接 无峰,公众号:ABAP 技巧与实战 [ SAP小技巧 去掉查询中的表连接字段长度限制
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247488162&idx=1&sn=eaf1ad5918a75ad5053121fc29052907&chksm=cf5dcf94f82a4682ddaf2be565678939180db9849d59c4f2dc24af367dc4ecd0d732fe697a81&token=1193184135&lang=zh_CN#rd)
四
左连接限制
实际报表中,可能需要设置多层左连接,用来表达业务实际的需求.
但是标准图形界面连接中对于左连接的右表,不允许再次设置左连接.
五
跟踪过程
根据如下过程,可以跟踪并解除系统限制
设置消息断点跟踪 消息 AQQIS_CNTRL 020 . 修改 sy-subrc = 0 ,可以跳过这个报错.
但是系统会产生另外一个消息,提示标准逻辑修改了表连接方式.同理可以跟踪消息AQQIS_CNTRL 017 找到系统调整的逻辑.跳过该逻辑
六
增强位置
类 CL_QUERY_JOIN_CNTRL
方法 TEST_JOIN_VALIDITY
开头INCLUDE ZBC_SQVI_JOIN_CHECK 引入下面的代码
方法: REORDER_JOINS 开头
七
实现效果
通过增强跳过系统检查及调整连接方式后, 可以成功建立如下的表的多层左连接.
八
查询结果
下图是动态报表ZDQ 产生的,通过对SQL语句的查看, 可以看出多层左连接在SQL中是生效的.
未验证SQVI 基于多层左连接生产的报表程序是否 正确.
建议多层左连接仅在动态报表中使用
关于动态报表D-Query.
> 详见链接 无峰,公众号:ABAP 技巧与实战 [ 动态报表D-Query简介
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247486429&idx=1&sn=8cbab08040255baa4c7495e6e106230d&chksm=cf5dd6ebf82a5ffdf6cd2cca5ef3b3a298dcb7e3aac2b4cae5073af9c6720bf57b5544c57a49&token=1193184135&lang=zh_CN#rd)
九
总结
ABAP语法经过多次改进,已经允许多层左连接,可以表达正确的业务含义 .
但是SQVI/SQ02等程序基于早期ABAP语法规则,建立表连接时限制了多层左连接. SAP一直没有改进这个逻辑. 原因不详.
通过本文介绍的方法可以修复这个问题. 实现多层左连接的建立.
**约定**
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
( **如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程.
越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.** )
syjf1976
sharry_xlp
Yannick_Duan
申请进入公众号讨论群提问或者参与话题讨论