转【FOR ALL ENTRIES IN】 总结

 

在ABAP开发中,对于不能使用join的聚集表或者需要使用SELECT 的内表,我们一般使用for all entries in 语句将该表与内表串联,查询出需要的数据,例如: BSEG聚集表为例,如下:

SELECT bseg~kunnr

             bseg~lifnr     

             bseg~belnr

 INTO TABLE itab_bseg

FROM bseg

          FOR ALL ENTRIES IN itab_main

          WHERE bukrs in _bukrs

               and ( belnr = itab_main-belnr

               AND hkont = itab_main-hkont ).

由于BSEG不能和BSIS做inner join所以先将BSIS内容放到itab_main 中,然后用 FOR ALL ENTRIES IN来串联。

 

使用了FOR ALL ENTRIES后,相当于把驱动表里的条件字段的所有值用OR 连起来,一次对DB操作,

条件语句增大,势必使内存占用增多。

 

  1. 使用该语句,对于最后得出的果集系统会自动除重因此如果你要保留重复行记录时,记得在SELECT语句中添加足够键值项目(有必要时,增加全部键值项目),以保证结果集中所需重复项目不会被删除。(例如选取支付金额时,支付事件可能不同,但金额可能相同,此时一定要注意,以避免错误删除结果记录。)
  2. FOR ALL ENTRIES IN后面使用的内部表itab如果为空,系统将视为无条件选取,将当前CLIENT下所有记录选出。因此为避免无意义的全件检索,在使用该语句前一定要判断内部表itab是否为空,为空时不执行包含该语句的数据库检索处理。
  3. 由于itab-f实际上是作为占位符被替换,所以内部表itab中不要包含HEADER(项目标识名称行),以免造成混淆,检索出错。

  4. 内部表itab中作为条件替换用项目的类型和长度,一定要和检索数据库中对应的项目相同,否则编译不能通过。

  5. 对于内部表itab中作为条件替换用项目,不能使用LIKE,BETWEEN,IN比较操作符。因为这些比较操作符都是不确定比较操作符(将选择条件设定在一个范围内),而FOR ALL ENTRIES IN语句的作用相当于将选择条件块全部并列开来,用OR连接,如果每个OR分支中又是不确定的范围,那么系统性能将大大降低,因此R/3系统在使用该语句时禁止使用不确定比较操作符。

  6. 使用该语句时,ORDER BY语句和HAVING语句将不能使用

  7.  

    使用该语句时,COUNT( * )以外的所有合计函数(MAX,MIN,AVG,SUM)都不能使用

    //判断内表是否为空

    使用语句: DESCRIBE TABLE ITAB LINES VARIABLE.判断系统变量sy-subrc是否为0,如果为0就表示不空,反之为空!
    DESCRIBE TABLE ITAB LINES VARIABLE. 
    IF NOT P_VARIANT IS INITIAL.
                                                          WX_VARIANT-VARIANT = P_VARIANT.
                                                          ENDIF.

  8.  

    备注: 使用 for all entries in 虽然在某些方面是很方便的,但是他很耗内存, 在使用时一定要注意, 若不是万万不得已还是建议不要使用为好。

转自:http://blog.chinaunix.net/u2/67664/showart_668213.html

 

 

补:

二、自建表和从系统外导入数据需要注意的问题
1、自建表中建立文本类型的字段(自己创建domain)时,需要注意是否允许字段可以保留文本的大小写状态,否则默认会全部转换为大写字母。
2、对于各种凭证编码字段,如:物料凭证mblnr,kunnr,lifnr,belnr,在导入数据到自建表中时,一定要注意前导0的补充问题,否则导入的数据可能没有前导0,补充前导0的函数为CONVERSION_EXIT_ALPHA_INPUT,另外,在建立自建表时,将该字段对应的domain的Convers. routine:设置为ALPHA

 

转自:http://www.cnblogs.com/zhangchao/archive/2009/02/18/1393313.html

