Field-Symbols总结
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,反而比普通的工作区写法效率低。
Field-Symbols总结相关推荐
- 什么是 ABAP Field Symbol
ABAP Field Symbol 是 ABAP 这门编程语言一个比较重要的语言特性.在 ABAP 帮助文档里的介绍: 在我十几年前刚刚开始学习 ABAP 时,阅读这段帮助文档的文字,觉得比较晦涩. ...
- ALV Styles in Field catalogue using OOPS
转自http://www.saptechnical.com/Tutorials/ALV/Styles/demo.htm By Swarna S, Tata Consultancy Services * ...
- 一个简单的动态内表alv案例
动态内表的问题一直没搞明白,每次都要复制粘贴. 动态内表的创建和使用主要有以下几点: 1.动态内表的创建,首先要定义动态结构,然后再根据定义的动态结构利用系统一个标准的method:"cl_ ...
- ALV动态列Demo
*-------------ALV 相关-------------------------- DATA: wa_layo TYPE lvc_s_layo. DATA: wa_fcat TYPE lvc ...
- 释疑の语法LOCAL
作用就是把当前对象保存在一个临时存储空间,它只能用到子程序或者FUNTION MODULE里,在程序结束的时候数据对象重新分配在临时空间的值. 如果用LOCAL对同一个对象执行了好几遍,那么只有第一次 ...
- ABAP常见面试问题
1. What is the typical structure of an ABAP program? 2. What are field symbols and field groups.? Ha ...
- ABAP performance学习笔记
去年的时候进行了一下Performance的培训,也实际动手对占用系统资源严重的程序进行了tuning,效果还不错!我tuning的一个程序,在tuning以前需要跑20多个小时,tuning完成以后 ...
- SAP中的邮件发送功能
在SAP中我们可以设置装备摆设STMP邮件功能,可以经由过程SOST来查磕暌故件状况,在编码中可用FM SO_DOCUMENT_SEND_API1 .SO_NEW_DOCUMENT_ATT_SEND_ ...
- ABAP 740里的新语法 - LET表达式
A LET expression defines variables var1, var2, - or field symbols , , - as local auxiliary fields in ...
- 用ABAP代码实现从1累加到100
itab = VALUE #( FOR j = 1 WHILE j <= 100 ( j ) ). * Reduce 后面跟类型 * A constructor expression with ...
最新文章
- icp mysql_MySQL · 特性分析 · Index Condition Pushdown (ICP)
- Entity Framework技术系列之2:三种开发模式实现数据访问
- 如何使用Openfiler为VMware ESX设置一个免费的iSCSI或NAS储存系统
- python—多线程定义和创建(一)
- Asp.Net Core SignalR 与微信小程序交互笔记
- java开发门禁指纹,指纹门禁
- python多久可以精通_学Python需要多久能学会?精通Python需要多长时间?
- html实现在线新闻浏览器,使用JQuery Mobile实现手机新闻浏览器
- DevExpress LookUpEdit 数据绑定
- 一键还原系统(自我笔记)
- IDEA设置SQL格式化(关键字大写)
- 手机号码吉凶测试原理计算公式
- html仿百度贴吧,利用Canvas模仿百度贴吧客户端loading小球的方法示例
- pom.xml文件中的dependency的scope属性值为test,但是Test sources root的文件里面不能使用
- Yii2用户信息存储与获取
- [计算机组成原理] 第六章 控制系统与CPU
- 给SpringBoot Web应用配上JavaFx漂亮衣服
- 王牌竞速安装后显示服务器维护,王牌竞速进不去游戏怎么办 如何解决进不去游戏...
- 国庆放假前一周,再学这些技术,安安稳稳过假期
- 交叉销售(Cross-Selling)与链接分析