欢迎大家来到IT世界,在知识的湖畔探索吧!
1.字段符号(Field Symbol)
Field Symbol由一般字段的占位符或者符号名定义
在程序运行之前还不能确定数据名及类型时使用此种数据类型,通过动态分配方法还可以简化重复代码。
欢迎大家来到IT世界,在知识的湖畔探索吧!
2.特性
欢迎大家来到IT世界,在知识的湖畔探索吧!在程序中Field Symbol允许动态访问变量。
Field Symbol不占有自己特有的内存空间。
Field Symbol的数据名与属性到执行时刻(Runtime)才能确定。
Field Symbol可以指定所有数据对象。
一旦Field Symbol被分配到,则它与一般数据对象没有太大区别。同样可以使用类似于MOVE之类的语句,
Field Symbol可以明确指定数据类型,也可以不指定数据类型。若不指定,则会继承被分配的字段(对象)的数据类型。
字段符号与变量分配关系
3.基本声明 & 分配
FIELD-SYMBOLS <fs1> [TYPE type] .
*一般类型/结构/内表
FIELD-SYMBOLS <FS_FIELD> TYPE ANY.
FIELD-SYMBOLS <FS_FIELD_01> .
FIELD-SYMBOLS <FS_FIELD_TABLE> TYPE ANY TABLE .
内表类型:
TYPES GT_SPFLI TYPE TABLE OF SPFLI.
*完整类型
FIELD-SYMBOLS <FS_CHAR> TYPE C.
FIELD-SYMBOLS <FS_SPFLI> TYPE SPFLI.
FIELD-SYMBOLS <FS_TABLE_SPFLI> TYPE GT_SPFLI.
ASSIGN dobj TO <fs> .
变量值分配到一般类型
DATA GV_CHAR TYPE C LENGTH 20 VALUE '变量'.
ASSIGN GV_CHAR TO <FS_FIELD>.
分配到定义完整的类型
ASSIGN GV_CHAR TO <FS_CHAR>.
分配结构
DATA GS_SPFLI TYPE SPFLI.
分配到一般类型
ASSIGN GS_SPFLI TO <FS_FIELD>.
分配到完整结构 可以和结构一致通过 -进行访问值
ASSIGN GS_SPFLI TO <FS_SPFLI>.
WRITE: /<FS_SPFLI>-CARRID.
注:在分配时需要注意类型匹配,所有类型都可以分配到
一般类型,但如果是完整结构必须要指定对应的类型.
4.声明
欢迎大家来到IT世界,在知识的湖畔探索吧!Generic Type
定义Field Symbol时不指定类型,当被分配时,根据数据对象类型继承其技术属性
TYPE ANY TABLE – 表结构
TYPE ANY – 行结构
FIELD-SYMBOLS: <F_S1>, "任意类型
<F_S2> TYPE ANY,"任意类型
<F_S3> TYPE ANY TABLE ,"任意内表类型
<F_S4> TYPE C , "完整字符类型
<F_S5> TYPE SPFLI , "完整的结构类型
<F_S6> TYPE GT_SPFLI , "完整的内表类型
<F_S7> LIKE LINE OF <F_S6>. "参照内表的一行进行定义
5.分配
Assign语句的基本结构
静态分配 – 字段名已知
ASSIGN dobj TO <fs> .
可以使用+(n)对字符串进行截取,分配给Field Symbol,注意长度不可超过总长度!
动态分配 字段名无法知道
ASSSIGN (dobj) TO <fs> .
这里来说明一下动态分配:
DATA GV_FIELDNAME TYPE C LENGTH 30.
GV_FIELDNAME = 'GV_CHAR'. "等于字段名称
ASSIGN (GV_FIELDNAME) TO <FS_FIELD>.
WRITE: / <FS_FIELD> .
将结构体字段分配到Field Symbol中(静态分配)
- ASSIGN COMPONENT comp OF STRUCTURE struc TO <fs> .
- Comp可以为行编号或者字段名
ASSIGN COMPONENT 'CARRID' OF STRUCTURE GS_SPFLI TO <FS_FIELD>.
WRITE: / <FS_FIELD>.
ASSIGN COMPONENT 1 OF STRUCTURE GS_SPFLI TO <FS_FIELD>.
可以利用循环对多个结构字段进行分配
DO 5 TIMES.
ASSIGN COMPONENT SY-INDEX OF STRUCTURE GS_SPFLI TO <FS_FIELD>.
WRITE: / <FS_FIELD>.
ENDDO.
动态分配结构字段 -进行判断字段是否进行分配
GV_FIELDNAME = 'CARRID'.
ASSIGN COMPONENT GV_FIELDNAME OF STRUCTURE GS_SPFLI TO <FS_FIELD>.
IF <FS_FIELD> IS ASSIGNED. 检查是否分配成功,也可以使用sy-subrc = 0 判断
WRITE: / <FS_FIELD>.
ENDIF.
6.一般类型定义的field symbols 使用组件
*一般定义的field symbos 不能够直接使用组件
ASSIGN GS_SPFLI TO <FS_FIELD>.
*WRITE: / <FS_FIELD>-CARRID.
解决:
*使用动态分配给一般类型
ASSIGN COMPONENT 'CARRID' OF STRUCTURE <FS_FIELD> TO <FS_FIELD_01> .
WRITE: / <FS_FIELD_01>.
7.强制类型转化
一般情况下,在进行分配时要注意类型对应,也可以使用强制类型转化来完成
不同类型的分配。
DATA GV_NUMC TYPE N LENGTH 5 VALUE '123'.
*强制类型转化 N 类型 强制转化成 <fs_char>已经指明的类型(char)
ASSIGN GV_NUMC TO <FS_CHAR> CASTING.
定义一个结构
TYPES: BEGIN OF GTY_SCORE,
NAME TYPE C LENGTH 4,
SCORE TYPE N LENGTH 3,
END OF GTY_SCORE.
强制将GV_CHAR 转化为GTY_SCORE
GV_CHAR = 'ABCD100'.
ASSIGN GV_CHAR TO <FS_FIELD_01> CASTING TYPE GTY_SCORE.
* <FS_FIELD_01> 就具有了GTY_SCORE 的类型
DO 2 TIMES.
通过动态分配获取到结构字段
ASSIGN COMPONENT SY-INDEX OF STRUCTURE <FS_FIELD_01> TO <FS_FIELD>.
WRITE: / <FS_FIELD>.
ENDDO.
8.内表分配
* 向一般类型的字符符号分配
ASSIGN GT_SPFLI TO <FS_FIELD_TABLE>.
* ASSIGN GT_SPFLI TO <FS_FIELD>. "表类型必须参照ANY table
* 向特定类型分配
ASSIGN GT_SPFLI TO <FS_TABLE_SPFLI>.
注意:
类型可匹配
如果有表头行,应使用itab[],否则分配表头行
9.内表读取
完整类型 使用索引读取
READ TABLE <FS_TABLE_SPFLI> ASSIGNING <FS_WA> INDEX 1.
IF SY-SUBRC = 0 .
ASSIGN COMPONENT 'CARRID' OF STRUCTURE <FS_WA> TO <FS_FIELD>.
WRITE: <FS_FIELD>.
ENDIF.
* 通过关键字进行读取
READ TABLE <FS_TABLE_SPFLI> ASSIGNING <FS_WA> WITH KEY CARRID = 'AA'.
IF SY-SUBRC = 0.
ASSIGN COMPONENT 'CARRID' OF STRUCTURE <FS_WA> TO <FS_FIELD>.
WRITE: / <FS_FIELD>.
ENDIF.
一般类型读取 any table
* READ TABLE <FS_FIELD_TABLE> ASSIGNING <FS_WA> INDEX 1. "ANY TABLE 不能使用索引(哈希表)
* READ TABLE <FS_FIELD_TABLE> ASSIGNING <FS_WA> WITH KEY CARRID = 'AA'. "ANY TABLE 没有一个固定的结构,不能使用索引
*解决
GV_FIELDNAME = 'CARRID' . "字段名称
READ TABLE <FS_FIELD_TABLE> ASSIGNING <FS_WA> WITH KEY (GV_FIELDNAME) = 'AA'.
10.内表循环修改
LOOP使用ASSIGNING语句,不需要使用MODIFY语句
直接修改存储在内存中的值,所以可以省略内表值复制到结构体再执行MODIFY的过程,提高性能
LOOP AT GT_SPFLI ASSIGNING <FS_SPFLI>.
IF <FS_SPFLI>-CARRID = 'AA'.
<FS_SPFLI>-CARRID = 'PP'.
* 不需要使用modify
ENDIF.
ENDLOOP.
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/31485.html