https://blog.csdn.net/yang362046076/article/details/51577290
发现个坑,比如 SELECT SINGLE *
INTO @DATA(WA_WMJXRW)
FROM ZTA_WMJXRW
WHERE ZJXDH = @RLMOB-ZJXDH. 当这段代码在一个循环或者重复执行function里的话,如果第一次成功出数据,
第二次没有找到数据的话用IF WA_WMJXRW IS INITIAL判断会为假!!!!还是用sy-subrc判断吧
以前我们要用一个变量的时候,需要在使用语句的前面先定义。现在,可以在使用的时候就定义了。
比如说我们经常要预先定义表的工作区,然后在loop时使用。现在可以在loop的时候就定义对于表的工作区了。
以前:
- DATA itab TYPE TABLE OF scarr.
- SELECT * FROM scarr into TABLE itab.
- DATA wa LIKE LINE OF itab.
- READ TABLE itab WITH KEY carrid = 'LH' INTO wa.
现在:
- DATA itab TYPE TABLE OF scarr.
- SELECT * FROM scarr into TABLE itab.
- READ TABLE itab WITH KEY carrid = 'LH' INTO DATA(wa). "行内定义(inline declaration)变量
LOOP AT同理,注意行内定义的变量作用域和以前定义的是一样的。
又比如在方法中接收返回变量时:
原:
- DATA a1 TYPE.....
- DATA a2 TYPE...
- oref->meth( IMPORTING p1=a1
- IMPORTING p1=a2
- .... )
现在:
- oref->meth( IMPORTING p1 = DATA(a1)
- IMPORTING p1= DATA(a2)
- .... )
对于field symbols也是支持行内定义的。
以前1:
- DATA a TYPE string VALUE 'test'.
- FIELD-SYMBOL <fs>.
- ASSIGN a to <fs>.
现在:
- DATA a TYPE string VALUE 'test'.
- ASSIGN a to FIELD-SYMBOL(<fs>).
还可以用在读取内表中:
- LOOP AT itab ASSIGNING FIELD-SYMBOL(<line>) where carrid = 'LH'. "
- WRITE:<line>.
- ENDLOOP.
和
READ TABLE itab assigning field-symbol(<line2>) INDEX 1.
行内定义方便了我们的使用,在内表中它会自动根据读取的内表类型定义相应的工作区类型。但是使用这种方法注意作用域问题。