加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

提炼数据 数据处理

发布时间:2020-12-14 04:12:07 所属栏目:大数据 来源:网络整理
导读:文章转自 http://jiahongguang12.blog.163.com/blog/static/33466572007111791737818/ 在读取数据过程中提炼数据 提炼数据最直接的方法是使用select语句中相应的选项 摘录数据集 Field-groupsfg 该语句定义 了字段组 fg。 字段组将几 个字段组合到一个名称

文章转自 http://jiahongguang12.blog.163.com/blog/static/33466572007111791737818/

在读取数据过程中提炼数据

提炼数据最直接的方法是使用select语句中相应的选项

摘录数据集

Field-groups<fg>

该语句定义 了字段组 <fg>。 字段组将几 个字段组合到一个名称 下。出于可读 性的原因,

最好在报表 的开始处, 即声明段之 后定义字段 组。字段组不为 字段保留存 储空间,但

它包含现有 字段的指针 。用记录填充摘录数据 集时,这些 指针将决定 存储记录的 内容。

可以定义特殊途同归字段组header

语法

Field-groups header

填充摘录数 据集时,系 统将自动用 该字段组给 所有其它字 段组加上前 缀。这意味 着在摘录数 据集中,字 段组 <fg> 的记录总是 首先包含 HEADER 字段组的字 段。在给摘录数据集排 序时,系统 将使用这些 字段作为缺 省的排序关 键字。

FIELD-GROUPS: HEADER,FLIGHT_INFO,FLIGHT_DATE.

该语句链创 建了三个字 段组。

给字段组分 配字段

要确定将哪 个字段包含 进字段组中 ,请使用 INSERT 语句:

语法

INSERT <F1> ... <fn> INTO <fg>.

该语句定义 字段组 <fg> 的字段。在 给字段组分配字段以前 ,必须用 FIELD-GROUPS 语句定义字 段组 <fg>。 而对于字段 <fi>, 就只能使用 全局数据对 象。不能将 在子程序或功能模块中 定义的局部 数据对象分 配给字段组 。

INSERT 语句与 FIELD-GROUPS 语句一样, 既不保留存 储空间,也 不转换值。 您使用 INSERT 语句创建指向字段组 <fg> 中的字段 <fi> 的指针,因而定义了摘 录记录的结 构。

TABLES: SPFLI,SFLIGHT.

FIELD-GROUPS: HEADER,FLIGHT_DATE.

INSERT: SPFLI-CARRID SPFLI-CONNID SFLIGHT-FLDATE

??????? INTO HEADER,

??????? SPFLI-CITYFROM SPFLI-CITYTO

??????? INTO FLIGHT_INFO.

摘录数据集

要创建实际 的摘录数据 集,请使用 EXTRACT 语句:

语法

EXTRACT <fg>.

系统用报表 的第一个 EXTRACT 语句创建摘 录数据集并添加第一个 摘录记录。 并且每使用 一个后续的 EXTRACT 语句,就向 摘录数据集 填充另一个 摘取记录。

如果已经指 定,则每个 摘录记录都 包含字段组 HEADER 中的字段,并用它作为 排序关键字 ,其后紧跟 那些包含在 字段组 <fg> 中的字段。 在摘录过程 中,系统用相应字段中 的当前内容 填充摘录记 录。如果已经指 定,则每个 摘录记录都 包含字段组 HEADER 中的字段,并用它作为 排序关键字 ,其后紧跟 那些包含在 字段组 <fg> 中的字段。 在摘录过程 中,系统用相应字段中 的当前内容 填充摘录记 录。

一旦系统为 字段组 <fg> 处理了第一 条 EXTRACT 语句,摘录 数据集中的 相应摘录记 录的结构就 已固定。不 能再在字段 组 <fg> 和 HEADER 中插入新的 字段。如果 试图在后面修改其中一 个字段组并 在另一条 EXTRACT 语句中使用 它,将会发 生运行时错 误。通过使用不 同的字段组处理几次 EXTRACT 语句,就可 以用不同长 度和结构的 记录填充摘 录数据集。 由于在 EXTRACT 语句中首次 使用字段组 之前,可动 态地修改该 字段组,所 以摘录数据 集的优点是 不必在程序 一开始就确定字段组的 结构。

