Use For all entries in abap sql need attention...
Use For all entries in abap sql need attention
1.SELECT 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-CARRID和GT_SFLIGHT-CONNID这些列将用作占位符。该 SELECT 语句的结果集是 SELECT 语句的所有结果集的联合,这些结果集是用内部表 GT_SFLIGHT 中的相应值在每一行上替换占位符的结果。
2.使用该语句,对于最后得出的结果集系统会自动删除重复行,也就是distinct的问题。因此如果你要保留重复行记录时,记得在SELECT语句中添加足够键值项目,以保证结果集中所需重复项目不会被删除。
3.FOR 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。