Field-Symbols的使用

*&---------------------------------------------------------------------*
*& Report  ZCZW_FIELDSYMBOLS
*& Description: filedsymbols and assign study.
*Field symbols allow you to:
** Assign an alias to a data object(for example, a shortened name for data objects structured through several hierarchies. For Example: <fs>-f instead of rec1-rec2-rec3-f)
** Set the offset and length for a string variably at runtime
** Set a pointer to a data object that you determine at runtime (dynamic ASSIGN)
** Adopt or change the type of a field dynamically at runtime
** Access components of a structure (from Release 4.5A) Point to lines of an internal table (process internal tables without a separate work area)
*&---------------------------------------------------------------------*

REPORT  ZCZW_FIELDSYMBOLS.
DATA:
  BEGIN OF struc,
     comp1(1) TYPE c VALUE '1',
     comp2(20) TYPE c VALUE 'abcdefg',
  END OF struc,
  comp_value TYPE c LENGTH 10 VALUE 'value',
  comp_name  TYPE c LENGTH 15.


FIELD-SYMBOLS <fs> TYPE ANY.

"指派结构的一个字段给<fs>
ASSIGN struc-comp1 TO <fs>.  WRITE:/ <fs>. " 输出:1
"指派结构字段的基地址加上两倍此字段长度的地址给字段符号
ASSIGN struc-comp1 INCREMENT 8 TO <fs>. WRITE:/ <fs>. " 输出: b
"指派结构的第二个组件字段给字段符号
ASSIGN COMPONENT 2 OF STRUCTURE struc TO <fs>.  WRITE:/ <fs>. " 输出:abcdefg

"动态指定字段名
comp_name = 'comp_value'.
ASSIGN (comp_name) TO <fs>. WRITE:/ <fs>. "输出:value

*&---------------------------------------------------------------------*
*& Full type specification
*&---------------------------------------------------------------------*
DATA: BEGIN OF line,
         col1(1) TYPE c,
         col2(1) TYPE c VALUE 'X',
       END OF line.

FIELD-SYMBOLS <fs2> LIKE line.
ASSIGN line TO <fs2>.
MOVE <fs2>-col2 TO <fs2>-col1.
WRITE: <fs2>-col1, <fs2>-col2.

*&---------------------------------------------------------------------*
*& Forcing structures
*&---------------------------------------------------------------------*
DATA: wa(10) TYPE c VALUE '0123456789'.
DATA: BEGIN OF line1,
         col1(3) TYPE c,
         col2(2) TYPE c,
         col3(5) TYPE c,
      END OF line1.
DATA: BEGIN OF line2,
         col1(2) TYPE c,
         col2 TYPE sy-datum,
      END OF line2.

* obsolete -------------------------------------------------------------
FIELD-SYMBOLS: <f1> STRUCTURE line1 DEFAULT wa,
               <f2> STRUCTURE line2 DEFAULT wa.

*correct --------------------------------------------------------------
FIELD-SYMBOLS <f3> LIKE line1.
ASSIGN wa TO <f3> casting.
FIELD-SYMBOLS <f4> LIKE line2.
ASSIGN wa TO <f4> casting.

* ----------------------------------------------------------------------
WRITE: / <f1>-col1, <f1>-col2, <f1>-col3,
       / <f2>-col1, <f2>-col2.
SKIP.
WRITE: / <f3>-col1, <f3>-col2, <f3>-col3,
       / <f4>-col1, <f4>-col2.

DATA text TYPE c LENGTH 8 VALUE '12345678'.
FIELD-SYMBOLS: <fs11> TYPE ANY,
               <fs22> TYPE ANY.

ASSIGN text+3(3) TO <fs11>.
write / <fs11>.
DO 8 TIMES.
  ASSIGN <fs11>(sy-index) TO <fs22>.
  IF <fs22> IS ASSIGNED.
    WRITE / <fs22>.
  ENDIF.
ENDDO.

*&---------------------------------------------------------------------*
*& Static assign
*&---------------------------------------------------------------------*
FIELD-SYMBOLS: <f11> TYPE ANY, <f22> TYPE i.

DATA: text2(20)  TYPE c VALUE 'Hello, how are you?',
      num       TYPE i VALUE 5,
      BEGIN OF line11,
        col1 TYPE f VALUE '1.1e+10',
        col2 TYPE i VALUE '1234567',
      END OF line11,
      line22 LIKE line11.

