本文主要是记录了一些关于ABAP 引用变量(TYPE REF TO )和字段符号(FIELD-SYMBOLS)的相关内容,有些参考来自多个博客,以及官方文档
文章目录
- FIELD-SYMBOLS字段符号
- 官方文档
- Declaring Field Symbols
- Typing Field Symbols
- 引用变量
- 文章1
- 引用变量介绍
- 测试程序1
- 字段符号
- 文章2
- 一、定义
- 二、初始化
- 三、使用
- 文章3
- 获取数据对象引用Getting References to Data Objects
- 测试程序2
- 示例3
- 测试程序3
FIELD-SYMBOLS字段符号
官方文档
https://help.sap.com/saphelp_autoid2007/helpdata/en/fc/eb387a358411d1829f0000e829fbfe/content.htm?no_cache=true
Declaring Field Symbols
Typing Field Symbols
引用变量
文章1
参考文章: http://www.baidusap.com/abap/report/2478
引用变量介绍
TYPES <t_dref> TYPE REF TO DATA.
DATA <dref> TYPE REF TO DATA.
测试程序1
&---------------------------------------------------------------------*
*& Report Z_TEST_ASSIGN
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_test_assign.
TYPES:BEGIN OF t_struct,col1 TYPE i,col2 TYPE i,END OF t_struct.
DATA:dref1 TYPE REF TO data,dref2 TYPE REF TO data,dref3 TYPE REF TO data.
FIELD-SYMBOLS:<fs1> TYPE t_struct,<fs2> TYPE i,<fs3> TYPE t_struct,<fs4> TYPE t_struct,<fs5> TYPE t_struct,<fs6> TYPE t_struct.
CREATE DATA dref1 TYPE t_struct.
WRITE '<1> 引用变量给字段符号<FS1>赋值输出'.
SKIP.
IF dref1 IS BOUND.ASSIGN dref1->* TO <fs1>.<fs1>-col1 = 1.<fs1>-col2 = 2 .WRITE:<fs1>-col1,<fs1>-col2.SKIP.WRITE '<2> 引用变量给字段符号<FS3>赋值输出'.SKIP.ASSIGN dref1->* TO <fs3>.WRITE:<fs3>-col1,<fs3>-col2.SKIP.WRITE ' 引用变量给字段符号赋值结束后,没有释放地址!'.SKIP.WRITE '<3> 引用变量之间是地址赋值,仍然可以输出值'.dref2 = dref1.ASSIGN dref2->* TO <fs4>.SKIP.WRITE:<fs4>-col1,<fs4>-col2.SKIP.WRITE '<4> 改变字段符号中字段值,把地址赋给引用变量DREF1后,'.SKIP.WRITE ' 引用变量DREF1通过字段符号<FS5>可以看到数据改变.'.<fs4>-col1 = 8.<fs4>-col2 = 9.GET REFERENCE OF <fs4> INTO dref1.ASSIGN dref1->* TO <fs5>.SKIP.WRITE:<fs5>-col1,<fs5>-col2.SKIP.WRITE '<5> 引用变量进行强制类型装换,若不加CASTING会输出short down.'.ASSIGN dref2->* TO <fs2> CASTING.WRITE / <fs2>.SKIP.WRITE '<6> 解除字段符号,释放内存以及数据.'.UNASSIGN <fs2>.
* WRITE / <FS2>.SKIP.WRITE '当输出WRITE / <FS2>时会出现short down'.SKIP.WRITE '<7> 解除引用变量,释放内存以及数据.'.CLEAR dref2.ASSIGN dref2->* TO <fs6>.SKIP.WRITE '当输出WRITE /<FS6>-COL1,<FS6>-COL2.时会出现short down'.
ENDIF.
字段符号
ASSIGN ... TO <fs>:将某个内存区域分配给字段符号,这样字段符号就代表了该内存区域,即该内存区域别名REPORT Z_TEST_ASSIGN2.
TYPES: BEGIN OF t_date,year(4) TYPE n,month(2) TYPE n,day(2) TYPE n,
END OF t_date.FIELD-SYMBOLS <fs> TYPE t_date."将<fs>定义成了具体限定类型
ASSIGN sy-datum TO <fs>.
文章2
参考链接: https://www.jianshu.com/p/35d008176167
一、定义
二、初始化
三、使用
DATA: dref1 TYPE REF TO sflight.
CREATE DATA dref1.
dref1->carrid = 'DDDD'.
文章3
参考链接: https://www.cnblogs.com/jiangzhengjun/p/4293361.html
获取数据对象引用Getting References to Data Objects
可以将一个常量的地址分配给字段符号,但不能修改该常量的值:
DATA: e_i3 TYPE REF TO i .
GET REFERENCE OF 33 INTO e_i3.
field-SYMBOLS: <fs> TYPE i .
ASSIGN e_i3->* to <fs>.
<fs> = 100.
以上代码运行时会报错。
测试程序2
&---------------------------------------------------------------------*
*& Report Z_TEST_ASSIGN2
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_test_assign2.
TYPES: BEGIN OF t_date,year(4) TYPE n,month(2) TYPE n,day(2) TYPE n,
END OF t_date.
DATA: l_ref TYPE REF TO d. "定义一个数据引用变量
CREATE DATA l_ref. "创建数据对象,如果定义的时候指定了类型,创建可以不指定
l_ref->* = '20240801'.
FIELD-SYMBOLS <fs1> TYPE t_date."将<fs1>定义成了具体限定类型
ASSIGN l_ref->* TO <fs1> CASTING. "
"ASSIGN sy-datum TO <fs>.
FIELD-SYMBOLS <fs> TYPE t_date."将<fs>定义成了具体限定类型
ASSIGN sy-datum TO <fs> CASTING. "后面没有指定具体类型,所以使用定义时的类型进行隐式转换DATA txt(8) TYPE c VALUE '19980606'.
FIELD-SYMBOLS <fs2>.
ASSIGN txt TO <fs2>.
ASSIGN txt TO <fs2> CASTING TYPE d."由于定义时未指定具体的类型,所以这里需要显示强转DATA: l_ref2 TYPE REF TO data. "通用类型的数据引用变量
FIELD-SYMBOLS <fs3> TYPE data."将<fs3>
ASSIGN l_ref2->* to <fs3>.WRITE:''.
示例3
测试程序3
*&---------------------------------------------------------------------*
*& Report Z_TEST_ASSIGN3
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_test_assign3.DATA: BEGIN OF struc,a TYPE i,b TYPE c LENGTH 8,END OF struc.DATA: dref TYPE REF TO data,tname TYPE string,str TYPE struc,int TYPE i.FIELD-SYMBOLS: <int> TYPE i,<str> TYPE struc,<f> TYPE any.tname = 'SFLIGHT'.
CREATE DATA dref TYPE (tname).
ASSIGN dref->* TO <f>.
SELECT SINGLE * FROM (tname) INTO <f>.DATA: dref1 TYPE REF TO sflight.
CREATE DATA dref1.
dref1->carrid = 'DDDD'.WRITE:''.
如果后面有其他的相关内容,也会更新,如果解释错误的地方,请各位大佬指正