开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情
HELLO,大家好,这里是百里,一个学习中的ABAPER,在SAP的开发中,肯定避免不了获取多个透明表标准数据, 通过多个表相互关联获取对应报表或者实现某种功能.那么我们该如何实现多个内表相互关联的方式呢, 从此引入.
为了保证数据的冗余性,SAP 标准表将数据分为多个标准表内存放,不同之间的有主从键相互关联.或者不同的表有相互关联字段,从而串通起来整个业务关系.我们一般是将报表或者功能的主要数据获取数据称之为主数据,其他的数据通过单独存入内容,循环或者接拼接等方式存进最终使用内表.
在SAP HANA 数据库中,我们可以想sql 一样使用,将内容当做透明表数据即可,我们就可以通过关联的方式获取内表数据.
我们这使用销售订单的VBAK 及 VABP 透明表当做案例.将VBAK 及 VBAP 的数据分别取出放在对应不同的内表数据中,然后采用join的方式的按照对应的条件进行关联,从而获取数据.
# 获取VBAK的数据到临时内表中
select vbeln , ERDAT ,ERZET ,ERNAM from vbak AS A into table @data(lt_vbak) .
# 获取VBAP的数据到临时内表中
select vbeln , POSNR ,MATNR ,MATWA from vbap AS Ainto table @data(lt_vbap) .
#通过inner join 将要两个内表相互关联
select a~vbeln ,a~ERDAT ,A~ERZET , A~ERNAM , B~POSNR ,B~MATNR ,B~MATWA
FROM @LT_VBAP AS A INNER JOIN @LT_VBAP AS B ON A~VBELN = B~VBELN INTO TABLE @DATA(LT_GATA) .
此时我们的两个内表数据通过关联就新放入到对应的新内表(LT_GATA) 中.
在SAP HANA版本中,我们可以使用WITH 的方式,从对应的标准表中把数据存放入对应的内表数据,在通过查询内表的方式,取出对应的数据.
我们依然使用销售订单的VBAK 及 VBAP 表,取数据逻辑与上面相同都是关联,但是写入方式不一样.
TABLES:vbak,vbap.
WITH
+vbak AS
( SELECT vbeln, ernam FROM vbak ),
+vbap AS
( SELECT vbeln, posnr FROM vbap )
SELECT a~vbeln ,
b~posnr ,
a~ernam
FROM +vbak AS a
INNER JOIN +vbap AS b ON a~vbeln EQ b~vbeln
INTO TABLE @DATA(lt_gata).
此时我们实现了和案例一一样的结果,但是我们仅仅在一个sql 就实现了. 不过这种使用也有缺点,就是没办法精确的debug ,因为系统会认为这是一个sql 语句. 不过优点就是比方案1快 不少,因为减少了相关的IO 操作.
这种方式,可以说是经常使用,为什么呢,因为ABAP 中并没有那么灵活,而且用户的业务是多种多样的,我们没办法那么灵活的解决大部分问题,只能采用此种笨方法, 当然也是基础方法.
比如经常遇到的区间案例,号码案例,求和案例,最大值最小值案例. 我们呢就可以先将主数据存入到对应的主内表,然后其他的数据经过复杂的计算逻辑存入内表,经过关联到输出内表中.
# 获取VBAK的数据到临时内表中
select vbeln , ERDAT ,ERZET ,ERNAM from vbak AS A into table @data(lt_vbak) .
# 获取VBAP的数据到临时内表中
select vbeln , POSNR ,MATNR ,MATWA from vbap AS Ainto table @data(lt_vbap) .
move lt_vbak to gt_data.
loop at lt_vbak into data(ls_vbak) .
read table lt_vbap into data(ls_vbap) witn key vbeln = ls_vbak-vbeln .
gs_data-posnr = ls_vbap-posnr .
......省略.
modify gt_data from gs_data tramforming vbeln = ls_Vbak-vbeln.
clear ls_vbak .
endloop .
没错就是这么多又这么麻烦. 但是不得不用,因为复杂的东西我们不太方便只用一个或者简单几个sql 就可以实现相关功能.
今天讲述的是内表的相互关联的几种方式,其中包括数据量不大业务逻辑少的 join 关联 ,with 关联, 还有业务复杂使用传统loop 关联的三种方式, 各位各取所需,没有说哪种比较好,按照实际应用自己判断即可.
月缺不改光,剑折不改刚,有志向的人自信自强。
这里是百里,一个努力的学习者. 努力学习好好记录,点滴进步,就是成功.