Skip to content

定义及分配 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 OFLIKE有什么区别呢?这两个语句只有在不带表头的内表中有区别(带表头的内表中两个语句有相同的功能)。在不带表头的内表里,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]中的以相同模式构成的变量GV1GV 2GV 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]所示。 alt text   通过练习下面实例,进一步理解结构体分配给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语句,用指定类型执行类型转换的操作叫做显式型变换。