ABAP-FIELD_SYMBOLS的使用
DATA: BEGIN OF line,
col1 TYPE i VALUE '1',
col2 TYPE i VALUE '2',
col3 TYPE i VALUE '3',
END OF line.
DATA comp(5) VALUE 'COL3'.
FIELD-SYMBOLS: <f1>, <f2>, <f3>.
ASSIGN line TO <f1>.
ASSIGN comp TO <f2>.
"还可以直接使用以下的语法访问其他程序中的变量
* ASSIGN ('(ZJDEMO)SBOOK-FLDATE') TO <fs>.
"通过索引动态的访问结构成员
ASSIGN COMPONENT sy-index OF STRUCTURE <f1> TO <f3>. "分配整个结构给<f3>
"如果定义的内表没有组件名时,可以使用索引为0的组件来访问这个无名字段(注:不是1)
* ASSIGN COMPONENT 0 OF STRUCTURE itab TO <fs>.
"通过字段名动态的访问结构成员
ASSIGN COMPONENT <f2> OF STRUCTURE <f1> TO <f3>. "分配<f2>值字段给<f3>
"一般类型
FIELD-SYMBOLS : <fs_field> TYPE any , "任意变量/结构
<fs_field_02> ,
<fs_table> TYPE ANY TABLE . "任意表
"完整类型
TYPES gty_makt TYPE TABLE OF makt.
FIELD-SYMBOLS : <fs_char> TYPE c,
<fs_makt> TYPE makt,
"<FS_MAKT01> like line of MAKT,
<ft_makt> TYPE gty_makt . "makt类型的内表
DATA gv_char TYPE c LENGTH 13 VALUE '广州'.
DATA gv_numc TYPE n LENGTH 10 VALUE '123456'.
DATA gs_makt TYPE makt.
"分配变量
ASSIGN gv_char TO <fs_field>.
WRITE:/ gv_char,
/ <fs_field>.
ASSIGN gv_numc TO <fs_field>.
"分配结构体
SELECT SINGLE *
FROM makt
INTO CORRESPONDING FIELDS OF gs_makt.
IF sy-subrc = 0 .
ASSIGN gs_makt TO <fs_field>.
ELSE.
ENDIF.
WRITE: / <fs_field>.
"分配变量
ASSIGN gv_char TO <fs_char> .
WRITE: / <fs_char>.
"ASSIGN GV_NUMC to <FS_CHAR>. "类型不匹配
"分配结构
ASSIGN gs_makt TO <fs_makt> .
WRITE: / <fs_makt>-matnr , <fs_makt>-maktx .
"动态指定
DATA: gv_char01 TYPE c LENGTH 10 VALUE 'A',
gv_char02 TYPE c LENGTH 10 VALUE 'B',
gv_char03 TYPE c LENGTH 10 VALUE 'C',
gv_char04 TYPE c LENGTH 10 VALUE 'D',
gv_char05 TYPE c LENGTH 10 VALUE 'E',
gv_char06 TYPE c LENGTH 10 VALUE 'F',
gv_char07 TYPE c LENGTH 10 VALUE 'G',
gv_char08 TYPE c LENGTH 10 VALUE 'H',
gv_char09 TYPE c LENGTH 10 VALUE 'I'.
DATA gv_index TYPE n LENGTH 2.
DATA gv_fieldname TYPE c LENGTH 30. "放置变量的名称
gv_fieldname = 'GV_CHAR' .
ASSIGN (gv_fieldname) TO <fs_field> . "动态指定,用小括号表示变量的值
WRITE : / <fs_field>.
DO 9 TIMES.
gv_index = sy-index .
CONCATENATE 'GV_CHAR' gv_index INTO gv_fieldname.
ASSIGN (gv_fieldname) TO <fs_field> .
WRITE : / gv_index, ':',<fs_field>.
ENDDO.
"结构体GS_MAKT通过FS进行输出
"ASSIGN GS_MAKT to <FS_FIELD>.
ASSIGN COMPONENT 'MATNR' OF STRUCTURE gs_makt TO <fs_field>."通过字段名分配
WRITE : / <fs_field>.
ASSIGN COMPONENT 1 OF STRUCTURE gs_makt TO <fs_field>."通过字段号分配
WRITE : / <fs_field>.
DO 5 TIMES.
ASSIGN COMPONENT sy-index OF STRUCTURE gs_makt TO <fs_field>."通过字段号分配
WRITE :/ sy-index,':', <fs_field>.
ENDDO.
"结构体GS_MAKT字段 动态分配
gv_fieldname = 'MATNR'.
ASSIGN COMPONENT gv_fieldname OF STRUCTURE gs_makt TO <fs_field>.
IF <fs_field> IS ASSIGNED.
WRITE:/ <fs_field>.
ENDIF.
"fs_field 一般类型
"fs_field makt类型
ASSIGN gs_makt TO <fs_makt> .
WRITE:/ <fs_makt>-matnr.
"一般定义的 field symbois 不能够直接使用组件
"ASSIGN gs_makt to <FS_FIELD> .
"WRITE:/ <FS_FIELD>-MATNR.
ASSIGN COMPONENT 'MATNR'OF STRUCTURE <fs_field> TO <fs_field_02>.
WRITE:/ <fs_field_02>.
gv_fieldname = 'MATNR'.
ASSIGN COMPONENT gv_fieldname OF STRUCTURE <fs_field> TO <fs_field_02>.
WRITE:/ <fs_field_02>.
"强制类型转换
ASSIGN gv_numc TO <fs_char> CASTING .
"ASSIGN GV_NUMC TO <FS_FIELD> CASTING TYPE GTY_MAKT.
TYPES: BEGIN OF gty_score,
name TYPE c LENGTH 4,
score TYPE n LENGTH 3,
END OF gty_score.
gv_char = 'ABCD100'.
ASSIGN gv_char TO <fs_field_02> CASTING TYPE gty_score .
DO 2 TIMES.
ASSIGN COMPONENT sy-index OF STRUCTURE <fs_field_02> TO <fs_field>.
WRITE:/ <fs_field>.
ENDDO.
TYPES :BEGIN OF gty_col,
col1 TYPE c LENGTH 5,
col2 TYPE c LENGTH 10,
col3 TYPE c LENGTH 15,
END OF gty_col.
DATA gs_col TYPE gty_col.
gs_col-col1 = 'CHINA' .
gs_col-col2 = 'BEIJING' .
gs_col-col3 = 'GREAT WALL'.
ASSIGN gs_col TO <fs_field_02> CASTING TYPE gty_col.
"方法1 使用行编号分配
WRITE:/ '使用行编号分配'.
DO 3 TIMES.
ASSIGN COMPONENT sy-index OF STRUCTURE <fs_field_02> TO <fs_field> .
WRITE:/ <fs_field>.
ENDDO.
"方法2 使用字段名分配
DATA gv_index01 TYPE n LENGTH 1.
WRITE:/ '使用字段名分配'.
DO 3 TIMES.
CLEAR :gv_index01,gv_fieldname.
gv_index01 = sy-index .
CONCATENATE 'COL' gv_index01 INTO gv_fieldname.
ASSIGN COMPONENT gv_fieldname OF STRUCTURE <fs_field_02> TO <fs_field> .
WRITE:/ <fs_field>.
ENDDO.
"分配-内表
DATA gt_makt TYPE TABLE OF makt .
SELECT *
FROM makt
INTO CORRESPONDING FIELDS OF TABLE gt_makt
UP TO 10 ROWS
WHERE spras = sy-langu.
FIELD-SYMBOLS <fs_wa> TYPE any .
"向一般类型的字段符号分配
ASSIGN gt_makt TO <fs_table>.
"ASSIGN GT_MAKT TO <FS_FIELD>.类型都要参照 any table
LOOP AT <fs_table> ASSIGNING <fs_field_02>.
ENDLOOP.
"向特定类型
ASSIGN gt_makt TO <ft_makt>.
"内表的读取
READ TABLE <ft_makt> ASSIGNING <fs_wa> INDEX 1. "使用索引
IF sy-subrc = 0.
ASSIGN COMPONENT 'MATNR' OF STRUCTURE <fs_wa> TO <fs_field>.
WRITE:/ <fs_field>.
ENDIF.
READ TABLE <ft_makt> ASSIGNING <fs_wa> WITH KEY mandt = '400'. "使用索引
IF sy-subrc = 0.
ASSIGN COMPONENT 'MANDT' OF STRUCTURE <fs_wa> TO <fs_field>.
WRITE:/ <fs_field> ,/.
ENDIF.
"内表读取 一般类型
"READ TABLE <FS_TABLE> ASSIGNING <FS_WA> INDEX 1. "any table 不能使用索引
"READ TABLE <FS_FIELD> ASSIGNING <FS_WA> WITH KEY MANDT = '400'. "any table 不能直接指明某一个字段
gv_fieldname = 'MANDT'.
READ TABLE <fs_table> ASSIGNING <fs_wa> WITH KEY (gv_fieldname) = '400'. "any table 可动态指明某一个字段
LOOP AT gt_makt INTO gs_makt.
IF gs_makt-mandt = '400'.
gs_makt-mandt = 'X'.
MODIFY gt_makt FROM gs_makt.
CLEAR: gs_makt.
ENDIF.
ENDLOOP.
"FIELD-SYMBOLS : <FS_MAKT> TYPE MAKT.
LOOP AT gt_makt ASSIGNING <fs_makt>.
IF <fs_makt>-mandt = '400'.
<fs_makt>-mandt = 'X'.
"MODIFY GT_MAKT FROM GS_MAKT. LOOP ASSIGNING,不需要FODIFY
"CLEAR: GS_MAKT.
ENDIF.
ENDLOOP.
DATA: gv_alpha TYPE c VALUE 'A',
gv_num TYPE i VALUE 256.
FIELD-SYMBOLS: <f_s> TYPE x ."定义为十六进制字段符号
DO 26 TIMES.
ASSIGN gv_alpha TO <f_s> CASTING. "强制类型转换
WRITE:gv_alpha.
<f_s> = <f_s> + gv_num .
ENDDO.
测试结果: