接上一部分,继续探讨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)动态输出给定表中部分字段
动态地输出一个表内容:
使用数据:
测试程序:
*&———————————————————————* *& 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
结果为:
文中用到的ppt文档(ABAP动态编程--官方资料),下载地址: