上一个坑讲到了FOR ALL ENTRIES,今天来说一说RANGE。
何谓RANGE?
RANGE就是在选择屏幕上常用的多选,其本质是一个有固定结构的内表。
RANGE有两种定义方式,
1、常用定义方式,用在选择屏幕上面:
SELECT-OPTIONS : S_MATNR FOR MARA-MATNR.
2、不常用定义方式,一般用在不需要在选择屏幕显示的情况:
RANGES : S_MATNR FOR MARA-MATNR.
3、奇葩定义方式,因为RANGE本质上就是一个内表,而且只要数据类型正确,字段名SAP不怎么CARE。(因为奇葩,所以大家不要用)
RANGE有两个常见坑:
1、如果RANGE为空,则 IN RANGE总是为TRUE。
比如:
如果s_matnr为空,会取出ersda = 20140924的全部数据。
现在换个写法,把AND换为OR:
因为 matnr IN s_matnr 为真,所以这个语句会取出所有的MARA的数据。
敲黑板:这一点在非SQL的逻辑表达式更容易出错,如下例,会输出Y!
2、RANGE数据太多会造成程序DUMP
在SQL中使用RANGE的时候,会把所有的数据都放到一个SQL语句里面,因为SQL语句是有长度限制的,所以如果RANGE数据太多,就造成SQL语句超长,程序就会DUMP了。
所以,要避免在RANGE里面放太多的数据。