工作生活与爱好

工作中的记录; 生活中的记忆; 业余爱好的记载。

2007-01-20

 

ABAP 动态内表构建 Dynamic internal table

这两天做了一个这样的需求,其中要求根据用户输入的工资项(T512W-LGART)查找数据,并输出到ALV,要求是输出跟着输入变。由于工资项的配置信息可能会变,因此用于存储要显示的数据的内表就不能预先知道,因此不得不寻求动态内表的构建方法。

其实网上的例子也有不少,但是都缺少说明,折腾了一上午才弄明白一些,写出来与大家分享。

REPORT Z_DT2.

type-pools : abap.

*t512w为例,构建一个动态内表

tables: t512w.

*field-symbols是一个标志,你可以理解为一个指针,将来创建的内表就要通过它们来访问

field-symbols: type standard table,

,

.

* 这里定义了一个 dy_table 和一个 dy_line 类型是引用,但 to data 未能理解是什么意思,我觉得应该是说指向为空的意思

data: dy_table type ref to data,

dy_line type ref to data,

*用于存储即将构建的动态内表结构

ifc type lvc_t_fcat,

xfc type lvc_s_fcat.

data: begin of t_lgart occurs 0,

LGART like t512w-lgart,

end of t_lgart.

select-options: S_LGART FOR t512w-lgart.

start-of-selection.

*首先从数据库中把符合用户输入的LGART填入内表,将来构建的动态内表每一列就是LGART中的每一行。

select lgart into t_lgart-lgart from t512w where lgart in s_lgart and MOLGA = '28'.

append t_lgart.

endselect.

*循环读取内表t_lgart,对于每行构建内表

loop at t_lgart.

*这里偷了个懒,因为工资项中会有/103这样的数据,而/是不能用左列明的,大家可以自己写一个替换逻辑,把/替换成_之类的字符。

check t_lgart-lgart+0(1) <> '/'.

*列名就用lgart

xfc-fieldname = t_lgart-lgart.

xfc-datatype = 'C'.

xfc-inttype = 'C'.

xfc-intlen = 6.

xfc-decimals = 0.

append xfc to ifc.

endloop.

*此处调用一个方法,这个方法用于构建动态内表,输入的就是要构建的结构,输出的就是一个dy_table,之前定义过,但是并不能直接访问。

call method cl_alv_table_create=>create_dynamic_table

EXPORTING

it_fieldcatalog = ifc

IMPORTING

ep_table = dy_table.

*设定指向 dy_table

assign dy_table->* to .

*下面这句建立了一个类型的工作区Work area

create data dy_line like line of .

*同理设定指针

assign dy_line->* to .

于是便动态的建立了一个内表和一个工作区,由于此方法建立的内表没有header line,所以需要一个工作区。

下面是取数或者赋值的方法:

*此行中的xxxx1就是列名

ASSIGN COMPONENT xxxx1 OF STRUCTURE TO .

*此行的作用就是给中的该列一个值

= xxxx2.

*Append就可以把该行添加到表中了

APPEND TO .

如上所述,即可以动态构建内表,这种方法主要用于表结构无法确定有几列,几有哪些列,尤其与信息配置有关的时候,就只能用这种方法,否则配置一变,程序就不能用了。


Comments: 发表评论



<< Home

Archives

1990年1月15日   2007年1月14日   2007年1月15日   2007年1月16日   2007年1月17日   2007年1月18日   2007年1月19日   2007年1月20日   2007年1月22日   2007年1月23日   2007年1月24日   2007年1月25日   2007年1月26日   2007年1月27日   2007年1月29日   2007年1月30日   2007年1月31日   2007年2月1日   2007年2月2日   2007年2月3日   2007年3月13日   2007年5月15日   2007年5月16日   2007年6月2日  

This page is powered by Blogger. Isn't yours?