1. 程式人生 > >【ABAP】Field Symbol使用總結

【ABAP】Field Symbol使用總結

Field Symbol(以下簡稱FS),主要作用是程式更加靈活,有時可以實現一般做法無法實現的功能,比如動態ALV內表,LOOP使用FS還可以提高程式效率。FS缺點是影響程式可讀性,為修改和維護程式碼造成困難,而且有時錯誤是編譯器檢查不出來的,只有執行時才會發生錯誤。下面是FS的一些使用總結。

首先請牢記,FS必須和某個變數,結構或者內表繫結後才能使用,這點和C語言裡的指標(在ABAP裡最接近指標的是TYPE REF TO)是不同的,在使用FS前必須分配給某個變數,不然會發生FS未分配的執行時錯誤。注意如果LOOP內表時ASSIGNINGFS.,那麼之後假如有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內表時,把內表資料複製到表頭

為了提高效率,可以使用FSFS直接指向內表資料,省去了複製資料到結構的過程,修改FS的值也就是相當於直接修改內表裡的資料,不需要再使用MODIFY語句。

這裡額外提一點,有一些人喜歡在ENDLOOP前使用CLEAR清空結構,首先這是沒有必要的,為了提高效率,LOOP內的語句應該越精簡越好,其次如果是LOOPFS的寫法,是不能使用CLEAR清空FS的,因為剛剛說了FS是直接指向內表資料,如果清空了FS,那相當於把內表內對應的那行資料也給清空了。

此外,像LOOP AT 內表 INTO <結構>的寫法,初學者容易混淆,其實這裡的<結構>是指向一個結構,這種寫法和LOOP 內表 INTO 結構沒什麼區別。

READ TABLE 內表 INTO 結構和READ TABLE 內表 ASSIGNING <結構>的比較。

效率上的區別同LOOP的情況,這裡說下READ TABLELOOP不同的地方,主要差別是,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,不確定結構的定義通常用於動態處理。