原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
一
前言
SQVI/SQ02中有个图形化建立表连接的方式,如下图.
通过拖动源表字段到目标表字段, 即可建立连接.
只是标准功能在建立字段连接时限定了字段属性,字段长度等信息必须一致(字段名可以不一致). 否则无法建立连接.
**本文主要介绍怎么去掉图形化表连接中的连接限制**
二
连接限制
下图可以看出,不同名的字段,只要类型,长度相同, 系统允许建立连接.如 字段WERK与BWKEY,字段名不同,字段类型,长度一致.可以连接
字段 MATNR_TS 与 MATNR 字段长度不一致. 但是内容一致.
尝试连接, 系统报错
三
连接限制的影响
标准连接限制了字段类型,字段长度必须一致. 如果不一致, 无法连接. 这样会导致一些特殊的表之间无法用SQVI的图形界面建立连接. 比如
MARA表和DRAW表(记录物料的文档信息).
如果只想通过SQVI做一个简单的清单关联显示物料属性和物料文档信息. 但是因为这两个实际内容一致的字段,长度不一致. 无法用SQVI创建表连接.
只能提交开发写代码了.
四
解决方式
有两个方案可以解决这个问题
_**01** _
**方案一**
创建CDS视图 ZDDL_DRAW ,视图中用MARA-MATNR关联 DRAW-DOKNR,后续SQVI中使用这个视图作为连接表, 关联MARA /
DRAW表.
这个方案比较稳妥. 但也需要开发介入完成CDS视图.
_**02** _
**方案二**
和标准功能硬刚一下. 通过增强去掉标准功能的限制,解决问题.
五
追踪过程
要去除标准功能的限制, 就需要查找标准功能在哪里做的限制, 好在系统有消息提示出错.
查看建立连接报错的消息AQQIS_CNTRL 035
DEBUG中断消息号,查看上下文可以找到 方法 test_join_validity . debug 修改返回值sy-subrc = 0.
系统报另外一个错误 AQQIS_CNTRL 022
进一步跟踪报错消息 可以看到上下文
修改 l_valid 值内容 = ‘X’.
成功建立了字段连接
生成的SQL及执行结果也时正确的.
六
系统改造
通过上述过程得到结果. 只要增强修改 类 CL_QUERY_JOIN_CNTRL
方法
• TEST_JOIN_VALIDITY.
• IS_VALID_LINK
调整返回结果即可.
_**01** _
**修改一**
TEST_JOIN_VALIDITY修改
该方法通过raise 报错. 无法在增强结尾调整返回值. 只能在增强开头重写字段长度,类型检查逻辑,判断是该错误时,弹窗跳过后续处理逻辑.
为了稳妥起见, 增强中还是做了字段类型一致的判断. 如果你是狠人, 可以去掉该检查.
源代码请在文末发送消息 **SQVI源码** 获取
_**02** _
**修改二**
IS_VALID_LINK修改
这个方法虽然有返回值, 但是其中会判断返回值,然后退出处理,
所以也需要在类的开头增强,可以在前一个增强中传递内表变量,这里获取前面传递的内存变量,判断内容. 返回成功标记,并退出.
七
实现效果
尝试建立不同长度的字段的连接时,系统弹窗提示
如果选 否 . 系统提醒出错 ,字段连接失败.
如果选 是. 字段连接成功
查询SQL及查询结果正确
如下截图来自于动态报表,
> 详见链接 无峰,公众号:ABAP 技巧与实战 [ 动态报表D-Query简介
> ](http://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247486429&idx=1&sn=8cbab08040255baa4c7495e6e106230d&chksm=cf5dd6ebf82a5ffdf6cd2cca5ef3b3a298dcb7e3aac2b4cae5073af9c6720bf57b5544c57a49#rd)
八
总结
ABAP语法经过多次改进, 早就没有了表连接的字段长度限制(连接两个表的字段长度需要一致).
但是SQVI/SQ02等程序基于早期ABAP语法规则,建立表连接时检查了字段类型长度. SAP一直没有改进这个逻辑. 原因不详.
通过本文介绍的方法可以修复这个问题. 实现不同长度字段的表连接的建立.
本文中介绍的通过消息号跟踪分析标准逻辑的方法也是一个解决系统报错的最佳实践方法.是行走SAPERP江湖的必备防身技能
**(如果你希望我专门写文介绍该方式,请在文末发送消息给我,消息内容:防身技能)** .
本文介绍的增强在S4 HANA 1909中实现, 其它版本可能会有一些差异.
**为了增加公众号互动. 文中代码做了模糊化处理, 如果你需要源代码, 请在文末发消息: SQVI源码**
**约定**
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
( **如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程.
越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.** )
syjf1976
sharry_xlp
Yannick_Duan
申请进入公众号讨论群提问或者参与话题讨论