Field-Symbols总结

来源:互联网 发布:灰度分析软件 编辑:程序博客网 时间:2024/06/06 22:27
Field-Symbols(以下简称FS)大致类似于C语言里的指针,主要作用是程序更加灵活,有时可以实现一般无法实现的功能(比如之前那篇关于动态内表的),合理使用FS还可以提高程序效率,但是FS也有缺点,影响程序可读性,为修改和维护代码造成困难,出错隐蔽,而且很多错误都是编译器检查不出来的,只有运行时才会发生错误,提示内容也各种千奇百怪,不容易排查错误。


FS的定义类型大体分为变量和表,具体查阅SAP帮助,下面是FS的一些零散的心得和碰到的情况:




1,在使用FS前必须ASSIGN,不然会发生RUNTIME ERROR。


 


2, ASSIGN ‘200’ TO<FS1>.意思是指向常量的<FS1>,之后不可更改值(比如<FS1> = ‘300’),否则发生RUNTIME ERROR。


 


3,如果想实现2里类似的效果,那么需要ASSIGN一个变量给FS:


DATA V_ABC(20) TYPE C.


V_ABC = '200'.


ASSGIN V_ABC TO <FS1>.


<FS1> = '300'.


这时<FS1>就从200变更为300了,另外如果直接改变变量的值,那么<FS1>也会发生变化。
比如上例里V_ABC = '400',那么<FS1>也随之变为400。


 


4, 假设定义了<FS1>和<FS2>两个FS,分别ASSGIN到两个变量,变量A和变量B。


ASSIGN <FS1> TO <FS2>的意思是,让<FS2>同样指向<FS1>所指向的地方,即变量A,执行完该语句后,两个FS都指向变量A。而<FS2>= <FS1>的意思是,<FS2>所指向的变量B的值变成<FS1>所指向的变量A的值,<FS1>和<FS2>仍然是一个指向变量A,一个指向变量B。


 


5,如果LOOP时,LOOP AT IT_TAB ASSIGNING <WA_TAB>.,那么之后假如有REFRESH TABLE的操作的话,<WA_TAB>就再次回到初始未被ASSIGN的状态,这时如果使用<WA_TAB>会RUNTIME ERROR。


 


6,LOOP和READ语句把TABLEASSIGN到工作区的一些写法:


LOOP AT IT_TAB ASSIGNING <WA_TAB>.


READ TABLE IT_TAB ASSIGNING <WA_TAB>INDEX 1.


(注:LOOP AT IT_TAB INTO<WA_TAB>的写法也是允许的,但是含义和ASSIGNING不同,如果之前循环过内表,这里再是INTO的话,读到的数据是上次循环最后一行的数据,只有用ASSIGNING才能保证从内表第一行重新开始循环)。
其中<WA_TAB>有两种定义法:


FIELD-SYMBOLS <WA_TAB> TYPE TY_TAB."结构


FIELD-SYMBOLS <WA_TAB> TYPE ANY.


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


 


之后在为<WA_TAB>赋值时,写法有区别:


ASSIGN COMPONNET 'COL1' OF STUCTURE <WA_TAB>TO <FS1>


<FS> = 'ABC'."为<WA_TAB>里的COL1字段赋值ABC


此种写法对有结构定义和没有结构定义的<WA_TAB>都可行。


 但是有结构定义的<WA_TAB>可以直接使用<WA_TAB>-COL = 'ABC'来赋值。


一般如果知道结构的话,还是应该用TYPE结构的来定义FS。




<WA_TAB>严格说来不是工作区,和WA_TAB工作原理不同,这里只是为了阅读方便才用WA前缀。


下面介绍下为什么<WA_TAB>要比工作区WA_TAB效率高:


内表写数据到工作区时,系统会开辟额外的内存。也就是说,工作区只是内表里的数据的一个副本,操作这个副本并不会影响内表里的数据。在工作区数据量大时,建议使用FS,它是只是一个指针,指向内表数据,所以使用<WA_TAB>操作数据时,是直接操作内表里的数据(而不是像WA_TAB那样是创建副本)。所以使用Field-Symbols比工作区效率更高。


 注意:由于Field-Symbols是直接操作内表里的数据,所以不需要像工作区那样使用MODIFY语句,同理如果是CLEAR语句会直接清空内表里的数据,所以不能像使用工作区那样每次LOOP结束就清空一次工作区。还有就是<WA_TAB>必须是定义结构型才能提高效率,如果是定义成TYPE ANY的FS,反而比普通的工作区写法效率低。
原创粉丝点击