FIELD SYMBOL和TYPE REF TO的用法和比较
Type Ref To(以下簡稱:TRT)和?Field Symbol(以下簡稱:FS)在?ABAP?中都有著類似指針的作用;
下面結合對比和實例來介紹下兩者的用法和區別之處。
先預定義類型ty_ym,內表it_ym,工作區wa_ym,變量v_ym(char20)以供后面使用:
一、定義
Type Ref To?和?Field Symbol?的定義都可以指定特定的類型或者結構,或者不指定。
二、初始化
Type Ref To 有兩種初始化的方法:
第一種是用?CREATE DATA?動態開辟內存;
第二種是用?GET REFERENCE OF?指向已經存在的內存變量.
Field Symbol?的初始化,則只能指向已經存在的內存變量。
如果定義 ref 是指定特定的類型或者結構的,那么 CREATE DATA 時 TYPE 可以省略。
無論定義時 ref 是否有特定的類型或者結構,CREATE DATA 時必須指定特定的類型或者結構,不能是data這種泛型的。
在使用 Field Symbol 和 Type Ref To 前必須初始化,不然會發生 RUNTIME ERROR。
三、使用
如果第一步定義時指定了特定的類型或者結構,那么 Field Symbol 和 Type Ref To 都可以直接使用;
如果第一步定義時沒有指定類型或者結構,那么 Type Ref To 必須 ASSIGN 到另外一個 Field Symbol 里間接使用。
1) 指定特定的類型時:
| 1 2 | ref ->* = 'abc'. <fs> =?'abc'. |
2) 指定特定的結構時:
| 1 2 | ref->*-col1 = 'abc'.? "簡寫是ref->col1 < fs >-col1 =?'abc'. |
3) 不指定特定的類型或者結構時:
注意事項:
一般來說為了使用方便,還是應該指定 Field Symbol 或者 Type Ref To 的類型或者結構,以便之后直接使用。
在使用 Type Ref To 時,如果是 TYPE REF TO DATA,那么之后想使用這個 Type Ref To 時,依然會不可避免的用到 Field Symbol;
這樣代碼寫起來就很麻煩,還不如一開始就使用 Field Symbol 寫。
但像動態內表這種事先不知道結構的場合,那么只能使用 Type Ref To,再結合 Field Symbol;
如果直接使用 Field Symbol,那么 Field Symbol 將無法參考某個已經存在的結構進行初始化。
第一步假如 TYPE REF TO DATA,后面的第二步初始化時依然要指定特定的結構,所以還不如第一步就指定結構。
建議只有在事先不知道結構時,才使用泛型定義。
所以要么定義和初始化時都指定類型或者結構,要么就是動態內表或者結構都無法在事先指定;
像第一步 TYPE REF TO DATA 第二步 CREATE DATA ref TYPE ty_ym 不是好的做法。
?
4、區別
Type Ref To 和 Field Symbol 在用法上目前發現的主要區別:
1) Type Ref To 可以動態開辟內存,在動態內表時,可以等在程序運行時獲得結構后再開辟內存,并且賦值給某個 Field Symbol。
而光用 Field Symbol 是做不到的,因為 Field Symbol 的初始化需要“掛”在已知結構上。
2)Type Ref To 不像 Field Symbol 那樣有LOOP AT it_tab ASSIGNING < fs >的寫法,ref->*不是指向內表數據,
而是類似工作區指向某塊內存,所以更改數據后需要 modify 到內表,如果不需要數據了要clear。
而 Field Symbol 則不需要考慮 modify 和 clear。
3)IF < fs1 > = < fs2 > 是比較內存里的值,相對應的是IF ref1->* = ref2->*,而不能判斷比較 IF ref1 = ref2 。
總結
以上是生活随笔為你收集整理的FIELD SYMBOL和TYPE REF TO的用法和比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ALV 动态显示列Demo
- 下一篇: 采购订单相关Table