*&---------------------------------------------------------------------*
*& 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.
Field-Symbols的使用
最新推荐文章于 2024-03-25 22:05:17 发布