SAP的ABAP4语言中文培训教材第二部分第五章提炼数据.docx
《SAP的ABAP4语言中文培训教材第二部分第五章提炼数据.docx》由会员分享,可在线阅读,更多相关《SAP的ABAP4语言中文培训教材第二部分第五章提炼数据.docx(24页珍藏版)》请在冰豆网上搜索。
SAP的ABAP4语言中文培训教材第二部分第五章提炼数据
第五章1提炼数据
概览
内容
已提炼数据的示例
在读取数据过程中提炼数据
用内表提炼数据
用平铺内表提炼数据
使用嵌套内表提炼数据
使用摘录数据集提炼数据
创建并填充摘录数据集
处理摘录数据集
使用摘录数据集提炼数据示例
其它任务中的报表必须提炼数据。
即,除了检索数据,报表还必须给数据排序、计算合计以及统计列表中的条目等等。
用户可以从数据库表或顺序文件中读取需要提炼的数据,或者在报表中创建一般数据。
下面主题包含了提炼数据的示例:
本节将讨论在创建数据集之后提炼数据集的数据。
提炼过程独立于检索数据的过程。
首先要创建数据集,然后再提炼该数据集。
该规则也有例外,就是用户一般性地创建自己的数据集的过程,或使用SQL语句直接访问数据库的过程。
有时,在检索过程中就能对数据进行充分的提炼。
例如,参见检索过程中提炼数据的SQL报表。
使用逻辑数据库访问数据库表时,或从顺序文件中读取数据时,或者如果开放式SQL的选项不够全面,那么检索的数据将会按需要提炼的顺序和结构显示。
要想以后再提炼这些数据,请在检索过程中,将它们按压缩格式保存在临时数据集中。
创建并提炼数据集
用户使用临时数据集为检索之后的提炼工作提供选定的数据。
ABAP/4提供了两种在存储中创建数据集的方法:
内表和摘录数据集。
用户的选择取决于要完成的任务。
内表
如果希望数据集尽可能密切地映射下面的的数据结构,或者希望直接访问单个数据,请使用内表。
关于如何使用内表提炼数据的示例,参见:
摘录数据集
摘录是用户可用报表创建的顺序数据集。
如果需要多次将大量数据作为一个整体处理,请使用摘录。
下面的主题说明如何创建摘录数据集、如何填充数据以及最后如何提炼这些数据。
1已提炼数据的示例
对于许多报表评估来说,处理数据时的顺序与数据存储的顺序可能不同。
由于读取操作的结果反映数据存储的顺序,所以必须对选定的整个数据材料按所需的顺序重新排序。
在航班预订应用环境中提炼数据的典型结果是创建一个列表,用来包含每个航班号的预订信息。
航班连接将按起飞城市排序,航班按日期排序,乘客按等级和是否吸烟排序。
对于每次航班,都要确定乘客总数和行李总重量。
结果列表中的一段如下所示:
用户可从下列内容中找到四个不同的创建该列表的程序:
1在读取数据过程中提炼数据
提炼数据最直接的方法是使用SELECT语句中相应的选项(参见从数据库表提炼数据(页Error!
Notavalidlink.))。
下面的示例程序用来从表SPFLI、SFLIGHT和SBOOK中提炼数据,如已提炼数据的示例(页1)中说明的那样。
REPORTSAPMZTST.
DATA:
SUMTYPEI,CNTTYPEI.
TABLES:
SPFLI,SFLIGHT,SBOOK.
SELECT*FROMSPFLIORDERBYCITYFROMCITYTOCONNID.
SKIP.
WRITE:
/SPFLI-CARRID,
SPFLI-CONNID,
'from',(15)SPFLI-CITYFROM,
'to',(15)SPFLI-CITYTO.
ULINE.
SELECT*FROMSFLIGHTWHERECARRID=SPFLI-CARRID
ANDCONNID=SPFLI-CONNID
ORDERBYFLDATE.
SKIP.
WRITE:
/'Date:
',SFLIGHT-FLDATE.
WRITE:
20'Book-ID',40'Smoker',50'Class'.
ULINE.
SUM=0.
CNT=0.
SELECT*FROMSBOOKWHERECARRID=SFLIGHT-CARRID
ANDCONNID=SFLIGHT-CONNID
ANDFLDATE=SFLIGHT-FLDATE
ORDERBYCLASSSMOKERBOOKID.
WRITE:
/SBOOK-BOOKIDUNDER'Book-ID',
SBOOK-SMOKERUNDER'Smoker',
SBOOK-CLASSUNDER'Class'.
SUM=SUM+SBOOK-LUGGWEIGHT.
CNT=CNT+1.
ENDSELECT.
ULINE.
WRITE:
'Numberofbookings:
',(3)CNT,
/'Totalluggageweight:
',(3)SUM,SBOOK-WUNIT.
ENDSELECT.
ENDSELECT.
该程序使用了SELECT语句的ORDERBY子句,它们已在指令行的顺序(页Error!
Notavalidlink.)中说明。
关于SELECT语句可用于提炼数据的其它选项,参见选择并处理指令列中数据(页Error!
Notavalidlink.)。
用这种方法提炼数据,必须自己编写数据库访问程序。
另外,还必须编写选择屏幕程序,这使用户用该屏幕限制数据集被读取成为可能(参见使用选择屏幕(页Error!
Notavalidlink.))。
用逻辑数据库读取数据时,无需自己编写数据库访问程序。
系统将自动创建选择屏幕。
但是,不会影响读取数据的顺序。
下面内容将说明如何用临时数据集给这些数据记录排序。
2用内表提炼数据
将数据保存在内表中时,对于读取的每个数据库都需要一个内表。
该内表包含数据库表的部分或所有列。
无论是使用平铺结构为每个数据库表创建内表,还是使用嵌套结构创建内表,包含多少栏都由用户决定。
对于使用平铺结构的表,必须使用关键字。
在嵌套结构的表中,可以根据逻辑数据库中的层次从数据库表保存数据。
这里不需要关键字。
如果使用大量数据,则将数据保存在内表中并在其中提炼数据有以下缺点:
由于系统一个接一个地处理所有内表,所以在几个内表中划分大量数据时,必须考虑处理内表所需的运行时间。
并且系统以未压缩形式存储内表,这意味着大量的数据需要大量的存储空间。
甚至系统还必须将数据集展开成已分页的区域,这样就降低了处理速度。
创建和处理内表(页Error!
Notavalidlink.)详细说明了如何使用内表。
下面的主题包含了两个使用内表提炼数据的示例:
2用平铺内表提炼数据
下面的示例说明如何使用平铺内表提炼数据:
该程序被连接到逻辑数据库F1S。
REPORTSAPMZTST.
DATA:
SUMTYPEI,CNTTYPEI.
TABLES:
SPFLI,SFLIGHT,SBOOK.
DATA:
SORT_SPFLILIKESPFLIOCCURS100WITHHEADERLINE,
SORT_SFLIGHTLIKESFLIGHTOCCURS100WITHHEADERLINE,
SORT_SBOOKLIKESBOOKOCCURS100WITHHEADERLINE.
START-OF-SELECTION.
GETSPFLI.
APPENDSPFLITOSORT_SPFLI.
GETSFLIGHT.
APPENDSFLIGHTTOSORT_SFLIGHT.
GETSBOOK.
APPENDSBOOKTOSORT_SBOOK.
END-OF-SELECTION.
SORT:
SORT_SPFLIBYCITYFROMCITYTOCONNID,
SORT_SFLIGHTBYFLDATE,
SORT_SBOOKBYCLASSSMOKERBOOKID.
LOOPATSORT_SPFLI.
SKIP.
WRITE:
/SORT_SPFLI-CARRID,
SORT_SPFLI-CONNID,
'from',(15)SORT_SPFLI-CITYFROM,
'to',(15)SORT_SPFLI-CITYTO.
ULINE.
LOOPATSORT_SFLIGHTWHERECARRID=SORT_SPFLI-CARRID
ANDCONNID=SORT_SPFLI-CONNID.
SKIP.
WRITE:
/'Date:
',SORT_SFLIGHT-FLDATE.
WRITE:
20'Book-ID',40'Smoker',50'Class'.
ULINE.
SUM=0.
CNT=0.
LOOPATSORT_SBOOKWHERECARRID=SORT_SFLIGHT-CARRID
ANDCONNID=SORT_SFLIGHT-CONNID
ANDFLDATE=SORT_SFLIGHT-FLDATE.
WRITE:
/SORT_SBOOK-BOOKIDUNDER'Book-ID',
SORT_SBOOK-SMOKERUNDER'Smoker',
SORT_SBOOK-CLASSUNDER'Class'.
SUM=SUM+SORT_SBOOK-LUGGWEIGHT.
CNT=CNT+1.
ENDLOOP.
ULINE.
WRITE:
'Numberofbookings:
',(3)CNT,
/'Totalluggageweight:
',
(3)SUM,SORT_SBOOK-WUNIT.
ENDLOOP.
ENDLOOP.
该程序创建已提炼数据的示例(页1)中显示的列表。
检索数据的GET事件明显独立于排序过程。
数据库表的结构和内容完全由三个内表确定。
用SORT语句排序过程之后(参见内表排序(页Error!
Notavalidlink.)),系统将显示表的内容。
该循环结构与在读取数据过程中提炼数据(页1)中的示例中的SELECT循环结构完全对应。
3使用嵌套内表提炼数据
下面的示例说明如何使用嵌套内表给数据排序。
该程序被连接到逻辑数据库F1S。
REPORTSAPMZTST.
DATA:
SUMTYPEI,CNTTYPEI.
TABLES:
SPFLI,SFLIGHT,SBOOK.
DATA:
BEGINOFSORT_SBOOK,
BOOKIDLIKESBOOK-BOOKID,
SMOKERLIKESBOOK-SMOKER,
CLASSLIKESBOOK-CLASS,
LUGGWEIGHTLIKESBOOK-LUGGWEIGHT,
WUNITLIKESBOOK-WUNIT,
ENDOFSORT_SBOOK.
DATA:
BEGINOFSORT_SFLIGHT,
FLDATELIKESFLIGHT-FLDATE,
SBOOKLIKESORT_SBOOKOCCURS100,
ENDOFSORT_SFLIGHT.
DATA:
BEGINOFSORT_SPFLIOCCURS100,
CARRIDLIKESPFLI-CARRID,
CONNIDLIKESPFLI-CONNID,
CITYFROMLIKESPFLI-CITYFROM,
CITYTOLIKESPFLI-CITYTO,
SFLIGHTLIKESORT_SFLIGHTOCCURS100,
ENDOFSORT_SPFLI.
START-OF-SELECTION.
GETSPFLI.
REFRESHSORT_SPFLI-SFLIGHT.
GETSFLIGHT.
REFRESHSORT_SFLIGHT-SBOOK.
GETSBOOK.
MOVE-CORRESPONDINGSBOOKTOSORT_SBOOK.
APPENDSORT_SBOOKTOSORT_SFLIGHT-SBOOK.
GETSFLIGHTLATE.
MOVE-CORRESPONDINGSFLIGHTTOSORT_SFLIGHT.
APPENDSORT_SFLIGHTTOSORT_SPFLI-SFLIGHT.
GETSPFLILATE.
MOVE-CORRESPONDINGSPFLITOSORT_SPFLI.
APPENDSORT_SPFLI.
END-OF-SELECTION.
SORTSORT_SPFLIBYCITYFROMCITYTOCONNID.
LOOPATSORT_SPFLI.
SKIP.
WRITE:
/SORT_SPFLI-CARRID,
SORT_SPFLI-CONNID,
'from',(15)SORT_SPFLI-CITYFROM,
'to',(15)SORT_SPFLI-CITYTO.
ULINE.
SORTSORT_SPFLI-SFLIGHTBYFLDATE.
LOOPATSORT_SPFLI-SFLIGHTINTOSORT_SFLIGHT.
SKIP.
WRITE:
/'Date:
',SORT_SFLIGHT-FLDATE.
WRITE:
20'Book-ID',40'Smoker',50'Class'.
ULINE.
SORTSORT_SFLIGHT-SBOOKBYCLASSSMOKERBOOKID.
SUM=0.
CNT=0.
LOOPATSORT_SFLIGHT-SBOOKINTOSORT_SBOOK.
WRITE:
/SORT_SBOOK-BOOKIDUNDER'Book-ID',
SORT_SBOOK-SMOKERUNDER'Smoker',
SORT_SBOOK-CLASSUNDER'Class'.
SUM=SUM+SORT_SBOOK-LUGGWEIGHT.
CNT=CNT+1.
ENDLOOP.
ULINE.
WRITE:
'Numberofbookings:
',(3)CNT,
/'Totalluggageweight:
',
(3)SUM,SORT_SBOOK-WUNIT.
ENDLOOP.
ENDLOOP.
该程序创建已提炼数据的示例(页1)中显示的列表。
在GET事件中,系统将数据读取到三级表SORT_SPFLI中,该表包含了子结构SFLIGHT和子子结构SBOOK。
排序过程在单个嵌套层中进行。
该编程方法不要求内表之间的主关系(无WHERE条件),但它比平铺内表复杂。
并且增加的内部维护工作对要求的存储空间和运行时间行为将起到消极影响。
5使用摘录数据集提炼数据
由于内表具有固定的行结构,所以它不适于处理具有变化结构的数据集。
出于这种考虑,ABAP/4提供了创建所谓的摘录数据集的可能性。
摘录数据集是报表存储区中的顺序数据集。
这意味着只能在循环中访问它的数据。
不能象对内表操作那样通过索引访问其单个行。
在报表运行过程中,系统可以正确地创建一个摘录数据集。
至于内表,因为系统可根据需要展开它,所以原则上摘录数据集的大小是没有限制的。
摘录数据集由一系列预定义的结构的记录组成。
但是,不是所有记录的结构都必须相同。
在一个摘录数据集中,可以一个接一个地存储不同长度和结构的记录。
不必为要存储的不同结构创建单个的数据集。
这实际上大大减少了维护工作。
与内表不同,系统在存储摘录数据集时,将部分压缩摘录数据集。
这减少了所需的存储空间。
另外,不必在报表的开始处指定摘录数据集的结构,而可以在程序流过程中动态决定其结构。
下面主题解释
关于如何使用摘录数据集提炼数据的示例,参见
5创建并填充摘录数据集
要在报表中创建并填充摘录数据集,请执行下列三个步骤:
1.将要在摘录数据集中使用的记录类型定义为字段组。
2.通过分配字段定义每个记录类型的结构。
3.将所需的数据摘录到数据集中。
5将摘录记录定义为字段组
摘录数据集由一系列记录组成。
这些记录可以有不同的结构。
所有具有相同结构的记录形成一个记录类型。
必须使用FIELD-GROUPS语句将摘录数据集的每个记录类型定义为字段组。
语法
FIELD-GROUPS.
该语句定义了字段组。
字段组将几个字段组合到一个名称下。
关于如何定义字段组的单个字段的信息,参见给字段组分配字段(页5)。
出于可读性的原因,最好在报表的开始处,即声明段之后定义字段组。
字段组不为字段保留存储空间,但它包含现有字段的指针。
用记录填充摘录数据集时,这些指针将决定存储记录的内容。
可以定义特殊字段组HEADER:
语法
FIELD-GROUPSHEADER.
填充摘录数据集时,系统将自动用该字段组给所有其它字段组加上前缀。
这意味着在摘录数据集中,字段组的记录总是首先包含HEADER字段组的字段。
在给摘录数据集排序时,系统将使用这些字段作为缺省的排序关键字。
FIELD-GROUPS:
HEADER,FLIGHT_INFO,FLIGHT_DATE.
该语句链创建了三个字段组。
5给字段组分配字段
要确定将哪个字段包含进字段组中,请使用INSERT语句:
语法
INSERT...INTO.
该语句定义字段组的字段。
在给字段组分配字段以前,必须用FIELD-GROUPS语句定义字段组。
而对于字段,就只能使用全局数据对象。
不能将在子程序或功能模块中定义的局部数据对象分配给字段组。
INSERT语句与FIELD-GROUPS语句一样,既不保留存储空间,也不转换值。
您使用INSERT语句创建指向字段组中的字段的指针,因而定义了摘录记录的结构。
要填充摘录记录,参见摘录数据集(页6)。
执行报表时,可给字段组分配字段,直到首次使用该字段组填充摘录记录。
从这时起,记录的结构就已固定,不再改变。
简而言之,如果还没有使用字段组,就可以动态地给它分配任意值。
由于特殊字段组HEADER是每个摘录记录的一部分,所以在填充了第一个摘录记录后,就不能再更改该字段组。
某一字段可出现在多个字段组中;但是,这将导致摘录数据集中有不必要的数据冗余。
您不必用字段填充字段组。
如果定义HEADER字段组,则只用HEADER中的字段填充摘录记录。
TABLES:
SPFLI,SFLIGHT.
FIELD-GROUPS:
HEADER,FLIGHT_INFO,FLIGHT_DATE.
INSERT:
SPFLI-CARRIDSPFLI-CONNIDSFLIGHT-FLDATE
INTOHEADER,
SPFLI-CITYFROMSPFLI-CITYTO
INTOFLIGHT_INFO.
该示例创建了三个字段组。
INSERT语句用字段填充了两个字段组。
6摘录数据集
要创建实际的摘录数据集,请使用EXTRACT语句:
语法
EXTRACT.
系统用报表的第一个EXTRACT语句创建摘录数据集并添加第一个摘录记录。
并且每使用一个后续的EXTRACT语句,就向摘录数据集填充另一个摘取记录。
如果已经指定,则每个摘录记录都包含字段组HEADER中的字段,并用它作为排序关键字,其后紧跟那些包含在字段组中的字段。
在摘录过程中,系统用相应字段中的当前内容填充摘录记录。
一旦系统为字段组处理了第一条EXTRACT语句,摘录数据集中的相应摘录记录的结构就已固定。
不能再在字段组和HEADER中插入新的字段。
如果试图在后面修改其中一个字段组并在另一条EXTRACT语句中使用它,将会发生运行时错误。
通过使用不同的字段组处理几次EXTRACT语句,就可以用不同长度和结构的记录填充摘录数据集。
由于在EXTRACT语句中首次使用字段组之前,可动态地修改该字段组,所以摘录数据集的优点是不必在程序一开始就确定字段组的结构。
下列程序被连接到逻辑数据库F1S。
REPORTSAPMZTST.
TABLES:
SPFLI,SFLIGHT.
FIELD-GROUPS:
HEADER,FLIGHT_INFO,FLIGHT_DATE.
INSERT:
SPFLI-CARRIDSPFLI-CONNIDSFLIGHT-FLDATE
INTOHEADER,
SPFLI-CITYFROMSPFLI-CITYTO
INTOFLIGHT_INFO.
START-OF-SELECTION.
GETSPFLI.
EXTRACTFLIGHT_INFO.
GETSFLIGHT.
EXTRACTFLIGHT_DATE.
该示例创建三个字段组。
INSERT语句给其中的两个字段组分配字段。
在GET事件中,系统用两个不同的记录类型填充摘录数据集。
字段组FLIGHT_INFO的记录由五个字段组成:
SPFLI-CARRID、SPFLI-CONNID、SFLIGHT-FLDATE、SPFLI-CITYFROM和SPFLI-CITYTO。
前三个字段属于加前缀的字段组HEADER。
字段组FLIGHT_DATE的记录只由字段组HEADER的三个字段组成。
下图显示摘录数据集的结构:
6处理摘录数据集
下列主题说明如何