一
前言
如果你写过报表尝试关联LIPS 与 EKPO ,会发现二者关联的行项目字段长度不一致,内容也不一致 , LIPS-VGPOS = 比EKPO-EBELP 多了一个前面的0 (因为VGPOS定义位6位NUM), 所以会多一个前置0.
无法再JOIN 条件中直接写等式关联
本文主要介绍怎么使用不同内容的字段进行表关联
当然前提是这两个字段内容有固定的规律
长度不一致, 但是内容一致的可以直接关联
二
LIPS&EKPO
后续以LIPS 与 EKPO表关联为例
二者的关联条件如下.
LIPS-VGBEL = EKPO-EBELN
LIPS-VGPOS+1(5) = EKPO-EBELP.( LIPS-VGPOS的后5位=EKPO-EBELP)
ps: 关于几种JOIN的区别示例图
三
实现方法
如果你的SAP版本不支持新的ABAP语法.可以使用如下两种方法
间接法
增强法
01
间接法
可以通过自定义表ZTPOSNR建立 5位NUMC与6位NUMC的关系, 该表维护99999条记录
NUMC5 NUMC6
00001 000001
00002 000002
00010 000010
……
关联时通过该表中转一下
LIPS INNER JOIN ZTPOSNR
ON ZTPOSNR~NUMC6 = LIPS~NUMC5
INNER JOIN EKPO
ON EKPO~EBELN = LIPS~VGBEL
AND EKPO~EBELP = ZTPOSNR~NUMC5
02
增强法
在LIPS中增强字段 ZZEBELP (同EBELP长度) .
在BADI
LE_SHP_DELIVERY_PROC
方法
IF_EX_LE_SHP_DELIVERY_PROC~FILL_DELIVERY_ITEM 中赋值
LIPS-ZZEBELP = LIPS-VGPOS+1(5).
后续关联可以直接用LIPS~ZZEBELP = EKPO~EBELP
四
新语法
支持ABAP新语法的版本不用这么麻烦. 可以直接用sql 函数实现
测试验证, 这种写法可以成功
INNER JOIN ekpo AS i ON i~ebeln = p~vgbel AND concat( '0',i~ebelp ) = p~vgpos
这种写法ABAP中不允许,函数只能在等式左边使用.
INNER JOIN ekpo AS i ON i~ebeln = p~vgbel AND i~ebelp = right( p~vgpos, 5 )
五
HANA SQL
HANASQL语句则同时允许两种写法
select a.vbeln,a.posnr,b.ebelp from lips as a inner join ekpo as b on b.mandt = a.mandt and b.ebeln = a.vgbel and b.ebelp = right(a.vgpos,5)
select a.vbeln,a.posnr,b.ebelp from lips as a inner join ekpo as b on b.mandt = a.mandt and b.ebeln = a.vgbel and concat('0',b.ebelp) = a.vgpos
六
CDS语法
CDS 视图是构造在ABAP于数据库之间,可以通过用CDS视图加工数据,ABAP可以直接访问加工后的数据视图. HANA数据库中也可以直接使用CDS视图.
CDS中 两个字段关联会报错
可以使用right(a.vgpos,5)
不支持concat 后参与连接
七
总结
新语法的OPEN SQL不再局限于支持所有数据库SQL, (实际上现在的S4/HANA版本似乎只能安装在HANA数据库上), 所以基本上HANA数据库支持的SQL写法, ABAP都能找到对应的语法支持,
但二者并不完全等同,还是有很多HANA SQL支持的写法, ABAP OPEN SQL 不支持.
可以在ABAP中执行NATIVE SQL 语句 来解决ABAP OPEN SQL 不支持的数据库语句,以提高程序的效率.
详见链接
无峰,公众号:ABAP 技巧与实战ABAP基础知识 怎么访问HANA数据库中的其它CATALOG的表