Appearance
定义及分配 Field Symbol
一、 Field Symbol 的定义
abap
FIELD-SYMBOLS <fs>[TYPE].
上面语句是定义 Field Symbol
的语句。Field Symbol的变量用尖括号(<>)定义。[TYPE]语句用于定义 Field Symbol类型,也可以不指定类型。Field Symbol类型有Generic Type
和Fully Type 两种类型。
1. Generic Type Field Symbol
定义 Ficld Symbol时不指定类型,当被分配(Assign)时,根据数据对象类型继承其技术属性。
abap
FIELD-SYMBOLS <fs1>.
FIELD-SYMBOLS <fS2>TYPE ANY ITABLE1.
若要使用 FIELD-SYMBOLS <fS2>
TYPE ANY TABLE,需在 ASSIGN 语句中分配内表。这种方法定义的 Field Symbol称为内表,即可以使用类似于“READ”一样的语句。若删除TABLE 关键字只使用 TYPE ANY 语句,就变成 Line类型的结构体。 [例 10-2]只是把[例 10-1]中的 Field Symbol定义部分修改为 TYPE ANY 类型,执行结果相同。
[例 10-2]
abap
REPORT z10_02.
DATA : gv_var TYPE C VALUE 'A'.
FIELD-SYMBOLS : <fs>TYPE ANY.
ASSIGN gv_var TO <fs>.
<fs>='B'
WRITE : 'gv_var is : ', gv_var.
结果
abap
gv_varis:B
利用 TYPE ANY 定义的 Field Symbol即 Generic Type,在 ABAP 程序中无法静态调用地址来使用。将在“10.3 FIELD SYMBOLS 与内表”中详细讲解。
2. Fully Type Field Symbol
Fully Type Field Symbol 类型是当定义 Field Symbol 时就以固定形式定义数据对象。Field Symbol的技术属性与分配的数据对象相同。利用下面语句定义Field Symbol 的情况。
abap
FIELD-SYMBOLS <f3> TYPE SFLGIHT.
FIELD-SYMBOLS <fs4> LIKE LINE OF gt_tab.
定义 Field Symbol<fs3>
为与表 SFLIGHT 结构相同的结构体类型。<fs4>
会定义与内表gt tab有相同结构的 Line 类型的 Field Symbol。 变量名指向静态内存地址。("变量名=内存地址")若利用Fully Type,则如下句所示可以直接使用结构体名显示字段名。
abap
MOVE <fs3>-carrid TO <fs4>-carrid.
在“10.4 FIELD SYMBOLS 与结构体”中详细讲解。
LIKE与 LIKE INE OF 的区别
abap
FIELD-SYMBOLS <fs> LIKE LINE OF gt tab.
FIELD-SYMBOLS <fs>LIKE gt tab.
上面语句中
LIKE LINE OF
与LIKE
有什么区别呢?这两个语句只有在不带表头的内表中有区别(带表头的内表中两个语句有相同的功能)。在不带表头的内表里,LIKELINE OF 只是定义结构体即工作区,但使用 LIKE 语句可以定义内表。因此,当使用不带表头的内表时尽量不要使用 LIKE语句。
二、Field Symbol的分配
定义 Field Symbol后,为了在程序内使用,一定要利用 ASSIGN 语句给它分配对象。
abap
TYPES: BEGIN OF t_line,
coll TYPE c,
col2 TYPE c,
END OF t_line.
DATA: gs_wa TYPE t_line,
gt_itab TYPE HASHED TABLE OF line WITH UNIOUE KEY col1.
key(4)TYPE c VALUE 'COL1'.
FIELD-SYMBOLS <fs> TYPE ANY TABLE.
ASSIGN gt_itab TO <fs>.
前面也提到,为了给 Field Symbol 分配对象一定要使用ASSIGN语句。ASSIGN 语句大致有下列三种功能。下面观察一下各自的功能。
- Assign 语句的基本结构。
- 将结构体字段分配给FieldSymbol中。
- Field Symbol 与Casting。
三、 Assign 语句的基本结构
1.Static Assign
如果是字段名已知的情况,需使用下列语句。
abap
ASSIGN dobi TO <fs>.
若 ASSIGN执行成功,则系统变量SY-SUBRC为零,若失败则返回4。
2.利用 Offset 语句静态赋值(Static Assign)
有时候会有需要部分字符串字段分配给 Field Symbol的情况。
abap
ASSIGN dobj[+off][(len)] TO <fs>.
在 ABAP 程序中上面例句中的of意为 Ofset,len意为Length。若不明确定义 len,则ABAP 会默认它是数据对象(dobi)的长度。
abap
DATA: string1(10)VALUE '0123456789'
string1+5.
上面语句实际上与string1+5(10)有相同作用,会脱离stringl 内存领域。这种使用方法也不错,但 Field Symbol一旦脱离数据工作区会产生错误。
abap
WRITE / line-string1+5.
ASSIGN line-stringl+5 TO <fs>.
上面的第一句会执行成功,但第二句的 Field Symbol 中会产生错误,其原因如上句所述。 [例 10-3]是利用 ofset的Assign语句,通过此实例可以理解上面所讲述的语句功能。
[例 10-3]
abap
REPORT z10_03.
DATA: BEGIN OF line,
col1(12)VALUE 'ABCDEFGHIKL'
END OF line.
FIELD-SYMBOLS : <FS>
ASSIGN line-col1+6(*) TO <fs>.
WRITE /<fs>.
ASSIGN line-col1+6(6) TO <fs>.
WRITE /<fs>.
ASSIGN line-col1+5(5) TO <fs>
WRITE / <fs>.
*ASSIGN line-COLI+5 TO <Ã>."error occured
*WRITE /<f>.
*ASSIGNline-COLI+5(10) TO <f>. "error occured
*WRITE /<Ã>.
结果
abap
GHUKL
GHIJKL
FGHIJ
如
abap
ASSIGN line-string1+6(*)TO <fS>
语句所示,当 ofset 中分配比零大的值的情况下,给 Field Symbol赋值需要使用星号(*),以免发生 Field Symbol 值超过对象值。
3.动态使用 Assign 语句
当分配到 Field Symbol
中的字段名无法知道时,(在程序内动态分配)利用动态 ASSIGN 语句。
abap
ASSIGN (dobj)TO <fs>.
当输出一次类似于[例 10-4]中的以相同模式构成的变量GV1
,GV 2
,GV 3
时,动态ASSIGN 语句非常有用。[例10-4]中,只是将5个变量动态存储到 Field Symbol中,但实际上会遇到需要处理更多字段的情况,到时可以有效应用。另外,后续要介绍的动态输出结构体也经常会用到。
abap
REPORT z10_04.
DATA : gv_1 TYPE c VALUE 'A',
gv_2 TYPE c VALUE 'B',
gV_3 TYPE c VALUE 'C',
gV_4 TYPE C VALUE 'D',
gv_5 TYPE c VALUE 'E'.
DATA : gv_fname TYPE c LENGTH 10.
DATA : gv_idx TYPE n.
FIELD-SYMBOLS : <fs>.
gv_fname =gv_1.
DO 5 TIMES.
CLEAR : gv_fname.
gv_fname='GV_'.
gv_idx= sy-index.
CONCATENATE gv_fname gv_idx INTO gv_fname.
ASSIGN (gv_fname) TO <fs>.
WRITE :/ gv_fname,':', <fs>.
ENDDO.
结果
abap
GV_1 :A
GV_2 :B
GV_3 :C
GV_4 :D
GV_5 :E
动态分配(ASSIGN)表字段时使用下列语句。
abap
ASSIGN TABLE FIELD (dobj) TO <fs>.
REPORT z10_05.
TABLES sflight.
DATA: gv_name1(20) TYPE c VALUE 'SFLIGHT-CARRID',
gv_name2(20) TYPE c VALUE "NAME1'.
FIELD-SYMBOLS<fs> TYPE ANY.
ASSIGN TABLE FIELD (gv_namel) TO <fs>.
IF sy-subrc EO 0.
WRITE: / 'Sucess to find table field.'.
ENDIF.
ASSIGN TABLE FIELD (gv_name2) TO <fs>
IF sy-subrc NE 0.
WRITE: / 'Not sucess to find table field.".
ENDIF.
结果
abap
Sucess to find table field.
Not sucess to find table field.
在ASSIGN TABLE FIELD(gv name1)TO<fs>
,语句中存在 SFLIGHT-CARRID 字段,因此SY-SUBRC=0。而变量gvname2的值为NAME1的表字段不存在,因此系统变量SY SUBRC 返回 4。
4.结构体字段分配到Field Symbol中
可以将结构体的个别字段分配到Field Symbol中。下面是将结构体struc的comp 字段分配到 Field Symbol <fs>
中的语句。
abap
ASSIGN COMPONENT comp OF STRUCTURE struc TO <fs>.
在 Field Symbol类型定义成结构体或者TYPE ANY的情况下,可以用 Structure 结构分配 Field Symbol值。Comp 中可以指定行编号或者字段名,如[图 10-3]所示。 通过练习下面实例,进一步理解结构体分配给Field Symbol的输出过程。
[例 10-6]
abap
REPORT Z10_06.
DATA: BEGIN OF gs str,
col1 TYPE char5 VALUE 'CHINA',
col2 TYPE char10 VALUE 'BEIING'.
col3 TYPE char15 VALUE 'TWIN BUILDING',
END OF gs_str.
FIELD-SYMBOLS: <fs1> LIKE gs str,
<fs2> TYPE ANY.
ASSIGN gs_str TO <fs1>.
DO 3 TIMES.
ASSIGN COMPONENT sy-index OF STRUCTURE <fs1> TO <fs2>
WRITE <fs2>.
ENDDO.
[结果 10-6]
abap
CHINA BEIJING TWIN BUILDING
[例 10-6]的Field Symbol<fs1>
结构与GS STR相同。DO3 TIMES 是因为 GS STR 结构体的字段有三个,通过存储LOOP次数的系统变量SY-INDEX,将结构体字段依次分配给 Field Symbol。[例 10-6]是使用结构体行编号分配的实例,若想使用字段名给 Field Symbol分配,可参照[例 10-7]。
[例 10-7]
abap
REPORT z10_07
DATA: BEGIN OF gs_str,
coll TYPE chars VALUE 'CHINA',
col2 TYPE char10 VALUE 'BEIJING'
col3 TYPE char15 VALUE 'TWIN BUILDING',
END OF gs_str.
DATA : gv_fname type c length 10,
gv_idx type n.
FIELD-SYMBOLS: <fs1> LIKE GS STR.
<fs2> TYPE ANY.
ASSIGN gs_str TO <fs1>.
DO 3 TIMES.
clear :gv_fname.
gv_idx=sy-index.
gv_fname ='COL'
CONCATENATE gv_fname gv_idx into gv_fname.
ASSIGN COMPONENT gv_fname OF STRUCTURE <fs1> TO <fs2>
WRITE <f2>.
ENDDO.
四、Field Symbol 与jCasting
当分配数据对象到 Field Symbol 中时,利用 Casting 可以将所有类型的数据对象分配到Field Symbol中。CAST 在英语词典里包含“放弃/丢弃”,“改造/铸造”的意思。将这些意思组合后这个词可以解释为“放弃自己进行改造使之适应新的环境”。程序术语Casting 可分为隐式型变化和显式型变化两种。下面观察一下Casting在 Field Symbol 中起着什么作用。
1.隐式型变化(Implicit Casting)
Field Symbol 的数据类型定义为Fully Type 或者定义为基本数据类型-c,n,p,x-时,使用隐式型变化。即,指定类型的 Field Symbol与数据对象类型不同时要使用CASTING 语句分配值。
abap
ASSIGN <var> TO <f> CASTING.
下面是结构体类型的 Field Symbol与 CHAR 类型的变量利用CASTING 执行 ASSIGN 语句的实例。
[例 10-8]
abap
REPORT z10 08.
TYPES: BEGIN OF t line,
col1 TYPE char5.
col2 TYPE char10
col3 TYPE char15
END OF t line.
DATA : gv_addr(30) TYPE c VALUE 'CHINA BEIJING TWIN BUILDING'
FIELD-SYMBOLS: <fs> TYPE t line.
ASSIGN gv addr TO <fS> CASTING.
WRITE : <fs>-coll,<fs>-col2, <fs>-col3.
结果
abap
CHINA BEIING TWIN BUILDING
在 ASSIGN gS_St TO <fS>CASTING.
语句中,若除去 CASTING 会产生数据类型不一致的错误。这是因为 FIELD SYMBOLS<fs>
是结构体类型,但变量 gv_addr是 30位的字符类型,因此会导致无法实现类型转换(type conversion)。
2.显式形变化(Explicit Casting)
如果[例 10-8]中的 FIELD SYMBOLS 定义成 Generic Type,如下所示,则能否正常激活程序呢?
abap
FIELD-SYMBOLS: <f1> TYPE ANY.
在此情况下,需要明确指定类型后使用 ASSIGN 语句,如下所示。
abap
ASSIGN ADDR TO <FI> CASTING TYPE line.
综上所述,利用 CASTINGTYPE语句,用指定类型执行类型转换的操作叫做显式型变换。