【ABAP】Field Symbol使用总结
Field?Symbol(以下簡(jiǎn)稱FS),主要作用是程序更加靈活,有時(shí)可以實(shí)現(xiàn)一般做法無(wú)法實(shí)現(xiàn)的功能,比如動(dòng)態(tài)ALV內(nèi)表,LOOP時(shí)使用FS還可以提高程序效率。FS缺點(diǎn)是影響程序可讀性,為修改和維護(hù)代碼造成困難,而且有時(shí)錯(cuò)誤是編譯器檢查不出來(lái)的,只有運(yùn)行時(shí)才會(huì)發(fā)生錯(cuò)誤。下面是FS的一些使用總結(jié)。
?
首先請(qǐng)牢記,FS必須和某個(gè)變量,結(jié)構(gòu)或者內(nèi)表綁定后才能使用,這點(diǎn)和C語(yǔ)言里的指針(在ABAP里最接近指針的是TYPE?REF?TO)是不同的,在使用FS前必須分配給某個(gè)變量,不然會(huì)發(fā)生FS未分配的運(yùn)行時(shí)錯(cuò)誤。注意如果LOOP內(nèi)表時(shí)ASSIGNING到FS.,那么之后假如有REFRESH內(nèi)表的操作的話,FS也會(huì)再次回到初始未被ASSIGN的狀態(tài),這時(shí)如果使用FS也會(huì)發(fā)生FS未分配的RUNTIME?ERROR。
?
ASSIGN?‘200’?TO<fs1>.意思是指向常量的<fs1>,之后不可更改值,比如執(zhí)行<fs1>?=?‘300’會(huì)發(fā)生運(yùn)行時(shí)錯(cuò)誤。如果想實(shí)現(xiàn)改值的效果,那么需要ASSIGN一個(gè)變量給FS:
DATA?gv_abc(6).
gv_abc?=?'200'.
ASSGIN?gv_abc?TO?<fs1>.
<fs1>?=?'300'.
這時(shí)<fs1>就從200變更為300了,另外如果直接改變變量的值,那么<fs1>也會(huì)發(fā)生變化。比如上例里gv_abc?=?'400',那么<fs1>也隨之變?yōu)?/span>400,因?yàn)?lt;fs1>和gv_abc是綁定了的。
?
假設(shè)定義了<fs1>和<fs2>兩個(gè)FS,分別ASSGIN到兩個(gè)變量,變量A和變量B。
ASSIGN?<fs1>?TO?<fs2>的意思是,讓<fs2>也指向<fs1>所指向的地方,即兩個(gè)FS都指向變量A;而<fs2>=?<fs1>的意思是,把<fs1>所指向的變量A的值賦給<fs2>所指向的變量B的值,<fs1>依然指向變量A,<fs2>依然指向變量B。
?
LOOP?內(nèi)表?INTO?結(jié)構(gòu)(工作區(qū))和LOOP內(nèi)表ASSIGNING?<結(jié)構(gòu)>的比較。
LOOP內(nèi)表INTO結(jié)構(gòu)時(shí),系統(tǒng)會(huì)把先把當(dāng)前行的數(shù)據(jù)復(fù)制到結(jié)構(gòu),如果結(jié)構(gòu)的值改了,還需要使用MODIFY語(yǔ)句把更改后的值傳回內(nèi)表。也就是說(shuō),結(jié)構(gòu)是內(nèi)表里的數(shù)據(jù)的一個(gè)副本,操作這個(gè)副本并不會(huì)影響內(nèi)表里的數(shù)據(jù)。帶表頭的內(nèi)表也是類似,LOOP內(nèi)表時(shí),把內(nèi)表數(shù)據(jù)復(fù)制到表頭。
為了提高效率,可以使用FS,FS直接指向內(nèi)表數(shù)據(jù),省去了復(fù)制數(shù)據(jù)到結(jié)構(gòu)的過(guò)程,修改FS的值也就是相當(dāng)于直接修改內(nèi)表里的數(shù)據(jù),不需要再使用MODIFY語(yǔ)句。
這里額外提一點(diǎn),有一些人喜歡在ENDLOOP前使用CLEAR清空結(jié)構(gòu),首先這是沒有必要的,為了提高效率,LOOP內(nèi)的語(yǔ)句應(yīng)該越精簡(jiǎn)越好,其次如果是LOOP到FS的寫法,是不能使用CLEAR清空FS的,因?yàn)閯倓傉f(shuō)了FS是直接指向內(nèi)表數(shù)據(jù),如果清空了FS,那相當(dāng)于把內(nèi)表內(nèi)對(duì)應(yīng)的那行數(shù)據(jù)也給清空了。
此外,像LOOP?AT?內(nèi)表?INTO?<結(jié)構(gòu)>的寫法,初學(xué)者容易混淆,其實(shí)這里的<結(jié)構(gòu)>是指向一個(gè)結(jié)構(gòu),這種寫法和LOOP?內(nèi)表?INTO?結(jié)構(gòu)沒什么區(qū)別。
?
READ?TABLE?內(nèi)表?INTO?結(jié)構(gòu)和READ?TABLE?內(nèi)表?ASSIGNING?<結(jié)構(gòu)>的比較。
效率上的區(qū)別同LOOP的情況,這里說(shuō)下READ?TABLE和LOOP不同的地方,主要差別是,LOOP?是不會(huì)失敗的,而READ?TABLE是可能失敗的,一旦READ失敗,那么結(jié)構(gòu)或<結(jié)構(gòu)>的值依然是上次READ成功的值(而不是清空),所以READ使用完建議根據(jù)情況CLEAR結(jié)構(gòu)或<結(jié)構(gòu)>。
確定結(jié)構(gòu)的FS和不確定結(jié)構(gòu)的FS。
FIELD-SYMBOLS?<gs_ab>?TYPE?ty_ab.?“ty_ab是個(gè)結(jié)構(gòu),有一個(gè)字段為col1
FIELD-SYMBOLS?<gs_ab>?TYPE?ANY.
前者是指定了結(jié)構(gòu),后者是不指定結(jié)構(gòu)。
之后在為<gs_ab>賦值時(shí),
ASSIGN?COMPONNET?'COL1'?OF?STUCTURE?<gs_ab>TO?<fs1>.
<fs1>?=?'AAA'.
此種寫法對(duì)確定結(jié)構(gòu)的定義和未確定結(jié)構(gòu)的定義的<gs_ab>都可行。
?但是有確定結(jié)構(gòu)定義的<gs_ab>可以直接使用<gs_ab>-col1?=?'AAA'來(lái)賦值。
一般如果能事先知道結(jié)構(gòu)的話,還是應(yīng)該用確定結(jié)構(gòu)的方式來(lái)定義FS,不確定結(jié)構(gòu)的定義通常用于動(dòng)態(tài)處理。
總結(jié)
以上是生活随笔為你收集整理的【ABAP】Field Symbol使用总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 供应商的余额,从哪个表里取
- 下一篇: win7 系统盘下AppData文件夹中