FIELD SYMBOL和TYPE REF TO的用法和比較

Type Ref To(以下簡稱:TRT)和 Field Symbol(以下簡稱:FS)在 ABAP 中都有着類似指針的作用;

下面結合對比和實例來介紹下兩者的用法和區別之處。

先預定義類型ty_ym,內表it_ym,工作區wa_ym,變量v_ymchar20)以供後面使用:

一、定義

Type Ref To Field Symbol 的定義都可以指定特定的類型或者結構,或者不指定。

 DATA ref TYPE REF TO data.       "不指定特定類型或者結構,可以是結構也可以是類型

 DATA ref TYPE REF TO ty_ym.      "指定特定結構

 DATA ref TYPE REF TO char20.     "指定特定類型

 FIELD-SYMBOLS < FS > TYPE ANY TABLE."任意標準表

 FIELD-SYMBOLS < FS > TYPE it_ym.   "指定特定的表

 FIELD-SYMBOLS < FS > TYPE any.     "不指定特定類型或者結構,可以是結構也可以是類型

 FIELD-SYMBOLS < FS > TYPE ty_ym.   "指定特定結構

 FIELD-SYMBOLS < FS > TYPE char20.  "指定特定類型

二、初始化

Type Ref To 有兩種初始化的方法:

第一種是用 CREATE DATA 動態開闢內存;

第二種是用 GET REFERENCE OF 指向已經存在的內存變量.

Field Symbol 的初始化,則只能指向已經存在的內存變量。

CREATE DATA ref TYPE ty_ym.

CREATE DATA ref LIKE LINE OFit_ym.

CREATE DATA ref LIKE wa_ym.

CREATE DATA ref LIKE ym.

 如果定義 ref 是指定特定的類型或者結構的,那麼 CREATE DATA TYPE 可以省略。

無論定義時 ref 是否有特定的類型或者結構,CREATEDATA 時必須指定特定的類型或者結構,不能是data這種泛型的。

ASSIGN wa_ym TO < fs >."Field Symbol的初始化,效果相當於指向wa_ym

 ASSIGN v_ym TO < fs >.  "Field Symbol的初始化,效果相當於指向v_ym

 GET REFERENCE OF wa_ym INTO ref. "TypeRef To的初始化,效果相當於指向 wa_ym

 GET REFERENCE OF v_ym INTO ref.  "Type Ref To的初始化,效果相當於指向 v_ym

 在使用 Field Symbol Type Ref To 前必須初始化,不然會發生 RUNTIMEERROR

三、使用

如果第一步定義時指定了特定的類型或者結構,那麼 Field Symbol Type Ref To 都可以直接使用;

如果第一步定義時沒有指定類型或者結構,那麼 Type Ref To 必須 ASSIGN 到另外一個 Field Symbol 裏間接使用。

1)指定特定的類型時:

ref->* = 'abc'.

< fs > = 'abc'.

2)指定特定的結構時:

ref->*-col1 = 'abc'.  "簡寫是ref->col1

< fs >-col1 = 'abc'.

 3)不指定特定的類型或者結構時:

FIELD-SYMBOLS < FSX >TYPE ty_ym

ASSIGN ref->* TO < FSX>.  "泛用型結構

< FSX >-col1= 'abc'.

 

FIELD-SYMBOLS < FSX >TYPE any. "

ASSIGN ref->* TO < FSX>.       "泛用型類型

< FSX > = 'abc'.

 

FIELD-SYMBOLS < FSX >TYPE any. "                 

ASSIGN COMPONENT 'col1' OFSTRUCTURE < FS > INTO < FSX >. "泛用型結構

< FSX > = 'abc'.

 注意事項:

一般來說爲了使用方便,還是應該指定 Field Symbol 或者 Type Ref To 的類型或者結構,以便之後直接使用。

在使用 Type Ref To 時,如果是 TYPE REF TO DATA,那麼之後想使用這個 Type Ref To 時,依然會不可避免的用到 FieldSymbol;

這樣代碼寫起來就很麻煩,還不如一開始就使用 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 在用法上目前發現的主要區別:

1Type Ref To 可以動態開闢內存,在動態內表時,可以等在程序運行時獲得結構後再開闢內存,並且賦值給某個 Field Symbol。而光用 Field Symbol 是做不到的,因爲 Field Symbol 的初始化需要“掛”在已知結構上。

2TypeRef To 不像 Field Symbol 那樣有LOOP AT it_tabASSIGNING < fs >的寫法,ref->*不是指向內表數據,而是類似工作區指向某塊內存,所以更改數據後需要 modify 到內表,如果不需要數據了要clear

Field Symbol 則不需要考慮 modify clear

 

3IF< fs1 > = < fs2 > 是比較內存裏的值,相對應的是IFref1->* = ref2->*,而不能判斷比較 IF ref1 = ref2

發佈了176 篇原創文章 · 獲贊 13 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章