ASSIGN text2 TO <f11>.
ASSIGN num TO  <f22>.
DESCRIBE FIELD <f11> LENGTH <f22> in character mode.
WRITE: / <f11>, 'has length', num.

ASSIGN line11 TO <f11>.
ASSIGN line22-col2 TO <f22>.
MOVE <f11> TO line22.
ASSIGN '(Static assign)LINE2-COL2 =' TO <f11>.
WRITE: / <f11>, <f22>.

*&---------------------------------------------------------------------*
*& Assign with offset
*&---------------------------------------------------------------------*
FIELD-SYMBOLS <fs3> TYPE ANY.
DATA: BEGIN OF line3,
        string1(10) VALUE '0123456789',
        string2(10) VALUE 'abcdefghij',
      END OF line3.

WRITE / line3-string1+5.
ASSIGN line3-string1+5(*) TO <fs3>.
WRITE / <fs3>.

*&---------------------------------------------------------------------*
*& Dynamic assign
*&---------------------------------------------------------------------*
TABLES sbook.
DATA: name1(20) TYPE c VALUE 'SBOOK-FLDATE',
      name2(20) TYPE c VALUE 'NAME1'.

FIELD-SYMBOLS <fs5> TYPE ANY.
ASSIGN TABLE FIELD (name1) TO <fs5>.
WRITE: / 'SY-SUBRC:', sy-subrc.

*&---------------------------------------------------------------------*
*& Assigning a structure by component
*&---------------------------------------------------------------------*
DATA: BEGIN OF line6,
        col1 TYPE i VALUE '11',
        col2 TYPE i VALUE '22',
        col3 TYPE i VALUE '33',
      END OF line6.

DATA comp(5) TYPE c VALUE 'COL3'.
FIELD-SYMBOLS: <f111> TYPE ANY, <f222> TYPE ANY, <f333> TYPE ANY.

ASSIGN line6 TO <f111>.
ASSIGN comp TO <f222>.

DO 3 TIMES.
  ASSIGN COMPONENT sy-index OF STRUCTURE <f111> TO <f333>.
  WRITE <f333>.
ENDDO.

ASSIGN COMPONENT <f222> OF STRUCTURE <f111> TO <f333>.
WRITE / <f333>.

*&---------------------------------------------------------------------*
*& Casting with field symbol type
*&---------------------------------------------------------------------*
TYPES: BEGIN OF t_date,
          year(4)  TYPE n,
          month(2) TYPE n,
          day(2)   TYPE n,
       END OF t_date.

FIELD-SYMBOLS <fs7> TYPE t_date.

ASSIGN sy-datum TO <fs7> CASTING.

WRITE / sy-datum.
SKIP.
WRITE: / <fs7>-year , / <fs7>-month, / <fs7>-day.

*&---------------------------------------------------------------------*
*& Casting with explicit type
*&---------------------------------------------------------------------*
TYPES: BEGIN OF t_date2,
          year(4)  TYPE n,
          month(2) TYPE n,
          day(2)   TYPE n,
       END OF t_date2.

FIELD-SYMBOLS: <fs8> TYPE ANY,
               <f>  TYPE n.

ASSIGN sy-datum TO <fs8> CASTING TYPE t_date2.

WRITE / sy-datum.

SKIP.

DO.
  ASSIGN COMPONENT sy-index OF STRUCTURE <fs8> TO <f>.
  IF sy-subrc <> 0.
    EXIT.
  ENDIF.
  WRITE / <f>.
ENDDO.

*&---------------------------------------------------------------------*
*& Casting with predefined data types
*&---------------------------------------------------------------------*
DATA txt(8) TYPE c VALUE '19980706'.

DATA mytype(1) VALUE 'X'.

FIELD-SYMBOLS <fs9> TYPE ANY.

ASSIGN txt TO <fs9>.
WRITE / <fs9>.

SKIP.

* obsolete -------------------------------------------------------------

ASSIGN txt TO <fs9> TYPE 'D'.
WRITE / <fs9>.

ASSIGN txt TO <fs9> TYPE mytype.
WRITE / <fs9>.

SKIP.

* correct --------------------------------------------------------------

ASSIGN txt TO <fs9> CASTING TYPE d.
WRITE / <fs9>.

ASSIGN txt TO <fs9> CASTING TYPE (mytype).
WRITE / <fs9>.

