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
DATA gv_abc(6).
gv_abc = ‘200’.
ASSGIN gv_abc TO
这时
假设定义了
ASSIGN
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
FIELD-SYMBOLS
前者是指定了结构,后者是不指定结构。
之后在为
ASSIGN COMPONNET ‘COL1’ OF STUCTURE
此种写法对确定结构的定义和未确定结构的定义的
但是有确定结构定义的
一般如果能事先知道结构的话,还是应该用确定结构的方式来定义FS,不确定结构的定义通常用于动态处理。
本文作者: GavinDong
版权属于: GavinDong博客
文章链接: https://gavindong.com/1158.html
如果使用过程中遇到问题,可 **点击此处** 交流沟通。
版权所有,转载时必须以链接形式注明作者和原始出处及本声明。
评论列表(3条)
又例如,当你的ALV表头列是不确定的时候(例如以所有供应商作为表头、用所有产品组作为表头、用所有物料组作为表头等),就得使用fs来解决了!
例如,根据输入的月份读取表lfc1中某个月并赋值到内表,就必须要用fs才能完成。
有些情况必须要使用fs才能搞得定,比如不确定的alv表头、不确定要读取的内表行等。总之,当我们需要获取或者给某个变量赋值,但是变量名或者我们读取的元数据的名称是无法预先定义的时候,就得用fs.