DATA REFERENCE VARIABLE:你可以像处理其他的elementary data type变量一样处理data reference variable。Reference variable不仅可以指向single field而且还可以指向其他complex data object比如structure或internal table。Reference variable被声明后他只有empty pointer。可以通过GET REFERENCE OF dataobject INTO ref使其points to a dataobject。在dynamic methods calls中可以通过reference variable传递参数值。所有通过在程序声明变量部分用相应的语句声明的变量都可以在程序的第一个event block中使用。然而你可以通过data reference variable在程序运行的过程中动态生成变量。生成的变量也存在于目前程序的internal session中。这样生成的变量没有自己的变量名,只能通过reference variable来使用,要想得到变量的内容,你必须dereference他。通过CREATE DATA…TYPE可以动态指定变量的类型。通过这种方式声明internal table变量时table kind必须静态声明。不过line type和key components以及initial value既可以静态声明也可以动态声明。为了得到变量的内容必须首先dereference它,可以通过field symbol来做dereference,ASSIGN ref->* TO <fs>。如果data reference variable is initial或invalid那么他就不能被dereference。如果变量类型不是被动态定义的那么你可以通过ref->来得到变量的内容。例子如下:
*&---------------------------------------------------------------------*
*& Report ZTESTFSCASTTYPE
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZTESTREFVARIABLE.
PARAMETERS: p_tabam TYPE dd02l-tabname OBLIGATORY.
DATA: d_ref TYPE REF TO DATA.
FIELD-SYMBOLS: <fs_line> TYPE ANY,
<fd> TYPE ANY.
CREATE DATA d_ref TYPE (p_tabam).
ASSIGN d_ref->* TO <fs_line>.
SELECT * FROM (p_tabam) INTO <fs_line>.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE <fs_line> TO <fd>.
IF sy-subrc <> 0 OR sy-index > 5.
WRITE: '|'.
EXIT.
ENDIF.
WRITE: '|'.
WRITE: <fd>.
ENDDO.
ULINE.
ENDSELECT.
动态确定变量的属性:通过describe table你可以得到internal table的属性,在basis 610之后你还可以通过内置函数line来得到internal table的行数。对于table kind系统会把type group sydes中的常量SYDES-SYDES_KIND-UNDEFINED, SYDES_KIND-STANDARD, SYDES_KIND-SORTED, or SYDES_KIND-HASHED赋给实参。在ABAP OO中引入了RTTI的概念。通过它可以在运行时得到类型的属性。它可以应用于所有的ABAP类型,所以DESCRIBE FIELD,DESCRIBE TABLE可以被替代。对于不同的类型都有不同的描述类,为了得到一个类型的description object你必须使用CL_ABAP_TYPEDESCR的静态方法来得到相应的description class。在runtime中,每一个类型只有一个description object。举例如下:
*&---------------------------------------------------------------------*
*& Report ZTESTRTTI
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZTESTRTTI.
PARAMETERS: p_tabnam TYPE dd02l-tabname.
DATA: descr_ref TYPE REF TO cl_abap_structdescr,
wa_comp TYPE abap_compdescr.
DATA: data_ref TYPE REF TO data.
FIELD-SYMBOLS:<fs_struc> TYPE ANY.
START-OF-SELECTION.
CREATE DATA data_ref TYPE (p_tabnam).
ASSIGN data_ref->* TO <fs_struc>.
descr_ref ?= cl_abap_typedescr=>describe_by_data( <fs_struc> ).
IF sy-subrc = 0.
LOOP AT descr_ref->components INTO wa_comp.
WRITE: / wa_comp-name.
ENDLOOP.
ENDIF.