无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
**点击蓝字** 关注我们
一
前言
动态报表是我开发的一个类似于SQVI 的报表查询器.可以快速实现一个查询报表. 并且附加了很多常见的报表功能,并且可以关联多个查询结果到一个清单中.
详细介绍见链接
> 动态报表简介 无峰,公众号:ABAP 技巧与实战 [ 动态报表简介
> ](http://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247484349&idx=1&sn=7160806c652949599e972738b3f27f33&chksm=cf5dde8bf82a579d930094caea2792af92886b0bf0f4307839b9b0f0f20eeb51fbced0b1c78b#rd)
动态报表远程安装目前还有点小问题(区别于服务器版本), 无法自行安装.
感兴趣的朋友可以准备一个VPN连接, 联系我远程连接系统,制作一个本地安装包供你使用.
**本文介绍一下动态报表对左连接的一种特殊查询支持.**
二
需求说明
假定有两个表 ZTTS_H, ZTTS_I. 如下图.
观察表内容,可以看到ZTTS_H 中的凭证 1003/1004/1006/1007 在ZTTS_I表中不存在.
如果我们要查询不完整的凭证( ZTTS_H 中存在的凭证,但是ZTTS_I中不存在的凭证 )
SQL语句的实现比较简单
SELECT H~*,I~* FROM ZTTS_H AS H LEFT JOIN ZTTS_I AS I ON I~VBELN = H~VBELNWHERE I~WERKS IS NULL
但是如果通过报表,则无法实现这种查询了. 因为报表的选择条件中不支持解析为 NULL值.
只能在查询ALV结果中使用 过滤器过滤 WERKS = ''的值(因为ABAP层面已经为这些不存在内容的字段赋值''了,可以使用'' 来过滤数据)
但是这种基于结果的过滤会导致性能大幅下降.
三
动态报表的实现方式
通过动态报表可以非常简单的实现上述查询
_**01** _
**建立一个查询**
使用ZTTS_H表,关联ZTTS_I. 使用左外连接
_**02** _
**设置选择条件**
把明细表ZTTS_I 中的任意字段作为选择条件
_**03** _
**输入特殊选择条件**
在选择界面输入特定字符 NULL 或 # (如果选择字段长度不足4位,可以输入 # )
_**04** _
**执行结果**
后续动态报表执行时,会把NULL 或 # 解析成 IS NULL
这样动态报表的输出结果中就实现了只显示ZTTS_H表存在且ZTTS_I表不存在的数据.
_**05** _
**特殊说明**
如果选择屏幕输入下图 后续会解析成 IS NOT NULL . 此时的效果等同于 INNER JOIN 关联的结果
四
总结
恰当的使用左连接中右表的NULL判断. 会给查找特定类型的数据带来很大的性能改进. 动态报表D-Query引入对 IS NULL
的支持将丰富动态报表支援的业务场景.
可以解决此类的报表查询需求. 比如
• 获取没有任何MARC条目的商品( 查询商品存在与MARA 但不存在与MARC的记录)
• 获取没有维护任何销售视图的客户(查询客户存在与KNA1 但是不存在KBVV的记录)
• ....
** THE **
** END **
**约定**
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
( **如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程.
越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.** )
**公众号 : syjf1976_abap**
**ABAP开发技巧**
**微信号 : 392077**
**公众号主群加入受限, 请扫码加入副群后,向管理员申请加入主群**