Field Symbol使用总结

【博主SAP/ABAP交流群689746838

Field Symbol是ABAP里的引用,类似于C语言里的指针,引用是存储变量的地址(内存地址),它指向一个变量,而不是变量本身。使用引用可以节省内存空间,提高程序执行效率,让程序更加灵活,还可以实现一般做法无法实现的功能,比如动态编程。引用的缺点是影响程序可读性,为修改和维护代码造成困难,而且有些错误是编译器检查不出来的,只有运行时才会发生错误,所以要熟练使用引用需要一定经验的积累。ABAP里引用有两种方法,Field Symbol和TYPE REF TO,本文只讨论Field Symbol(以下简称FS)。

首先,FS必须先分配(ASSIGN)给某个变量,结构或者内表后才能使用,不然会发生FS未分配的运行时错误。如果之后这个变量,结构或者内表被清空了,那么FS也会回到未分配的状态。

下面是一些用法:

ASSIGN ‘200’ TO .

意思是指向常量的,之后不可更改值,比如执行 = ‘300’会发生运行时错误。如果想实现改值的效果,那么需要ASSIGN一个变量给FS:.

gv_abc = '200'.

ASSGIN gv_abc TO .

 = '300'.

这时就从200变更为300了,另外如果直接改变变量的值,那么也会发生变化。比如上例里执行gv_abc = '400'的语句,那么也会随之变为400,因为是分配给了gv_abc,可以认为两者是绑定了的。

 

假设定义了两个FS,分别分配到两个变量,变量A和变量B。

ASSIGN  TO 的意思是,让也指向所指向的地方,即两个FS都指向变量A;而的意思是,把所指向的变量A的值赋给所指向的变量B的值,依然指向变量A,依然指向变量B。

 

LOOP 内表 INTO 结构(工作区)和LOOP 内表 ASSIGNING 的比较。

LOOP 内表 INTO 结构,系统会把先把当前行的数据复制到结构,如果结构的值改了,还需要使用MODIFY语句把更改后的值传回内表。也就是说,结构是内表里的数据的一个副本,操作这个副本并不会影响内表里的数据。带表头的内表也是类似,LOOP内表时,把内表数据复制到表头。为了提高效率,可以使用LOOP 内表 ASSIGNING ,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 结构或

 

确定结构的和不确定结构的

FIELD-SYMBOLS  TYPE ty_ab.(ty_ab是个结构)

FIELD-SYMBOLS  TYPE ANY.

前者是指定了结构,后者是不指定结构。

之后在为赋值时,

ASSIGN COMPONENT 'COL1' OF STUCTURE TO .

 = 'AAA'.

此种写法对确定结构的定义和未确定结构的定义的都可行。

 但是有确定结构定义的可以直接使用-col1 = 'AAA'来赋值。

一般如果能事先知道结构的话,还是应该用确定结构的方式来定义FS,不确定结构的定义通常用于动态处理。

你可能感兴趣的:(SAP,ABAP)