*&---------------------------------------------------------------------*
*& Casting decimla places
*&---------------------------------------------------------------------*
DATA: pack1 TYPE p DECIMALS 2 VALUE '400',
      pack2 TYPE p DECIMALS 2,
      pack3 TYPE p DECIMALS 2.

FIELD-SYMBOLS: <f1111> TYPE ANY ,
               <f2222> TYPE ANY.

WRITE: / 'PACK1 ', pack1.

SKIP.

* obsolete -------------------------------------------------------------

ASSIGN pack1 TO <f1111> DECIMALS 1.
WRITE: / '<F1111> ', <f1111>.

pack2 = <f1111>.
WRITE: / 'PACK2 ', pack2.

ASSIGN pack2 TO <f2222> DECIMALS 4.
WRITE: / '<F2222> ', <f2222>.

pack3 = <f1111> + <f2222>.
WRITE: / 'PACK3', pack3.

<f2222> = '1234.56789'.
WRITE: / '<F2> ', <f2222>.
WRITE: / 'PACK2 ', pack2.

SKIP.

* correct --------------------------------------------------------------

ASSIGN pack1 TO <f1111> CASTING TYPE p DECIMALS 1.
WRITE: / '<F1111> ', <f1111>.

pack2 = <f1111>.
WRITE: / 'PACK2 ', pack2.

ASSIGN pack2 TO <f2222> CASTING TYPE p DECIMALS 4.
WRITE: / '<F2222> ', <f2222>, '   PACK2 ', pack2.
pack2 = '123.44'.
WRITE: / '<F2222> ', <f2222>, '   PACK2 ', pack2.

pack3 = <f1111> + <f2222>.
WRITE: / 'PACK3', pack3.

<f2222> = '1234.56789'.
WRITE: / '<F2222> ', <f2222>.
WRITE: / 'PACK2', pack2.

*&---------------------------------------------------------------------*
*& Data references
*&---------------------------------------------------------------------*
TYPES: BEGIN OF t_struct,
         col1 TYPE i,
         col2 TYPE i,
       END OF t_struct.

DATA: dref1 TYPE REF TO data,
      dref2 TYPE REF TO data.

FIELD-SYMBOLS: <fs21> TYPE t_struct,
               <fs20> TYPE i.

CREATE DATA dref1 TYPE t_struct.

ASSIGN dref1->* TO <fs21>.

<fs21>-col1 = 1.
<fs21>-col2 = 2.

dref2 = dref1.

ASSIGN dref2->* TO <fs20> CASTING.
WRITE / <fs20>.

GET REFERENCE OF <fs21>-col2 INTO dref2.

ASSIGN dref2->* TO <fs20>.
WRITE / <fs20>.

*******************************************
skip.
DATA: BEGIN OF gs_itab,
drph(10) ,
cmsl01(17),
cmsl02(17),
sl01(17),
sl02(17),
END OF gs_itab.
DATA: gt_ita1 LIKE gs_itab OCCURS 0 WITH HEADER LINE.

data gv_zd(15).

FIELD-SYMBOLS <sl> TYPE c.
FIELD-SYMBOLS <cmsl> TYPE c.
FIELD-SYMBOLS <fs23> LIKE LINE OF gt_ita1.

DO 15 TIMES.
gt_ita1-drph =  SY-INDEX .
gt_ita1-cmsl01 = 2.
append gt_ita1.
enddo.

write 'Before Modify:'.
write:/ 'cmsl01','cmsl02','sl01','sl02'.
loop at gt_ita1.
write:/ '|',gt_ita1-cmsl01,'|',gt_ita1-cmsl02,'|',gt_ita1-sl01,'|' ,gt_ita1-sl02,'|'.
endloop.
loop at gt_ita1 aSSIGNING <fs23>.
ASSIGN COMPONENT 'CMSL01' OF STRUCTURE <fs23> TO <cmsl>.
ASSIGN COMPONENT 'SL01' OF STRUCTURE <fs23> TO <sl>.
move <cmsl>  to  <sl>.
ASSIGN COMPONENT 'SL02' OF STRUCTURE <fs23> TO <sl>.
move <cmsl>  to  <sl>.
<fs23>-CMSL02 = 'A' .
endloop.

write / 'After Modify:'.
loop at gt_ita1.
write:/ '|',gt_ita1-cmsl01,'|',gt_ita1-cmsl02,'|',gt_ita1-sl01,'|' ,gt_ita1-sl02,'|'.
endloop.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值