天天看點

提煉資料 資料處理

文章轉自 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_INFO, 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, SFLIGHT.

FIELD-GROUPS: HEADER, FLIGHT_INFO, 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, SFLIGHT.

FIELD-GROUPS: HEADER, FLIGHT_INFO, 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.

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 , SPFLI-CONNID, 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, SFLIGHT.

FIELD-GROUPS: HEADER, FLIGHT_INFO, 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.

END-OF-SELECTION.

  SORT DESCENDING.

  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 , SPFLI-CONNID, 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), 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.

  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_INFO, 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(...), 系統将排序 後的摘錄數 據集寫入輸出清單。

繼續閱讀