【ABAP】Field Symbol使用总结
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<fs1>.意思是指向常量的<fs1>,之后不可更改值,比如執行<fs1>?=?‘300’會發生運行時錯誤。如果想實現改值的效果,那么需要ASSIGN一個變量給FS:
DATA?gv_abc(6).
gv_abc?=?'200'.
ASSGIN?gv_abc?TO?<fs1>.
<fs1>?=?'300'.
這時<fs1>就從200變更為300了,另外如果直接改變變量的值,那么<fs1>也會發生變化。比如上例里gv_abc?=?'400',那么<fs1>也隨之變為400,因為<fs1>和gv_abc是綁定了的。
?
假設定義了<fs1>和<fs2>兩個FS,分別ASSGIN到兩個變量,變量A和變量B。
ASSIGN?<fs1>?TO?<fs2>的意思是,讓<fs2>也指向<fs1>所指向的地方,即兩個FS都指向變量A;而<fs2>=?<fs1>的意思是,把<fs1>所指向的變量A的值賦給<fs2>所指向的變量B的值,<fs1>依然指向變量A,<fs2>依然指向變量B。
?
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?<gs_ab>?TYPE?ty_ab.?“ty_ab是個結構,有一個字段為col1
FIELD-SYMBOLS?<gs_ab>?TYPE?ANY.
前者是指定了結構,后者是不指定結構。
之后在為<gs_ab>賦值時,
ASSIGN?COMPONNET?'COL1'?OF?STUCTURE?<gs_ab>TO?<fs1>.
<fs1>?=?'AAA'.
此種寫法對確定結構的定義和未確定結構的定義的<gs_ab>都可行。
?但是有確定結構定義的<gs_ab>可以直接使用<gs_ab>-col1?=?'AAA'來賦值。
一般如果能事先知道結構的話,還是應該用確定結構的方式來定義FS,不確定結構的定義通常用于動態處理。
總結
以上是生活随笔為你收集整理的【ABAP】Field Symbol使用总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 供应商的余额,从哪个表里取
- 下一篇: win7 系统盘下AppData文件夹中