ABAP REFERENCE VARIABLE AND RTTI

DATA REFERENCE VARIABLE:你可以像处理其他的elementary data type变量一样处理data reference variableReference variable不仅可以指向single field而且还可以指向其他complex data object比如structureinternal tableReference 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 typekey components以及initial value既可以静态声明也可以动态声明。为了得到变量的内容必须首先dereference它,可以通过field symbol来做dereferenceASSIGN ref->* TO <fs>。如果data reference variable is initialinvalid那么他就不能被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 FIELDDESCRIBE 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.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值