abap field symbol指针操作使用

  • 3
  • 193 views
  • A+
所属分类:业务系统

Field Symbol(以下简称FS),主要作用是程序更加灵活,有时可以实现一般做法无法实现的功能,比如动态ALV内表,LOOP时使用FS还可以提高程序效率。FS缺点是影响程序可读性,为修改和维护代码造成困难,而且有时错误是编译器检查不出来的,只有运行时才会发生错误。下面是FS的一些使用总结。

首先请牢记,FS必须和某个变量,结构或者内表绑定后才能使用,这点和C语言里的指针(在ABAP里最接近指针的是TYPE REF TO)是不同的,在使用FS前必须分配给某个变量,不然会发生FS未分配的运行时错误。注意如果LOOP内表时ASSIGNING到FS.,那么之后假如有REFRESH内表的操作的话,FS也会再次回到初始未被ASSIGN的状态,这时如果使用FS也会发生FS未分配的RUNTIME ERROR。

ASSIGN ‘200’ TO.意思是指向常量的,之后不可更改值,比如执行 = ‘300’会发生运行时错误。如果想实现改值的效果,那么需要ASSIGN一个变量给FS:
DATA gv_abc(6).
gv_abc = '200'.
ASSGIN gv_abc TO .
= '300'.
这时就从200变更为300了,另外如果直接改变变量的值,那么也会发生变化。比如上例里gv_abc = '400',那么也随之变为400,因为和gv_abc是绑定了的。

假设定义了两个FS,分别ASSGIN到两个变量,变量A和变量B。
ASSIGN TO 的意思是,让也指向所指向的地方,即两个FS都指向变量A;而= 的意思是,把所指向的变量A的值赋给所指向的变量B的值,依然指向变量A,依然指向变量B。

LOOP 内表 INTO 结构(工作区)和LOOP内表ASSIGNING <结构>的比较。
LOOP内表INTO结构时,系统会把先把当前行的数据复制到结构,如果结构的值改了,还需要使用MODIFY语句把更改后的值传回内表。也就是说,结构是内表里的数据的一个副本,操作这个副本并不会影响内表里的数据。带表头的内表也是类似,LOOP内表时,把内表数据复制到表头。
为了提高效率,可以使用FS,FS直接指向内表数据,省去了复制数据到结构的过程,修改FS的值也就是相当于直接修改内表里的数据,不需要再使用MODIFY语句。
这里额外提一点,有一些人喜欢在ENDLOOP前使用CLEAR清空结构,首先这是没有必要的,为了提高效率,LOOP内的语句应该越精简越好,其次如果是LOOP到FS的写法,是不能使用CLEAR清空FS的,因为刚刚说了FS是直接指向内表数据,如果清空了FS,那相当于把内表内对应的那行数据也给清空了。
此外,像LOOP AT 内表 INTO <结构>的写法,初学者容易混淆,其实这里的<结构>是指向一个结构,这种写法和LOOP 内表 INTO 结构没什么区别。

READ TABLE 内表 INTO 结构和READ TABLE 内表 ASSIGNING <结构>的比较。
效率上的区别同LOOP的情况,这里说下READ TABLE和LOOP不同的地方,主要差别是,LOOP 是不会失败的,而READ TABLE是可能失败的,一旦READ失败,那么结构或<结构>的值依然是上次READ成功的值(而不是清空),所以READ使用完建议根据情况CLEAR结构或<结构>。
确定结构的FS和不确定结构的FS。
FIELD-SYMBOLS TYPE ty_ab. “ty_ab是个结构,有一个字段为col1
FIELD-SYMBOLS TYPE ANY.
前者是指定了结构,后者是不指定结构。
之后在为赋值时,
ASSIGN COMPONNET 'COL1' OF STUCTURE TO .
= 'AAA'.
此种写法对确定结构的定义和未确定结构的定义的都可行。
但是有确定结构定义的可以直接使用-col1 = 'AAA'来赋值。
一般如果能事先知道结构的话,还是应该用确定结构的方式来定义FS,不确定结构的定义通常用于动态处理。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:3   其中:访客  3   博主  0

    • ag

      又例如,当你的ALV表头列是不确定的时候(例如以所有供应商作为表头、用所有产品组作为表头、用所有物料组作为表头等),就得使用fs来解决了!

      • ag

        例如,根据输入的月份读取表lfc1中某个月并赋值到内表,就必须要用fs才能完成。

        • ag

          有些情况必须要使用fs才能搞得定,比如不确定的alv表头、不确定要读取的内表行等。总之,当我们需要获取或者给某个变量赋值,但是变量名或者我们读取的元数据的名称是无法预先定义的时候,就得用fs.