您的位置:首页 > 其它

ABAP 动态的实现任意表的ALV显示

2011-11-23 22:32 411 查看
程序没有什么实用性,就是把一个表的内容全部显示出来了,仅用于看看数据都是什么样子的,但是其中的动态的方法还是值得研究学习的。这些方法是从我的前辈身上学到的,我小小的实践了一下,本来认为在编写程序的可以尽可能的实现程序的可配置型,然后这种想法是虽然好,不过自己没有办法实现。例如
我想 DATA 内表 TYPE TABLE OF 任意表的名称。
开始 简单的认为 DATA GR_TABNAME TYPE TABNAME.
DATA 内表 TYPE TABLE OF (GR_TABNAME).
然而这是行不通的。于是采用了动态的方式实现了类似的思想。

第一部分:程序框架
REPORT ZALV_20090304_EVENT.

INCLUDE ZALV_DATA_INTI.
INCLUDE ZALV_EVENT_F01.

START-OF-SELECTION.

PERFORM SUB_ALV_DATA_GET.
第二部分:INCLUDE ZALV_DATA_INTI.
TYPE-POOLS:ABAP.
PARAMETERS P_NAME TYPE OBJNAME.
DATA LT_TABLE TYPE TABLE OF DFIES.
DATA LS_TABLE TYPE DFIES.

CALL FUNCTION 'DDIF_NAMETAB_GET'
EXPORTING
TABNAME = P_NAME
TABLES
* X031L_TAB =
DFIES_TAB =LT_TABLE
EXCEPTIONS
NOT_FOUND = 1
OTHERS =2
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBERSY-MSGNO
WITH SY-MSGV1 SY-MSGV2SY-MSGV3 SY-MSGV4.
ENDIF.

DATA LR_STRUC TYPE REF TO CL_ABAP_STRUCTDESCR.
DATA LR_TABLE TYPE REF TO CL_ABAP_TABLEDESCR.
DATA LR_TYPE TYPE REF TO CL_ABAP_TYPEDESCR.
DATA LR_DATA TYPE REF TO CL_ABAP_DATADESCR.
DATA L_STRING TYPE STRING.
DATA LT_COMP TYPE ABAP_COMPONENT_TAB.
DATA LS_COMP LIKE LINE OF LT_COMP.
DATA E_WA TYPE REF TO DATA.
DATA E_TABLE TYPE REF TO DATA.

FIELD-SYMBOLS <FS_TABLE> TYPE STANDARDTABLE.
FIELD-SYMBOLS <FS_STRUC> TYPE ANY.

LOOP AT LT_TABLE INTO LS_TABLE.
CONCATENATE LS_TABLE-TABNAME '-'LS_TABLE-FIELDNAME INTO L_STRING.
* L_STRING = LS_COMP-NAME.
LS_COMP-NAME = LS_TABLE-FIELDNAME.
CALL METHODCL_ABAP_DATADESCR=>DESCRIBE_BY_NAME
EXPORTING
P_NAME =L_STRING
RECEIVING
P_DESCR_REF =LR_TYPE
EXCEPTIONS
TYPE_NOT_FOUND = 1
OTHERS =2.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBERSY-MSGNO
WITHSY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

LS_COMP-TYPE ?= LR_TYPE.
APPEND LS_COMP TO LT_COMP.
CLEAR LS_COMP.
ENDLOOP.

CALL METHOD CL_ABAP_STRUCTDESCR=>CREATE
EXPORTING
P_COMPONENTS = LT_COMP
RECEIVING
P_RESULT = LR_STRUC
.

CALL METHOD CL_ABAP_TABLEDESCR=>CREATE
EXPORTING
P_LINE_TYPE = LR_STRUC
RECEIVING
P_RESULT = LR_TABLE
.

CREATE DATA E_WA TYPE HANDLE LR_STRUC.
CREATE DATA E_TABLE TYPE HANDLE LR_TABLE.

ASSIGN E_WA->* TO <FS_STRUC>.
ASSIGN E_TABLE->* TO <FS_TABLE>.
第三部分:INCLUDE ZALV_EVENT_F01.
FORM SUB_ALV_DATA_GET .

