壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1186|回复: 1

[ABAP] 【ABAP动态编程】ABAP中动态编程 (第三部分)

[复制链接]
发表于 2012/8/14 23:39:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

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

17144169_201010201640041.jpg

利用RTTS来完成:
17144169_201010201641441.jpg

取得这些类型后,可以完成如下:
17144169_201010201658101.jpg

1.RTTS创建Table Type
原理:
17144169_201010201659061.jpg
应用:
17144169_201010201659201.jpg


2.RTTS创建Reference Type
原理:
17144169_201010201700051.jpg
应用:
17144169_201010201700211.jpg

3.RTTS创建Structured Type
原理:
17144169_201010201701011.jpg

应用:

17144169_201010201701271.jpg

4.RTTS创建Structured Type with Includes
原理及应用:
17144169_201010201702081.jpg

5.实例
(1)动态输出给定表中部分字段
动态地输出一个表内容:
使用数据:
169.jpg
测试程序:
*&———————————————————————*
*& 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: TYPE any,
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 CASTING TYPE HANDLE struct.
“form the table type
CREATE DATA dataref TYPE HANDLE tab.
ASSIGN dataref->* to CASTING TYPE HANDLE tab.
**1-3. retrive data
SELECT CARRID CARRNAME CURRCODE from SCARR INTO TABLE .
*2. output
LOOP AT ASSIGNING .
WRITE:/10 .
ENDLOOP.
结果:
17144169_201010201703341.jpg
(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:
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 .
*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.jpg


本帖被以下淘专辑推荐:

发表于 2012/9/25 14:15:12 | 显示全部楼层
学习第三篇
很好  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/29 14:47 , Processed in 0.024014 second(s), 16 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表