下列程序被 连接到逻辑 数据库 F1S。

REPORT SAPMZTST.

TABLES: SPFLI,FLIGHT_DATE.

INSERT: SPFLI-CARRID SPFLI-CONNID SFLIGHT-FLDATE

??????? INTO HEADER,

??????? SPFLI-CITYFROM SPFLI-CITYTO

??????? INTO FLIGHT_INFO.

START-OF-SELECTION.

GET SPFLI.

? EXTRACT FLIGHT_INFO.

GET SFLIGHT.

? EXTRACT FLIGHT_DATE.

该示例创建 三个字段组 。INSERT 语句给其中 的两个字段组分配字段 。在 GET 事件中,系 统用两个不 同的记录类 型填充摘录 数据集。字 段组 FLIGHT_INFO 的记录由五 个字段组成 :SPFLI-CARRID、 SPFLI-CONNID、 SFLIGHT-FLDATE、 SPFLI-CITYFROM 和 SPFLI-CITYTO。 前三个字段属于加前缀 的字段组 HEADER。 字段组 FLIGHT_DATE 的记录只由字段组 HEADER 的三个字段 组成。

处理摘录数据集

在开始处理 报表的摘录 数据集之前 ,必须先用 所有所需的 数据填充该 数据集。在 进行首次处 理操作之后 ,就不能再摘录任何记 录到数据集 中。

语法

LOOP.

? ...

? [AT FIRST | AT <fgi> [WITH <fgj>] | AT LAST.

??? ...

?? ENDAT.]

? ...

ENDLOOP.

语句 LOOP-ENDLOOP 终止创建报 表的摘录数 据集并在数据集的所有 记录上执行 循环。在每 个循环过程 中,系统将 读取一个摘 录记录并将 其数据值直 接放回到源 字段中。可 以连续执行 多个循环。

与内表不同 ,对于摘录 数据集不必 使用特殊的 工作区作为 接口

与内表上的 LOOP AT-ENDLOOP 循环不同, 在摘录数据集上不能使 用嵌套的 LOOP-ENDLOOP 循环,否则 将产生运行 时错误。在循环的语 句块中及处 理循环后,不允许再使 用 EXTRACT 语句。否则 将产生运行 时错误。

循环控制

如果只需对 数据集的某 些记录执行 一些语句, 则可使用控 制语句 AT 和 ENDAT。

系统将针对 AT 不同的选项 处理控制语 句之间的语 句块,如下所示 :

??? AT FIRST

系统将针对 数据集的第 一条记录执 行一次该语 句块。

??? AT <fgi> [WITH <fgj>]

如果当前读 取的摘录记 录的记录类 型是用字段 组 <fgi> 定义的,系 统就处理该 语句块。使 用 WITH <fgj> 选项时,在 摘录数据集中,字段组 <fgi> 当前读取的 记录后面必 须紧跟字段 组 <fgj> 的记录。

??? AT LAST

系统将针对 数据集的最 后一条记录 执行一次该 语句块。

关于如何使 用控制语句 AT 和 ENDAT 处理控制级 的信息,

下面的程序 被连接到逻 辑数据库 F1S。

REPORT SAPMZTST.

TABLES: SPFLI,

??????? SPFLI-CITYFROM SPFLI-CITYTO

??????? INTO FLIGHT_INFO.

START-OF-SELECTION.

GET SPFLI.

? EXTRACT FLIGHT_INFO.

GET SFLIGHT.

? EXTRACT FLIGHT_DATE.

END-OF-SELECTION.

? LOOP.

??? AT FIRST.

????? WRITE / 'Start of LOOP'.

????? ULINE.

??? ENDAT.

??? AT FLIGHT_INFO WITH FLIGHT_DATE.

????? WRITE: / 'Info:',

?????????????? SPFLI-CARRID,SPFLI-CONNID,SFLIGHT-FLDATE,

?????????????? SPFLI-CITYFROM,SPFLI-CITYTO.

??? ENDAT.

??? AT FLIGHT_DATE.

????? WRITE: / 'Date:',

??????????????? SPFLI-CARRID,SFLIGHT-FLDATE.

??? ENDAT.

??? AT LAST.

????? ULINE.

????? WRITE / 'End of LOOP'.

??? ENDAT.

? ENDLOOP.

创建并填充 摘录数据集 对应于 创建并填充 摘录数据集 (页5) 中的示例。 在事件 END-OF-SELECTION 中,数据检索已经结束 。系统在 LOOP-ENDLOOP 循环中读取 一次数据集 。

控制语句 AT FIRST 和 AT LAST 指导系统在 列表中各写 入一行及一 带下划线的 行,一次在 循环的开始 ,一次在循 环的结束。

控制语句 AT <fgi> 通知系统输 出与两种记录类型中的 每一个相对 应的字段。 由于有选项 WITH FLIGHT_DATE, 如果后面至 少跟了一条 字段组 FLIGHT_DATE 的记录,即 ,逻辑数据 库至少传送 一次航班的 日期,系统 就只输出字 段组 FLIGHT_INFO 的记录。

没有定义 FLIGHT_INFO 记录类型的 HEADER 区中的 SFLIGHT-FLDATE 字段的内容 ,这是由于逻辑数据库 在每个层次 结构的最后 都用空值填 充该层中的 所有字段。 该特征对排 序和处理摘 录数据集的 控制级很重 要。

给摘录数据集排序

和处理内表一样,也可以使用sort语句给摘录数据集排序

SORT [<order>][AS TEXT]

???? [BY <F1> [<order>][AS TEXT] ... <fn> [<order>][AS TEXT]].

下面的程序 被连接到逻 辑数据库 F1S。

REPORT SAPMZTST.

TABLES: SPFLI,

??????? SPFLI-CITYFROM SPFLI-CITYTO

??????? INTO FLIGHT_INFO.

START-OF-SELECTION.

GET SPFLI.

? EXTRACT FLIGHT_INFO.

GET SFLIGHT.

? EXTRACT FLIGHT_DATE.

END-OF-SELECTION.

? SORT DESCENDING.

? LOOP.

??? AT FIRST.

????? WRITE / 'Start of LOOP'.

????? ULINE.

??? ENDAT.

??? AT FLIGHT_INFO WITH FLIGHT_DATE.

????? WRITE: / 'Info:',SFLIGHT-FLDATE.

??? ENDAT.

??? AT LAST.

????? ULINE.

????? WRITE / 'End of LOOP'.

??? ENDAT.

? ENDLOOP.

除了 SORT DESCENDING 语句以外, 该示例与 读取摘录数据集 (页 7) 中的示例相 同。SORT 语句通知系 统在使用 LOOP-ENDLOOP 循环读取摘 录数据集之前,根据 HEADER 字段组的三 个字段按降 序给摘录数 据集排序。

处理控制级

通过使用 SORT 语句给摘录 数据集排序 ,可定义一 个控制级结构。

通过使用 SORT 语句给摘录 数据集排序 ,可定义一 个控制级结构。摘录数 据集的控制 级结构对应 于 HEADER 字段组中的 字段的顺序 。排序后, 可在 LOOP-ENDLOOP 循环中使用 AT 语句编写语 句块,使系 统只在控制中断时(即 ,控制级更 改时)才处 理它。

语法

AT NEW <f> | AT END OF <f>.

ENDAT.

如果字段 <f> 或当前摘录 记录中的排 序关键字的较高层字段 中包含其它 值,并且该 值与摘录数 据集前面的 记录(对于 AT NEW)或 后续记录( 对于 AT END)中 的值不同, 将产生控制 中断,并且 系统将处理 AT-ENDAT 中的语句块。字段 <f> 必须是 HEADER 字段组的一 部分。

如果摘录数 据集没有排 序,则系统 将忽略 AT-ENDAT 中的语句块。

在决定控制 中断时,系 统将忽略未 在摘录过程 中定义的 <f> 的字段内容

系统将一个 接一个地处 理循环中的 所有 AT...ENDAT 处理块。所以要当心它 们的顺序。 在控制级逻 辑内,请保 持排序顺序 。该顺序不 一定是 HEADER 字段组中的 字段的顺序,但可以是 在 SORT 语句中确定 的顺序。

REPORT SAPMZTST.

DATA: T1(4),T2 TYPE I.

FIELD-GROUPS: HEADER,TEST.

INSERT T2 T1 INTO HEADER.

T1 ='AABB'. T2 = 1. EXTRACT TEST.

T1 ='BBCC'. T2 = 2. EXTRACT TEST.

T1 ='AAAA'. T2 = 2. EXTRACT TEST.

T1 ='AABB'. T2 = 1. EXTRACT TEST.

T1 ='BBBB'. T2 = 2. EXTRACT TEST.

T1 ='BBCC'. T2 = 2. EXTRACT TEST.

T1 ='AAAA'. T2 = 1. EXTRACT TEST.

T1 ='BBBB'. T2 = 1. EXTRACT TEST.

T1 ='AAAA'. T2 = 3. EXTRACT TEST.

T1 ='AABB'. T2 = 1. EXTRACT TEST.

SORT BY T1 T2.

LOOP.

? AT FIRST.

??? WRITE 'Start of LOOP'.

??? ULINE.

? ENDAT.

? AT NEW T1.

??? WRITE / '?? New T1:'.

? ENDAT.

? AT NEW T2.

??? WRITE / '?? New T2:'.

? ENDAT.

? WRITE: /14 T1,T2.

? AT END OF T2.

??? WRITE / 'End of T2'.

? ENDAT.

? AT END OF T1.

??? WRITE / 'End of T1'.

? ENDAT.

? AT LAST.

??? ULINE.

? ENDAT.

ENDLOOP.

该程序创建 了一个只包 含 HEADER 字段组中字 段的样本摘录。在排序 过程之后, 摘录数据集 有几个对于 控制级 T1 和 T2 的控制中断,

计算序号和 合计

在使用 LOOP-ENDLOOP 读取已排序 的摘录数据 集时,可以访问两个自 动生成的字 段 CNT(<f>) 和 SUM(<g>), 这些字段提 供了不同值 的序号或数 字字段的合 计。系统将 在控制级的 最后以及读取 数据集的最 后一个记录 后填充这些字段,

??? CNT(<f>)

如果 <f> 是 HEADER 字段组的非 数字字段, 并且系统是 根据 <f> 给摘录数据集排序的, 则 CNT(<f>) 包含了在控 制级中或在 整个数据集 中分别设定 的不同值 <f> 的序号。

??? SUM(<g>)

如果 <g> 是摘录数据 集的数字字 段,SUM (<g>) 将包含控制 级或整个数 据集中 <g> 的值的合计。可以在控制 中断产生之 前,在 AT END OF 后的过程块 中访问这些 字段或在读 取整个数据 集后,在 AT LAST 后的过程块 中访问这些 字段。

只能在给数 据集排序后 才能访问 CNT(<f>) 和 SUM(<g>) 字段。

REPORT SAPMZTST.

DATA: T1(4),TEST.

INSERT T2 T1 INTO HEADER.

T1 ='AABB'. T2 = 1. EXTRACT TEST.

T1 ='BBCC'. T2 = 2. EXTRACT TEST.

T1 ='AAAA'. T2 = 2. EXTRACT TEST.

T1 ='AABB'. T2 = 1. EXTRACT TEST.

T1 ='BBBB'. T2 = 2. EXTRACT TEST.

T1 ='BBCC'. T2 = 2. EXTRACT TEST.

T1 ='AAAA'. T2 = 1. EXTRACT TEST.

T1 ='BBBB'. T2 = 1. EXTRACT TEST.

T1 ='AAAA'. T2 = 3. EXTRACT TEST.

T1 ='AABB'. T2 = 1. EXTRACT TEST.

SORT BY T1 T2.

LOOP.

? WRITE: /20 T1,T2.

? AT END OF T2.

??? ULINE.

??? WRITE: 'Sum:',20 SUM(T2).

??? ULINE.

? ENDAT.

? AT END OF T1.

??? WRITE: 'Different values:',(6) CNT(T1).

? ULINE.

? ENDAT.

? AT LAST.

??? ULINE.

??? WRITE: 'Sum:',20 SUM(T2),

?????????? / 'Different values:',(6) CNT(T1).

? ENDAT.

ENDLOOP.

该程序创建 只包含 HEADER 字段组中字 段的样本摘 录。排序后,系统将在 每个控制级 的最后和循 环的最后输 出数据集的 内容,不同 的 T1 字段的序号 以及 T2 字段的合计 :

使用摘录数 据集提炼数

下面的报表 被连接到逻 辑数据库 F1S。

REPORT SAPMZTST.

TABLES: SPFLI,SFLIGHT,SBOOK.

FIELD-GROUPS: HEADER,FLIGHT_BOOKING.

INSERT:

? SPFLI-CITYFROM SPFLI-CITYTO

? SPFLI-CONNID SFLIGHT-FLDATE

? SBOOK-CLASS SBOOK-SMOKER SBOOK-BOOKID INTO HEADER,

? SPFLI-CARRID????????????????????????? INTO FLIGHT_INFO,

? SBOOK-LUGGWEIGHT SBOOK-WUNIT????????? INTO FLIGHT_BOOKING.

START-OF-SELECTION.

GET SPFLI.

? EXTRACT FLIGHT_INFO.

GET SFLIGHT.

GET SBOOK.

? EXTRACT FLIGHT_BOOKING.

END-OF-SELECTION.

? SORT.

? LOOP.

??? AT FLIGHT_INFO.

????? SKIP.

????? WRITE: / SPFLI-CARRID,

?????????????? SPFLI-CONNID,

?????????????? 'from',(15) SPFLI-CITYFROM,

?????????????? 'to',?? (15) SPFLI-CITYTO.

????? ULINE.

??? ENDAT.

??? AT NEW SFLIGHT-FLDATE.

??????? SKIP.

??????? WRITE: / 'Date:',SFLIGHT-FLDATE.

??????? WRITE: 20 'Book-ID',40 'Smoker',50 'Class'.

??????? ULINE.

??? ENDAT.

??? AT FLIGHT_BOOKING.

??????? WRITE: / SBOOK-BOOKID UNDER 'Book-ID',

???????????????? SBOOK-SMOKER UNDER 'Smoker',

???????????????? SBOOK-CLASS? UNDER 'Class'.

??? ENDAT.

??? AT END OF SFLIGHT-FLDATE.

????? ULINE.

????? WRITE: 'Number of bookings:? ',(3) CNT(SBOOK-BOOKID),

?????????? / 'Total luggage weight:',

????????????? SUM(SBOOK-LUGGWEIGHT),SBOOK-WUNIT.

??? ENDAT.

? ENDLOOP.

该系统创建 三个字段组 ,并用几个 字段填充。 在 GET 事件中,由于有 EXTRACT 语句,所以 将填充摘录 数据集。请 注意,对于 GET SFLIGHT 事件,没有 EXTRACT 语句,这是 由于所需的 字段 SFLIGHT_FLDATE 是 HEADER 字段组的一 部分,所以 将自动地为每个子事件 GET SBOOK 摘录这些数 据。

在检索数据 之后,由于 使用了 SORT 语句,系统 将终止创建数据集,并 且按 HEADER 排序关键字 给数据集排 序。在 LOOP-ENDLOOP 循环中,通 过执行几个 AT-ENDAT 块并使用字 段 CNT(...) 和 SUM(...), 系统将排序 后的摘录数 据集写入输出列表。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读