ABAP 数据引用

TYPE REF TO data 数据引用data references

TYPE REF TO object 对象引用object references “object不能直接跟在TYPE后面,只能跟在TYPE REF TO后面

TYPE REF TO 后面可接的通用类型只能data(数据引用)或者是object(对象引用)通用类型,其他通用类型不行

TYPES: BEGIN OF t_struct,
         col1 TYPE i,
         col2 TYPE i,
       END OF t_struct. "定义一个结构体类型作为参考"
DATA: LS_STRUCT TYPE T_STRUCT. "定义一个结构体变量做参考"
       
DATA: dref TYPE REF TO DATA .   "dref即为数据引用,即数据指针,指向某个变量或常量,存储变量地址     用DATA 作为参考就是暂时不指定类型
DATA: ref TYPE REF TO t_struct ."ref以结构体作为参考
FILED-SYMBOLS <FS> TYPE ANY.    "参考任意类型"
FILED-SYMBOLS <FS> TYPE t_struct .

1.数据引用 Data References

  • Type Ref To 有两种初始化的方法: 必须初始化
    1:第一种是用 CREATE DATA 动态开辟内存; (类似C语言定义指针会默认分配一个空间也可以用malloc分配一块空间给指针[指针值就是这块空间的首地址] abap指针必须要手动’malloc’ 一下内存空间)
如果定义 ref 是指定特定的类型或者结构的,那么 CREATE DATA 时 TYPE 可以省略。

无论定义时 ref 是否有特定的类型或者结构,CREATE DATA 时必须指定特定的类型或者结构,不能是data这种泛型的。

一般来说为了使用方便,还是应该指定 Field Symbol 或者 Type Ref To 的类型或者结构,以便之后直接使用。

CREATE DATA dref TYPE C.  "dref由于没有定义类型 所以初始化时必须指定类型 此时的类型可以是随便什么的 没有限制
CREATE DATA ref .         "ref在定义时就指定了类型 初始化时无需再次指定类型"

2:第二种是用 GET REFERENCE OF 指向已经存在的内存变量.

GETREFERENCE OF LS_STRUCT INTO ref. "效果相当于ref指向变量LS_STRUCT
  • Field Symbol 的初始化,则只能指向已经存在的内存变量
    FS是已经解引用的指针(类似C语言有指针p,FS就是*p,其本质已经是变量不是地址,而上述TYPE REF TO 得来的引用本质是地址)
ASSIGN LS_STRUCT TO <FS>         "初始化FS 必须是已有的变量 而不是类型"
  • 两者区别
    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 。
  • 使用数据引用 包含二级指针使用 【重点理解】
DATA: ref1 TYPE REF TO t_struct . "定义指针 指定类型"
DATA: ref2 LIKE REF TO ref1.      "二级指针
CREATE DATA ref1 .                "初始化 分配新的内存空间"
CREATE DATA ref2 .
ref1       "指针 类似指针p"
ref2       "指针的指针 类似q 本质是&p"
ref1->*    "解引用 一级指针的使用 类似*p"
ref2->*    "解引用 二级指针的使用 类似*q 本质是p"
ref2->*->* "解引用 二级指针的使用 类似**q 本质是*p"

如果定义时指定了特定的类型或者结构,那么 Field Symbol 和 Type Ref To 都可以直接使用

如果定义时没有指定类型或者结构,那么 Type Ref To 必须 ASSIGN 到另外一个 Field Symbol 里间接使用

TYPES: BEGIN OF t_struct,
         col1(6) TYPE C,
       END OF t_struct.


DATA: dref TYPE REF TO DATA ."dref即为数据引用,即数据指针,指向某个变量或常量,存储变量地址
DATA: ref TYPE REF TO t_struct .     "定义一个p指针"

CREATE DATA dref TYPE C LENGTH 6.        "使用前必须先指定类型"
FIELD-SYMBOLS <FS> TYPE any.             "泛用型类型
ASSIGN dref->* TO <FS>.      
<FS> = 'abc'.

CREATE DATA ref .             "无需再次指定类型   初始化p指针内存空间"
ref->*-col1 = 'abcd'.         "类似 *p-col1 = xx"          

WRITE:/ <FS>,
        ref->*.