有时候我们要在程序运行的时候取得某个内表或者某个结构它的属性或者它的字段的属性,可能通过类CL_ABAP_TYPEDESCR和它的子类取得指定内表的属性。
类CL_ABAP_TYPEDESCR和它的子类的结构图
CL_ABAP_TYPEDESCR
|
|--CL_ABAP_DATADESCR
| |
| |--CL_ABAP_ELEMDESCR
| |--CL_ABAP_REFDESCR
| |--CL_ABAP_COMPLEXDESCR
| |
| |--CL_ABAP_STRUCTDESCR
| |--CL_ABAP_TABLEDESCR
|
|--CL_ABAP_OBJECTDESCR
|
|--CL_ABAP_CLASSDESCR
|--CL_ABAP_INTFDESCR
例子1:
TYPES:
BEGIN OF TYP_DEPT,
ID(10) TYPE N,
NAME(10) TYPE C,
END OF TYP_DEPT.
DATA:
WA_DEPT TYPE TYP_DEPT,
DESCR_REF TYPE REF TO CL_ABAP_STRUCTDESCR.
FIELD-SYMBOLS:
TYPE ABAP_COMPDESCR.
************************************************************************
* START-OF-SELECTION
************************************************************************
START-OF-SELECTION.
DESCR_REF ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( WA_DEPT ).
LOOP AT DESCR_REF->COMPONENTS ASSIGNING .
WRITE: / -NAME.
ENDLOOP.
例子2:
TYPES:
my_table TYPE HASHED TABLE OF i WITH UNIQUE KEY TABLE LINE.
DATA:
descr_ref TYPE ref to cl_abap_tabledescr.
FIELD-SYMBOLS:
TYPE abap_keydescr.
START-OF-SELECTION.
descr_ref ?= cl_abap_typedescr=>describe_by_name( 'MY_TABLE' ).
WRITE: / 'Typename :', descr_ref->absolute_name.
WRITE: / 'Kind :', descr_ref->type_kind.
WRITE: / 'Length :', descr_ref->length.
WRITE: / 'Decimals :', descr_ref->decimals.
WRITE: / 'Table Kind :', descr_ref->table_kind.
WRITE: / 'Initial Size :', descr_ref->initial_size.
WRITE: / 'Key Def Kind :', descr_ref->key_defkind.
WRITE: / 'Has Unique Key:', descr_ref->has_unique_key.
WRITE: / 'Key Components:'.
LOOP AT descr_ref->key ASSIGNING .
WRITE -name.
ENDLOOP.
例3:
DATA: BEGIN OF gs_partner,
partner TYPE bu_partner,
END OF gs_partner.
DATA rtti TYPE REF TO cl_abap_typedescr.
DATA length TYPE i.
DATA data_type TYPE string.
rtti = cl_abap_typedescr=>describe_by_data( gs_partner-partner ).
length = STRLEN( rtti->absolute_name ).
data_type = rtti->absolute_name+6(length).
例四:
DATA : components LIKE rstrucinfo OCCURS 0 WITH HEADER LINE.
DATA : t001 LIKE TABLE OF t001 WITH HEADER LINE.
CALL FUNCTION 'GET_COMPONENT_LIST'
EXPORTING
program = sy-repid
fieldname = 'T001'
TABLES
components = components.
LOOP AT components.
WRITE :/ components-compname , components-type.
ENDLOOP.
例5:
REPORT zzorgdataget .
TYPES: ty_poheader TYPE bapimepoheader.
DATA: dref TYPE REF TO data.
DATA: descr_ref1 TYPE REF TO cl_abap_structdescr.
DATA : l_string TYPE string.
DATA : l_object TYPE dd_x031l_table.
DATA : l_true TYPE abap_bool.
DATA : l_desc TYPE REF TO cl_abap_typedescr.
FIELD-SYMBOLS: TYPE ty_poheader.
START-OF-SELECTION.
TYPES: my_struct TYPE mepoheader.
DATA:
my_data TYPE my_struct,
descr_ref TYPE REF TO cl_abap_structdescr.
FIELD-SYMBOLS:
TYPE abap_compdescr.
START-OF-SELECTION.
descr_ref ?= cl_abap_typedescr=>describe_by_data( my_data ).
WRITE: / 'Typename :', descr_ref->absolute_name.
WRITE: / 'Kind :', descr_ref->type_kind.
WRITE: / 'Length :', descr_ref->length.
WRITE: / 'Decimals :', descr_ref->decimals.
WRITE: / 'Struct Kind :', descr_ref->struct_kind.
WRITE: / 'Components'.
WRITE: / 'Name Kind Length Decimals'.
LOOP AT descr_ref->components ASSIGNING .
WRITE: / -name, -type_kind,
-length, -decimals.
ENDLOOP.
例6:
*&---------------------------------------------------------------------*
*& Report ZCTEST06
*&---------------------------------------------------------------------*
*& 主要使用cl_abap_typedescr=>describe_by_data方法
*& 和子类cl_abap_structdescr中的components属性
*& components包含以下信息
*& length 长度
*& decimals 小数
*& type_kind 类型
*& name 字段名
*&---------------------------------------------------------------------*
REPORT zctest06.
TYPE-POOLS abap.
TYPES:
BEGIN OF ty1,
p1(10) TYPE c,
p2(5) TYPE n,
p3(3) TYPE p DECIMALS 2,
END OF ty1.
DATA: iw1 TYPE ty1,
iw_comp TYPE abap_compdescr,
ref_descr TYPE REF TO cl_abap_structdescr.
ref_descr ?= cl_abap_typedescr=>describe_by_data( iw1 ).
LOOP AT ref_descr->components INTO iw_comp.
WRITE : /1 iw_comp-length,
15 iw_comp-decimals,
30 iw_comp-type_kind,
45 iw_comp-name.
CLEAR iw_comp.
ENDLOOP.
阅读(1015) | 评论(0) | 转发(0) |