ABAP 之 多个内表相互关联的几种方式

举报
百里丶落云 发表于 2023/08/14 17:05:07 2023/08/14
【摘要】 序HELLO,大家好,这里是百里,一个学习中的ABAPER,在SAP的开发中,肯定避免不了获取多个透明表标准数据, 通过多个表相互关联获取对应报表或者实现某种功能.那么我们该如何实现多个内表相互关联的方式呢, 从此引入. 为什么要获取内容数据为了保证数据的冗余性,SAP 标准表将数据分为多个标准表内存放,不同之间的有主从键相互关联.或者不同的表有相互关联字段,从而串通起来整个业务关系.我们...

HELLO,大家好,这里是百里,一个学习中的ABAPER,在SAP的开发中,肯定避免不了获取多个透明表标准数据, 通过多个表相互关联获取对应报表或者实现某种功能.那么我们该如何实现多个内表相互关联的方式呢, 从此引入.

为什么要获取内容数据

为了保证数据的冗余性,SAP 标准表将数据分为多个标准表内存放,不同之间的有主从键相互关联.或者不同的表有相互关联字段,从而串通起来整个业务关系.我们一般是将报表或者功能的主要数据获取数据称之为主数据,其他的数据通过单独存入内容,循环或者接拼接等方式存进最终使用内表.

使用 join的方式将多个内表进行关联

在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) 中.

使用WITH 的方式将两个内表关联

在SAP HANA版本中,我们可以使用WITH 的方式,从对应的标准表中把数据存放入对应的内表数据,在通过查询内表的方式,取出对应的数据.

案例

我们依然使用销售订单的VBAK 及 VBAP 表,取数据逻辑与上面相同都是关联,但是写入方式不一样.

WITH 关联

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 操作.

使用LOOP 循环的方式进行关联

这种方式,可以说是经常使用,为什么呢,因为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 关联的三种方式, 各位各取所需,没有说哪种比较好,按照实际应用自己判断即可.

百里鸡汤

月缺不改光,剑折不改刚,有志向的人自信自强。

这里是百里,一个努力的学习者. 努力学习好好记录,点滴进步,就是成功.

wallhaven-9d6xmw.jpg

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。