SAP ABAP 里使用select 筛选条件里 在另一个表里查找结果为真或假的怎么写? 不好意思,没啥分。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SAP ABAP 里使用select 筛选条件里 在另一个表里查找结果为真或假的怎么写? 不好意思,没啥分。相关的知识,希望对你有一定的参考价值。

比如
select MATNR LFIMG VRKME into (ITAB-MATNR,ITAB-LFIMG )
from LIPS
where VBELN in ( select VBELN from VBFA where VBELV eq ITAB1-VBELN
and POSNV eq ITAB1-POSNR and VBTYP_N = 'J') .
实际上我就是想取在VBFA里能找到订单号的就取LIPS里的数据。
select MATNR LFIMG VRKME into (ITAB-MATNR,ITAB-LFIMG )
from LIPS
where VBELN = ITAB1-VBELN and ( select VBELN from VBFA where VBELV eq ITAB1-VBELN
and POSNV eq ITAB1-POSNR and VBTYP_N = 'J') = ture.

ABAP有它自己独特的取数方法与逻辑, 和我们用SQL语句直接查询不同, 这个思维要转换过来! !

第一步: 到出作为筛选条件的数据放入内表:
SELECT vbeln
FROM vbfa
INTO TABLE gt_vbfa
WHERE vbtyp_n = 'J' .

第二步: 用FOR ALL ENTRIES IN 前要先判断是否为空
IF gt_vbfa IS NOT INITIAL .
SELECT matnr lfimg vrkme
FROM lips

INTO gt_lips
FOR ALL ENTRIES IN gt_vbfa
WHERE vbeln = gt_vbfa-vbeln
AND vbelv = gt_vbfa-vbelv

AND posnv = gt_vbfa-posnr .
ENDIF .

第三步: 使用内表里面的数据
LOOP AT gt_lips INTO gwa_lips
......

ENDLOOP .

备注:ABAP 还有很多规范及性能上的要求, 总之数据是SAP系统整个业务的核心, 不是简单的增,删, 改, 查!

希望这简单的回答能对你有所帮助!
参考技术A LIPS是交货单 VBFA是销售凭证流

不知道你是什么逻辑 需要根据VBFA中是否有记录才取LIPS中交货单

你所说的VBFA 里面有才取LIPS 是可以用楼上所说的inner join的

join之后 如果VBFA不存在那行记录 join之后是没有数据的,但是可能出现重复行,可以删掉

另外,你也可以查询出来之后,然后判断是否存在VBFA中 不存在则删除

哎哎哎 就说这么些吧 搞不懂你究竟想写什么
参考技术B 在ABAP中,SQL语句有自己的特殊性,你的需求应该是联表查询吧,按照你的要求应该类似这样

select a~MATNR a~LFIMG VRKME into (ITAB-MATNR,ITAB-LFIMG )
from LIPS AS a
INNER JOIN VBFA AS b
ON a~连接字段1 = b~连接字段1 and a~连接字段2 = b~连接字段2…… (两个表的关联字段)
WHERE 条件

该语法应该可以解决你的问题追问

不是INNER JOIN,
我的意思是我在A表里查数据,但有一个条件是某字段在B表中有对应记录的才取A表的值,没有就跳过。
就是说在SELECT里的其中的一个条件是 查询B表返回值为真。

追答

那就用FOR ALL ENTRIES IN 选项
将B表中关联字段筛选到内表itab_B中(注意去重,ITAB_B最好参照结构,语法中要引用字段),假设该字段为B,而对应A表字段中为B2
SELECT 字段
INTO ITAB_A
FROM A
FOR ALL ENTRIES IN ITAB_B
WHERE B2 = ITAB_B-B
这样的话,就是说B2的值在内表ITAB_B中时,才会选择A表中对应的数据

不知道这个可以不,试试吧

本回答被提问者采纳
参考技术C inner join 可以解决你的问题呀,inner join 和 FOR ALL ENTRIES IN在两表能连接的情况下是相同的。你的问题是不是就是
select f1 from A
inner Join B(AB连接的条件)

where (B中的字段 = J) and (A中的VBELN= xxx)。
如果不满足 B中的字段 = J,就筛选出去不要。就这样呗。
参考技术D 楼主的意思似乎是 itab1作为条件,查看vbfa的下一个活动是否是lips中的记录,有的话就去lips中查.
你想要的真假判断我也不知.
但给个思路:
用for all entries in itab1 从vbfa中得到满足条件的数据放入新的内表itab2
让后for all enti in itab2去查询lips的数据
个人认为这个应该能达到你的目的,而且效率应该还算不错.

一些通过SAP ABAP代码审查得出的ABAP编程最佳实践

1. 这两个IF ELSE分支里检测的条件其实逻辑上来说都是同一类,应该合并到一个IF分支里进行检查:

技术图片

It is an expensive operation to open a file in application server with 50MB file size.

技术图片

Current logic is:

1. Open the file in application server

2. Read the file content line by line

3. If the file is regarding IPG or MIDH or TPG, handle with each line separately

The correct logic should be:

1. Check the file path whether it is IPG or MIDH or TPG related. If not, quit the report.

2. Handle with each line directly without evaluate file path in the BIG loop.

The validation logic for input records should be improved

技术图片

Loop at all service BOM, check whether the ID in current loop does exist in validation table lt_valid_prod or lt_valid_sp. If so, delete them via DELETE TABLE XXX FROM

Improvement: use DELETE XXX WHERE product_id NOT IN

这是一个性能问题。使用ABAP原生支持的NOT IN关键字可以获得更好的性能。性能评测如下:

技术图片

Avoid using SELECT to access table with a large number of entries

In product / IObject area, the best practice is to use OPEN CURSOR / FETCH NEXT CURSOR to access big DB table.

如果需要用ABAP OPEN SQL读取一张包含海量记录的数据库表,那么推荐使用OPEN CURSOR进行分块读取。

技术图片

Although this solution will spend almost the same time to fetch the data from DB, it has far less memory consumption compared with using SELECT to fetch ALL data from DB at one time.

The original dump due to out of memory issue could be eliminated by replace SELECT with OPEN CURSOR statement.

这种方式和直接用SELECT相比,能显著减少内存消耗量。

使用并发编程提高应用程序场景

通过下面这段代码模拟一个费时的ABAP程序:

定义一个ABAP函数:

技术图片

技术图片

这个函数里执行一大堆计算,然后把传入的product ID写到一张自定义表ZJERRY1里。

技术图片

调用这个函数的代码:

技术图片

技术图片

注意第二种方案使用STARTING NEW TASK达到的并发执行效果:

技术图片

通过比较,第二种解决方案的效率是第一种的四倍。

技术图片

1. The more CPU & DB time spent in ZINSERT, the better performance will be gained by using

parallel processing (Asynchronous RFC call).

2. The more number of ZINSERT call, the better performance will be gained by using parallel

processing.

技术图片

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

技术图片

以上是关于SAP ABAP 里使用select 筛选条件里 在另一个表里查找结果为真或假的怎么写? 不好意思,没啥分。的主要内容,如果未能解决你的问题,请参考以下文章

一些通过SAP ABAP代码审查得出的ABAP编程最佳实践

ABAP高手请进

SAP ABAP:如何获取select某个条件下的条目数

SAP 云平台上的 ABAP 编程环境里如何消费第三方服务

SAP ABAP 编程问题

使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise系统里的函数