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 .
如上所述,即可以动态构建内表,这种方法主要用于表结构无法确定有几列,几有哪些列,尤其与信息配置有关的时候,就只能用这种方法,否则配置一变,程序就不能用了。
才疏学浅,学习体会总结出来希望能对大家有所帮助,有不对的地方希望大家指正,向大家学习!

ABAP开发环境详解

ABAP开发环境从狭义上说是SAP R/3系统的ABAP Workbench,Tcode是SE80,从广义上讲,ABAP开发环境本身构建与SAP 平台,以前是 SAP R/3,版本是3.0~4.71,后来发展到ECC 6.0,开发环境的平台升级为Net Weaver 2004,内部版本是7.0。最新的内部版本7.1 将于2008年7月低向客户Release,7.1版本的ABAP开发环境要优秀的多。

ABAP/4表面看起来很简单,其实是一个复杂的语言。初学者常常感到很迷惑。只有知其然,你才能掌握这个语言。只有知其然并且知其所以然,你才能对这个令人兴奋的知识领域了解别人不了解的内容。

正如熟练的程序员所知道的那样,初学者很快也会知道,创建ABAP/4程序不仅仅是创建一个程序。它常常涉及到创建开发对象(development object)用来支持所创建的程序。

什么是R/3?

R/3是为大公司数据处理所设计的一套集成的应用程序。是由德国的SAP公司开发的(SAP:Systems Applications and Products for data processing)。R/3由运行环境和一组用SAP的4GL语言ABAP/4编写的应用程序所组成。设计这些应用程序是为了满足大型商业应用数据处理的需要。R/3和其以前的版本R/2在制造业非常流行。

R/3的目的是什么?

R/3的唯一目的就是提供一组紧密集成的大型商业应用。这些应用是:

生产计划(PP,Production Planning)
物料管理(MM,Materials Management)
销售和配送(SD,Sales and Distribution)
财务会计(FI,Financial Accounting)
控制(CO,Controlling)
固定资产管理(AM,Fixed Assets Management)
项目管理(PS,Project System)
工作流(WF,Workflow)
IS(IS,Industry Solutions)
人力资源(HR,Human Resources)
工厂维护(PM,Plant Maintenance)
质量管理(QM,Quality Management)
这些应用程序有时被称为R/3的功能模块。

传统上我们是对单个模块进行评估,从多个软件供应商购买这些单独的模块,组装在一起成为数据处理应用。这样在这些单独的模块之间就需要接口。例如,物料管理需要与销售和财务联系,工作流需要从人力资源获得信息。在实施和维护这些接口时花费了大量的时间和金钱。

R/3预置了大多数大公司需要的核心商业应用。这些应用在同一个环境下共存。它们使用的是单个数据库和一组数据表。数据库的大小在12G到接近3T之间。标准的R/3配置有大约8000个数据表。

为什么我们需要知道这些功能模块?

作为一个ABAP/4程序员,知道这些功能模块是重要的。这是因为这些功能模块都是完全用ABAP/4编写的。要想成为一个熟练的R/3开发者,就必须了解这些功能模块。

例如,假定你已熟悉ABAP/4,要求你编写一个财务报表,对企业的每个供应商的年度借贷进行汇总。你或许知道如何编写ABAP代码,你知道如何才能满足这个需求吗?

又或者你的工作是承担了用ABAP/4开发新的应用程序。要求你设计一个系统,向潜在的客户提供股票行情。如果你不了解财务和销售系统,你就不知道你将创建的东西是否在R/3中已经存在了。你也不知道是否已经有了R/3数据表,包含了与你要存储的数据有类似甚至相同类型的数据。这些功能模块是高度集成的。“我要建立自己的数据表,保存自己的数据拷贝”,抱有这样想法的开发者很快就会发现他的数据是多余的,必须与数据库的已有数据同步。这样建立的应用程序没有充分利用R/3环境的高度集成的特性。

我指出这一点是因为许多希望成为独立的咨询顾问的开发者认为,只需学习ABAP/4就可以开发R/3应用。学习ABAP/4当然是一个很好的开始,但仅仅是一个开始。那些有兴趣成为ABAP/4咨询顾问的人常常忽视了在功能模块知识训练的重要性。虽然功能模块知识可以在实际的工作中学习,但是我希望表明的是,学习ABAP/4语言只是迈向SAP万里长征的第一步。如果你希望成为一个成功的独立咨询顾问,你就需要掌握功能模块知识。

了解Basis

Basis就象是R/3的操作系统,它介于ABAP/4代码和计算机操作系统之间。因此,SAP喜欢称之为中间件。

ABAP/4程序不能直接在操作系统上运行,需要一组程序(这组程序就是Basis)对其输入输出进行装载、解释和缓冲。

Basis在某些方面有点像Windows环境。Windows启动后为Windows程序提供了运行环境。没有Windows,为Windows环境编写的程序就不能运行。

Basis对于ABAP/4来说就象Windows对于Windows程序一样。Basis为ABAP/4

程序提供了运行环境。没有Basis,ABAP/4程序就不能运行。当你启动R/3时,你可以认为启动了Basis。Basis是一组带有接口的R/3系统程序,利用这些接口,用户就可以启动ABAP/4程序。

为了安装Basis,安装者在操作系统的命令提示符下运行r3inst程序。像大多数安装过程一样,这将产生一个目录结构,并将一组可执行文件拷贝到这个目录结构。这些可执行文件作为一个整体就形成了Basis。

为了启动R/3系统,只需输入命令startsap。Basis就被启动,处于运行状态,接受用户请求,运行ABAP/4程序。

ABAP/4程序运行在保护性的Basis环境,它们不能在操作系统环境下运行。Basis读取ABAP/4代码,并向操作系统指令解释ABAP/4代码。

ABAP/4程序不能直接访问操作系统的功能,而是利用Basis功能进行文件I/O和在窗口中显示数据。与操作系统的分离使得ABAP/4程序不用修改就可运行在任何支持R/3的系统上。
后文关于Basis的东西省略了,原文:地址