loveplxf

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

接上一部分,继续探讨ABAP中的动态编程。

这一部分将是ABAP动态编程中使用最为广泛的一块:RTTS。也许您已经有经验关于使用RTTS:比如在FM时,我们如果在不知道(或者不care)传进来的参数的类型时,我们一般会使用data等这样的generic类型,然而,我们在FM里面,却必须对传进来的参数进行处理,想想:如果我们传进来的参数是一个structure,也就意味着它会有很多的fields,而此时如果我们想对该structure下面某一个field进行数据处理(如编辑)时,我们该如何做呢?因为我们在FM里面“暂时”不知道这个传进来的参数structure到底是何结构,所以就更别提它有哪些fields。这个时候,RTTS开始发挥作用。

RTTS是一种描述,在ABAP中用来动态获取以及操纵数据结构。我们需要看一下,RTTS总体关系,通过名字也许就明白了:

 

利用RTTS来完成:

 

取得这些类型后,可以完成如下:

 

1.RTTS创建Table Type

原理:

 

应用:

 

2.RTTS创建Reference Type

原理:

 

应用:

 

3.RTTS创建Structured Type

原理:

 

应用:

 

4.RTTS创建Structured Type with Includes

原理及应用:

 

5.实例

(1)动态输出给定表中部分字段

动态地输出一个表内容:

使用数据:

 169

测试程序:

*&———————————————————————*
*& Report  ZTEST_RTTS
*&
*&———————————————————————*
REPORT ZTEST_RTTS.
DATA: comp_tab type cl_abap_structdescr=>component_table, comp LIKE LINE OF comp_tab, dataref TYPE REF TO data, struct type REF TO cl_abap_structdescr, tab type REF TO cl_abap_tabledescr. FIELD-SYMBOLS:<lfs_s> TYPE any, <lfs_t> TYPE any TABLE. * for table ”SCARR” struct ?= cl_abap_structdescr=>DESCRIBE_BY_NAME( ‘SCARR’ ). comp_tab = struct->GET_COMPONENTS( ). **1-1. only need CARRID,CARRNAME,CURRCODE LOOP AT comp_tab into comp. IF comp-name = ‘CARRID’ or comp-name = ‘CARRNAME’ or comp-name = ‘CURRCODE’. CONTINUE. else. delete table comp_tab from comp. ENDIF. ENDLOOP. **1-2. form the table-type struct = cl_abap_structdescr=>create( comp_tab ). tab = cl_abap_tabledescr=>create( struct ). “form the structure type CREATE DATA dataref TYPE HANDLE struct. ASSIGN dataref->* to <lfs_s> CASTING TYPE HANDLE struct. “form the table type CREATE DATA dataref TYPE HANDLE tab. ASSIGN dataref->* to <lfs_t> CASTING TYPE HANDLE tab. **1-3. retrive data SELECT CARRID CARRNAME CURRCODE from SCARR INTO TABLE <lfs_t>. *2. output LOOP AT <lfs_t> ASSIGNING <lfs_s>. WRITE:/10 <lfs_s>. ENDLOOP.

结果:

(2)确定动态表结构

在不确定表名的情况下(如any table),需要得出它的字段结构

*&———————————————————————*
*& Report  ZTEST_TABLE_TYPE
*&
*&———————————————————————


REPORT ZTEST_TABLE_TYPE.

types:
begin of typ_tb,
id type char5,
name type char10,
other type char50,
end of typ_tb.

DATA:
s_tb type typ_tb,
t_tb type TABLE OF typ_tb.

START-OF-SELECTION.
clear:s_tb.
s_tb-id = ‘01′.
s_tb-name = ‘IBM’.
s_tb-other = ‘GBS’.
APPEND s_tb to t_tb.
clear:s_tb.
s_tb-id = ‘02′.
s_tb-name = ‘SAP’.
s_tb-other = ‘Labs’.
APPEND s_tb to t_tb.
clear:s_tb.
s_tb-id = ‘03′.
s_tb-name = ‘HP’.
s_tb-other = ‘GDCC’.
APPEND s_tb to t_tb.

* get the field and output
PERFORM output_field USING t_tb.

*&———————————————————————*
*&      Form  OUTPUT_FIELD
*&———————————————————————*
*       get the field and output
*———————————————————————-*
*      –>IT_TB  table
*———————————————————————-*
FORM OUTPUT_FIELD USING IT_TB type ANY TABLE .

DATA:
*— Line type of Import table
lo_line type REF TO data.
DATA:
*— Table Descr
lo_tbdesc type REF TO cl_abap_tabledescr,
*— Structure Descr
lo_scdesc type REF TO cl_abap_structdescr,
lt_comptab TYPE cl_abap_structdescr=>component_table,
lo_comp TYPE cl_abap_structdescr=>component.

FIELD-SYMBOLS:
<lfs_line> type any.

*1. get the line’s reference
CREATE DATA lo_line LIKE LINE OF it_tb.
“get the real type to FS
ASSIGN lo_line->* to <lfs_line>.

*2. get components
lo_scdesc ?= CL_ABAP_STRUCTDESCR=>DESCRIBE_BY_DATA_REF( lo_line ).
lt_comptab = lo_scdesc->get_components( ).

LOOP AT lt_comptab into lo_comp.
write:/ ‘Field name:’, lo_comp-name.
ENDLOOP.

ENDFORM. “ OUTPUT_FIELD

结果为:

247

 

 

文中用到的ppt文档(ABAP动态编程--官方资料),下载地址:
posted on 2012-08-15 21:35  loveplxf  阅读(303)  评论(0编辑  收藏  举报