FIELD-SYMBOLS
REPORT ZTEST.
FIELD-SYMBOLS <fs> TYPE ANY. "定义<fs>指向任何类型,不能指向表类型
DATA:var(10) TYPE c.
DATA:BEGIN OF struc,
comp1 TYPE c LENGTH 1 VALUE '1',
comp2 TYPE c LENGTH 20 VALUE 'abcdefg',
END OF struc,
comp_value TYPE c LENGTH 10 VALUE 'value',
comp_name TYPE c LENGTH 15.
var = 'Hello'.
ASSIGN var TO <fs>.
WRITE: / <fs>. "输出: Hello
<fs> = 'World'.
WRITE:/ var. "输出: World
"<fs>是一个指向变量var的指针,操 作<fs>就身操作var本身一样。 field-symbols一般操作:Field-Symbols:
"指派结构的一个字段给<fs>
ASSIGN struc-comp1 TO <fs>. WRITE:/ <fs>. " 输出:1 "指派结构字段的基地址加上两倍此字段长度的地址给字段符号
ASSIGN struc-comp1 INCREMENT 2 TO <fs>. WRITE:/ <fs>. " 输出: b
"指派结构的第二个组件字段给字段符号
ASSIGN COMPONENT 2 OF STRUCTURE struc TO <fs>. WRITE:/ <fs>. " 输出:abcdefg
"动态指定字段名
comp_name = 'comp_value'.
ASSIGN (comp_name) TO <fs>. WRITE:/ <fs>. "输 出:value
1 、定義指針 :
指針的定義主要有以下語句
定義任意類型的指針,但是不具備欄位結構(僅僅是一個地址)
FIELD-SYMBOLS <carrid> TYPE ANY.
參考數據庫表定義(這種指針是含有欄位結構的,參考內表同理)
FIELD-SYMBOLS <sflight> TYPE sflight.
FIELD-SYMBOLS <sflight> LIKE sflight.
FIELD-SYMBOLS <sflight> LIKE LINE OF sflight.
動態定義具有欄位結構的指針類型
DATA: tabname TYPE tabname VALUE 'SFLIGHT' ,
dref TYPE REF TO data.
FIELD-SYMBOLS: <itab> TYPE ANY TABLE.
CREATE DATA dref TYPE TABLE OF (tabname).
ASSIGN dref->* TO <itab>.
2 、指針的分配(常用句法)
分配某個變量給指針
ASSIGN var TO <field-symbols>
分配结构中的某个字段的地址给指针
ASSIGN COMPONENT pos OF STRUCTURE struc TO <field-symbols>.
分配整個內表行給指針(指針必須定義為有欄位結構的類型)
READ TABLE itab INDEX/WITH KEY ASSIGNING <field-symbols>.
LOOP AT itab
ASSIGNING <field-symbols>.
ENDLOOP.
分配类的方法或接口给指针
ASSIGN dref->* TO <field-symbols>.
直接在SQL語句中分配
SELECT *
FROM (tabname) UP TO 20 ROWS
INTO TABLE <itab>.
主要应用在以下几个方面:
1 给一个数据对象分配一个别名,把结构内多层指向的变成一个短长度的
例<fs>->f 代替 rec1->rec2-r>ec3-......->f
2 在运行时为一个变长度的字符串设置长度和偏移
3 在确定运行时设置一个指向数据对象的指针
4 在运行时动态的采取和变更字段的指针
5 可以访问结构体的组件指向内表行,不用一个单独的工作区去处理内表
assign f to <fs>,把字段f放到了<fs>领域中,这个领域<fs>在运行时指向字段f的内容,
这意味着f的内容的所有改变在<fs中可见.声明这个领域用:fileled-symbols:<fs>.
与其他语言不同:
1 在passcal语言用P^ ,在c中用*p,abap没有像这样的特征
2 在passcal和c语言中定义一个指针指向另一个指针,使让这个指针指向了两一个指针的对象
而abap中让这个领域指向两一个领域,是这个领域指向了另一个领域的值。
例:
FIELD -SYMBOLS: <HSL> , <HSL2> .
LOOP AT IT_TABLE INTO STR_CLASS.
STR_ALV-RACCT = STR_CLASS-RACCT.
STR_ALV-TXT20_SKAT = STR_CLASS-TXT20.
ASSIGN STR_CLASS-HSL TO <HSL>.
DO 16 TIMES .
POS = SY-INDEX + 1 .
ASSIGN COMPONENT POS OF STRUCTURE <HSL> TO <HSL2>.
HSL = HSL + <HSL2>.
ENDDO .
IF STR_CLASS-DRCRK = 'S' .
STR_ALV-HSL_S = HSL.
ELSE .
STR_ALV-HSL_H = HSL.
ENDIF .
IF STR_CLASS-XBILK = 'X' .
ASSIGN COMPONENT 1 OF STRUCTURE <HSL> TO <HSL2>.
STR_ALV-HSLVT = <HSL2>.
STR_ALV-HSLMT = <HSL2> + STR_ALV-HSL_S - STR_ALV-HSL_H.
ENDIF .
COLLECT STR_ALV INTO IT_ALV.
CLEAR STR_ALV.
HSL = 0 .
ENDLOOP .