### 理解和使用 'FOR ALL ENTRIES IN' 在 ABAP 编程中 在 ABAP 编程中,`FOR ALL ENTRIES IN` 是一种用于优化数据库查询的语句,允许开发者通过内表中的数据来动态生成 SQL 查询条件。以下是关于 `FOR ALL ENTRIES IN` 的详细解释和使用注意事项: --- #### 1. **'FOR ALL ENTRIES IN' 的基本含义** `FOR ALL ENTRIES IN` 语句用于在 SELECT 语句中根据内表中的每一行生成一个查询条件。它会将内表中的每一行作为查询的一部分,从而避免多次单独执行 SELECT 语句[^1]。 例如: ```abap DATA: it_bkpf TYPE TABLE OF bkpf, it_bseg TYPE TABLE OF bseg. SELECT werks belnr gjahr dmbtr INTO CORRESPONDING FIELDS OF TABLE it_bseg FROM bseg FOR ALL ENTRIES IN it_bkpf WHERE werks = it_bkpf-werks AND belnr = it_bkpf-belnr AND gjahr = it_bkpf-gjahr. ``` 在这个例子中,`FOR ALL ENTRIES IN it_bkpf` 表示系统会为 `it_bkpf` 内表中的每一行生成一个查询条件,并将其合并到一个 SQL 查询中执行。 --- #### 2. **使用 'FOR ALL ENTRIES IN' 的注意事项** ##### (1) **判断内表是否为空** 在使用 `FOR ALL ENTRIES IN` 之前,必须确保内表不为空。如果内表为空,则查询条件中的比较结果会被视为全部为真,这会导致返回过多的数据,严重影响性能。 ```abap IF NOT it_bkpf[] IS INITIAL. " 执行 FOR ALL ENTRIES IN 查询 ENDIF. ``` 这是因为当内表为空时,系统无法找到匹配的行,但会将所有可能的行视为符合条件。 ##### (2) **避免重复数据问题** 使用 `FOR ALL ENTRIES IN` 时,如果查询结果中存在重复数据(即某些字段值完全相同),系统会自动应用 DISTINCT 操作,导致返回的记录数少于预期。为了避免这种情况,需要确保查询结果中包含主键字段,以区分每条记录。 ```abap " 添加主键字段 buzei 到查询中 SELECT werks belnr gjahr dmbtr buzei INTO CORRESPONDING FIELDS OF TABLE it_bseg FROM bseg FOR ALL ENTRIES IN it_bkpf WHERE werks = it_bkpf-werks AND belnr = it_bkpf-belnr AND gjahr = it_bkpf-gjahr. ``` 如果没有主键字段,可能会丢失部分数据。 ##### (3) **性能问题** 当内表非常大时,`FOR ALL ENTRIES IN` 可能会导致性能问题。因为它会将内表中的每一行换为查询条件,最终生成的 SQL 查询可能非常复杂。因此,在使用时需要谨慎评估内表的大小和查询的复杂度[^2]。 --- #### 3. **示例代码** 以下是一个完整的示例,展示如何正确使用 `FOR ALL ENTRIES IN`: ```abap DATA: it_bkpf TYPE TABLE OF bkpf, it_bseg TYPE TABLE OF bseg. " 填充内表 it_bkpf SELECT werks belnr gjahr INTO TABLE it_bkpf FROM bkpf UP TO 10 ROWS. " 检查内表是否为空 IF NOT it_bkpf[] IS INITIAL. SELECT werks belnr gjahr dmbtr buzei INTO CORRESPONDING FIELDS OF TABLE it_bseg FROM bseg FOR ALL ENTRIES IN it_bkpf WHERE werks = it_bkpf-werks AND belnr = it_bkpf-belnr AND gjahr = it_bkpf-gjahr. ENDIF. ``` --- #### 4. **与其他 WHERE 子句结合使用** `FOR ALL ENTRIES IN` 可以与额外的 WHERE 子句结合使用,以进一步限制查询条件。例如: ```abap SELECT werks belnr gjahr dmbtr buzei INTO CORRESPONDING FIELDS OF TABLE it_bseg FROM bseg FOR ALL ENTRIES IN it_bkpf WHERE werks = it_bkpf-werks AND belnr = it_bkpf-belnr AND gjahr = it_bkpf-gjahr AND dmbtr > 0. ``` 在此示例中,`dmbtr > 0` 是额外的过滤条件[^2]。 --- #### 5. **特殊场景下的行为** 当内表为空时,`FOR ALL ENTRIES IN` 的行为会有所不同。例如: ```abap SELECT b_werk b_lager INTO CORRESPONDING FIELDS OF TABLE ty_output_h FROM zwmt029 FOR ALL ENTRIES IN it_matnr WHERE sernr IN s_sernr AND matnr = it_matnr-matnr. ``` 如果 `it_matnr` 为空,则查询条件会被视为全部为真,可能导致返回大量不必要的数据[^4]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值