Use For all entries in abap sql need attention...

Use For all entries in abap sql need attention

 

 

1SELECT CARRID

          CONNID

          FLDATE

          PRICE

    FROM SFLIGHT

    INTO TABLE GT_tab

     FOR ALL ENTRIES IN GT_SFLIGHT

   WHERE CARRID = GT_SFLIGHT-CARRID

     AND CONNID = GT_SFLIGHT-CONNID.

WHERE 条件中,GT_SFLIGHT-CARRIDGT_SFLIGHT-CONNID这些列将用作占位符。该 SELECT 语句的结果集是 SELECT 语句的所有结果集的联合,这些结果集是用内部表 GT_SFLIGHT 中的相应值在每一行上替换占位符的结果。

 

2.使用该语句,对于最后得出的结果集系统会自动删除重复行,也就是distinct的问题。因此如果你要保留重复行记录时,记得在SELECT语句中添加足够键值项目,以保证结果集中所需重复项目不会被删除。

 

3FOR ALL ENTRIES IN后面使用的内表itab如果为空,系统将视为无条件选取,将当前CLIENT下所有记录选出。因此为避免无意义的全件检索,在使用该语句前一定要判断内部表itab是否为空,为空时不执行包含该语句的数据库检索处理。

 

4.由于itab-f实际上是作为占位符被替换,所以内部表itab中不要包含HEADER行,以免造成混淆,检索出错。

 

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

 

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

 

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

 

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

 

9.使用时,最好先按照选择条件字段排序,这样会改善performance.

 

10.使用FOR ALLl ENTRIES存在的风险

 SELECT语句中使用FOR ALL ENTRIES时,SAP系统在将OPEN SQL转换成NATIVE SQL时将进行如下形式的转换:

   SELECT CARRID

          CONNID

          PRICE

    FROM SFLIGHT

    INTO TABLE IT_PRICE

     FOR ALL ENTRIES IN IT_SFLIGHT

   WHERE CARRID = IT_SFLIGHT-CARRID

     AND CONNID = IT_SFLIGHT-CONNID'.

 

To:

     SELECT DISTINCT CARRID

                  CONNID

                  PRICE

    FROM SFLIGHT

    INTO TABLE IT_PRICE

   WHERE ( CARRID = 'LH'   AND

           CONNID = '2415' ) OR

         ( CARRID = 'SQ'   AND

           CONNID = '0026' ) OR

         ( CARRID = 'LH'   AND

           CONNID = '0400' ) .

 

也就是会将for all entries内表中的记录展开成or语句连接成 condition语句,这样当内表记录非常大时,该select语句亦非常的庞大。当这些选择条件达到一定的数量时就会出现 "DBIF_RSQL_INVALID_RSQL 错误,这是由于后台数据库对于选择条件的数量是有一定的限制的,达到这个限制时就会出现如上运行时错误。不同的后台数据库这个限制数量也是不同的。

   IN range table亦同。

 

解决方案:可以根据错误“DBIF_RSQL_INVALID_RSQL SAP官网查找notes

 

posted on 2010-07-14 16:46  封起De日子  阅读(124)  评论(0编辑  收藏  举报

导航