SELECT * INTO CORRESPONDING FIELDS OF TABLE<FS_TABLE> FROM (P_NAME).
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_STRUCTURE_NAME =P_NAME
TABLES
T_OUTTAB = <FS_TABLE>
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. " SUB_ALV_DATA_GET

已投稿到: 排行榜 圈子 阅读(83)|评论(7)|收藏(0)|打印|举报
前一篇:ABAP 的 一些小技巧总结
后一篇:ABAP中ALV函数积累的实战技巧与原理
评论 重要提示:警惕虚假中奖信息,点击查看详情[发评论]
新浪网友:2009-03-14 11:00:59 Hi 关于动态的实现任意表的ALV显示的文章。
我测试了下,输入一个table是可以的,但是输入一个试图就出错了,怎么改进呢
博主回复:2009-03-16 09:33:19HI,我查了一些资料,做了一些试验,有一些东西先来共同的探讨一下:
sap的视图的类型有五种

Database views :和数据库的视图形同,连接条件是必须自定义.
Projection views: 用于屏蔽一些字段(一般用于保护数据时使用).
Help views: 该类视图可以用搜索帮助的"selectionmethod"中使用,参与连接表必须存在外键.
Maintenance views:允许你进行对几个表的数据进行修改,参与连接表必须存在外键,他们的连接条件是不能自定义的.
Append Views:这种视图主要用于增强;.
如果database视图和Protection视图能进行select操作,其他视图不能进行查询;

对于多表连接的database视图,只能进行读操作;

如果database视图是单个表,则可以插入纪录;

如果database视图含有表的所有关键字,则可以修改;

对其他三种视图都可以进行插入和修改操作,具体参见maintance status的设置.
基于以上的分类,只有两种视图是可以支持SELECT语句的,所有只有前两种视图是可以显示的,我做了一个简单的例子,发现可以显示。
新浪网友:2009-03-14 11:20:27 另外我想把每个字段的字段名称作为ALV显示的第一行,字段名称的描述作为ALV显示的第二行,怎么做呢,从表里边的值从第三行开始
李:2009-03-16 10:24:21 朋友,
我在输入视图V_T683S的时候会有一个dump,你看看有无,怎么改进呢。
Maint. view V_T683S
Short Description Schema (&1&2)

谢谢了。

菩提大仙:2009-03-16 23:37:49 通过对V_T683S的属性进行研究,发现在MAINTANENCESTATUS中 的一个属性使用的是 DISPLAY/MAINTANENCE ALLOWED WITH DESTRICTIONS.其中的DESTRICTIONS是限制的意思,这个限制指的是权限限制,当我们生成一张视图 并且可以进行维护的时候,即GOTO->生成维护视图,需要设置一个权限组,我猜测:不是所有的用户都可以维护这个视图,需要指定的限制权限组才可以。 关于第三行显示ALV的我认为可行,正在调试代码

菩提大仙:2009-03-17 22:07:07 个人分析: 从字面的意思上就可以看出Maintenance views是一个维护视图,用来维护数据的。而视图中可以用来查询数据的只有在SE11中创建视图类型---- Database views (数据库视图类型)和Projection views(投影视图)也只有这两个视图可以使用SELECT语句进行查询。因此才可以用ALV进行显示。其他的三种视图都是维护数据的方式。
新浪网友:2009-03-18 10:16:59 版主,你的分析是对的,我测试了下select是不支持Maintenance views的。
REPORT Z0001.

TABLES V_T683S.
SELECT * FROM V_T683S .
WRITE: / V_T683S-KVEWE, V_T683S-KAPPL,
V_T683S-KALSM,V_T683S-STUNR.
ENDSELECT.

同样的错误提示‘"V_T683S" is not defined in the ABAP Dictionary as atable, projection view, or database view"。
新浪网友:2009-03-18 10:29:49其实我初始的用意是想从视图中读取我需要的数据,拿视图V_T683S来说,他比表T683S多一个字段VTEXT(Description),如果仅仅读取表T683S的话,会缺这一列数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: