FIELD SYMBOL 一

FIELD SYMBOL 一1.字段符号(Field Symbol)Field Symbol由一般字段的占位符或者符号名定义在程序运行之前还不能确定数据名及类型时使用此种数

欢迎大家来到IT世界,在知识的湖畔探索吧!

1.字段符号(Field Symbol)

Field Symbol由一般字段的占位符或者符号名定义
在程序运行之前还不能确定数据名及类型时使用此种数据类型,通过动态分配方法还可以简化重复代码。

欢迎大家来到IT世界,在知识的湖畔探索吧!

2.特性

欢迎大家来到IT世界,在知识的湖畔探索吧!在程序中Field Symbol允许动态访问变量。
Field Symbol不占有自己特有的内存空间。
Field Symbol的数据名与属性到执行时刻(Runtime)才能确定。
Field Symbol可以指定所有数据对象。
一旦Field Symbol被分配到,则它与一般数据对象没有太大区别。同样可以使用类似于MOVE之类的语句,
Field Symbol可以明确指定数据类型,也可以不指定数据类型。若不指定,则会继承被分配的字段(对象)的数据类型。

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

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信