8.Assignments
8.1Assignment rules
数值型数据类型:i(b,s),p,decfloat16,decfloat34,f;
字符型数据类型:c,string,n,d,t;
类:CL_ABAP_DECFLOAT,READ_DECFLOAT34 and READ_DECFLOAT16方法转换字符型数据为浮点数;
字节数据类型:x,xstring;
CL_ABAP_CONV_IN_CE:read binary input stream;
CL_ABAP_CONV_OUT_CE:write binary output stream;
CL_ABAP_CONV_X2X_CE:read input stream,write output stream;
示例:
FORM f_type_trans_cost.
DATA:lv_i TYPE I VALUE 10.
DATA:lv_str TYPE string.
DATA:lv_begin TYPE I.
DATA:lv_end TYPE I.
DATA:lv_time TYPE I.
"获取类型转换花费时间
GET RUN TIME FIELD lv_begin.
DO 10 TIMES.
ENDDO.
GET RUN TIME FIELD lv_end.
lv_time = lv_end - lv_begin.
GET RUN TIME FIELD lv_begin.
DO 10 TIMES.
lv_str = lv_i.
ENDDO.
GET RUN TIME FIELD lv_end.
lv_time = lv_end - lv_begin - lv_time.
WRITE:/ lv_time.
ENDFORM.
8.2Value Assignments
示例:
"value assignment
*MOVE {source {TO|?TO} destination}
* | {EXACT source TO destination}.
*destination {=|?=} source.
"TO,= 为向上转型;
"?TO,?= 为向下转型;
*MOVE EXACT source TO destination.
"exactly转换,确保无值的损失,如果转换失败报错
*destination1 = destination2 = ... = destination = source.
"链式赋值
*MOVE-CORRESPONDING [EXACT] struc1 TO struc2.
"结构体赋值,复杂结构体结构必须一致
"UNPACK source TO destination.
"destination必须是字符型数据;
FORM f_value_assign.
DATA:lv_text TYPE string VALUE `4 Apples + 3 Oranges`.
DATA:lv_num_text TYPE n LENGTH 8.
DATA:lo_exc TYPE REF TO cx_sy_conversion_error.
MOVE lv_text TO lv_num_text.
MESSAGE lv_num_text TYPE 'I'.
TRY.
MOVE EXACT lv_text TO lv_num_text.
CATCH cx_sy_conversion_error INTO lo_exc.
MESSAGE lo_exc TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDFORM.
8.3Setting references
示例:
"References,引用
"ASSIGN mem_area TO <fs> casting_spec range_spec.
"mem_area
* { dobj[+off][(len)] }
*| { dynamic_dobj }
*| { dynamic_access }
"dynamic_dobj
* { (name) }
*| { dref->* }
*| { dobj INCREMENT inc }
*| { COMPONENT comp OF STRUCTURE struc }
"dynamic_access
*{ cref->(attr_name) }
* | { iref->(attr_name) }
* | { (class_name)=>(attr_name) }
* | { (class_name)=>attr }
* | { class=>(attr_name) }
"casting_spec
*{ }
*| { CASTING { { }
*| {TYPE type|(name)}
*| {LIKE dobj}
*| {[TYPE p] DECIMALS dec}
*| {TYPE HANDLE handle} } }
*| { obsolete_casting }
"range_spec
*{ } | {RANGE range}.
FORM f_reference.
DATA:lv_string TYPE string VALUE 'test'.
DATA:lv_dref TYPE REF TO DATA.
FIELD-SYMBOLS:<fs_data> TYPE ANY.
CREATE DATA lv_dref LIKE lv_string.
ASSIGN lv_dref->* TO <fs_data>.
<fs_data> = lv_string.
WRITE:/ <fs_data>.
"数据类型
TYPES:BEGIN OF s_struc1,
name TYPE string,
age TYPE i,
END OF s_struc1.
DATA:lv_dtype TYPE C LENGTH 1.
DATA:lt_spfli TYPE TABLE OF spfli.
DATA:ls_struc1 TYPE s_struc1.
DATA:lv_data TYPE I.
FIELD-SYMBOLS:<fs_comp> TYPE ANY.
"获取数据类型,table类型返回h;
"structure类型返回v;
"单个参数,返回数据类型;
DESCRIBE FIELD ls_struc1 TYPE lv_dtype.
IF lv_dtype <> 'u' AND lv_dtype <> 'v'.
RETURN.
ENDIF.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE ls_struc1 TO <fs_comp>.
IF sy-subrc <> 0.
EXIT.
ELSE.
WRITE:/ <fs_comp>.
ENDIF.
ENDDO.
"获取结构体
DATA:lo_struc_desc TYPE REF TO cl_abap_structdescr.
FIELD-SYMBOLS:<fs_comp_desc> LIKE LINE OF cl_abap_structdescr=>components.
lo_struc_desc ?= cl_abap_typedescr=>describe_by_data( ls_struc1 ).
LOOP AT lo_struc_desc->components ASSIGNING <fs_comp_desc>.
ASSIGN COMPONENT <fs_comp_desc>-name OF STRUCTURE lt_spfli TO <fs_comp>.
WRITE:/ <fs_comp>.
ENDLOOP.
ENDFORM.
示例2:
"casting类型转换
FORM f_reference_casting.
TYPES:BEGIN OF s_date,
year TYPE C LENGTH 4,
month TYPE C LENGTH 2,
day TYPE C LENGTH 2,
END OF s_date.
FIELD-SYMBOLS:<fs_date> TYPE s_date.
FIELD-SYMBOLS:<fs_data> TYPE ANY.
FIELD-SYMBOLS:<fs_n> TYPE N.
"casting类型转换
ASSIGN sy-datum TO <fs_date> CASTING.
WRITE:/ <fs_date>-year,<fs_date>-month,<fs_date>-day.
"casting decimal
DATA:lv_p1 TYPE P DECIMALS 2 VALUE '12345.67'.
DATA:lv_p2 TYPE P DECIMALS 2.
FIELD-SYMBOLS:<fs_any1> TYPE ANY.
FIELD-SYMBOLS:<fs_any2> TYPE ANY.
"1位小数
ASSIGN lv_p1 TO <fs_any1> CASTING TYPE P DECIMALS 1.
WRITE:/ <fs_any1>.
"2位小数
lv_p2 = <fs_any1>.
WRITE:/ lv_p2.
"三位小数
ASSIGN lv_p2 TO <fs_any2> CASTING TYPE P DECIMALS 3.
WRITE:/ <fs_any2>.
ENDFORM.
示例3:get reference
"get reference
*GET REFERENCE OF dobj INTO dref.
FORM f_get_reference.
TYPES:c1 TYPE C LENGTH 10.
DATA:lv_dref TYPE REF TO c1.
DATA:lt_dref LIKE TABLE OF lv_dref.
DATA:lv_text TYPE C LENGTH 10.
DO 10 TIMES.
lv_text = 'test' && sy-index.
GET REFERENCE OF lv_text INTO lv_dref.
APPEND lv_dref TO lt_dref.
ENDDO.
LOOP AT lt_dref INTO lv_dref.
WRITE:/ lv_dref->*.
ENDLOOP.
ENDFORM.
8.4Initialization
初始化,clear,free,unassign。
示例:
"初始化
"CLEAR
"如果清空内表及表头行需要加上[],否则只清空表头
*CLEAR dobj [ {WITH val [IN {CHARACTER|BYTE} MODE] }
* | {WITH NULL} ].
"FREE,如果dobj是内表,清空table,不影响head line
*FREE dobj.
"初始化field symbol
*UNASSIGN <fs>.