Show TOC Anfang des Inhaltsbereichs

Daten über interne Tabellen aufbereiten  Dokument im Navigationsbaum lokalisieren

Um Daten aus Datenbanktabellen in internen Tabellen abzuspeichern, verwendet man oft für jede gelesene Datenbanktabelle eine interne Tabelle, die einen Teil oder alle Spalten der Datenbanktabelle enthält. Dabei kann man jede Datenbanktabelle auf eine interne Tabelle flacher Struktur abbilden oder auch tiefe interne Tabellen mit geschachtelten Strukturen anlegen. Bei mehreren Tabellen mit flacher Struktur muss man mit redundanten Schlüsseln arbeiten um die Tabellen zu verknüpfen. Bei geschachtelten internen Tabellen können die Daten der Datenbanktabellen auch hierarchisch abgelegt werden.

Das Abspeichern von Daten in internen Tabellen und die nachfolgende Aufbereitung hat jedoch Nachteile bei sehr großen Datenmengen. Beim Verteilen sehr großer Datenmengen auf verschiedene interne Tabellen, kann der Laufzeitbedarf während der Aufbereitung recht hoch werden, da alle Tabellen einzeln abgearbeitet werden müssen. Da interne Tabellen unkomprimiert gespeichert werden, bedeuten große Datenmengen weiterhin einen hohen Speicherplatzbedarf. Gegebenenfalls muss das System den Datenbestand aus dem Arbeitsspeicher auslagern, was die Ausführung der Bearbeitung nochmals verlangsamt.

Datenaufbereitung mit flachen internen Tabellen

Beispiel

Das folgende Programm sei mit der logischen Datenbank F1S verknüpft.

REPORT demo_data_process_int_tables_1.

DATA: sum TYPE i, cnt TYPE i.

NODES: spfli, sflight, sbook.

DATA: tab_spfli   TYPE TABLE OF spfli,
      tab_sflight TYPE TABLE OF sflight,
      tab_sbook   TYPE TABLE OF sbook.

DATA: wa_spfli   LIKE LINE OF tab_spfli,
      wa_sflight LIKE LINE OF tab_sflight,
      wa_sbook   LIKE LINE OF tab_sbook.

START-OF-SELECTION.

GET spfli.
  APPEND spfli TO tab_spfli.

GET sflight.
  APPEND sflight TO tab_sflight.

GET sbook.
  APPEND sbook TO tab_sbook.

END-OF-SELECTION.

  SORT: tab_spfli   BY cityfrom cityto connid,
        tab_sflight BY fldate,
        tab_sbook   BY class smoker bookid.

  LOOP AT tab_spfli INTO wa_spfli.

    SKIP.
    WRITE: / wa_spfli-carrid,
             wa_spfli-connid,
             'from', (15) wa_spfli-cityfrom,
             'to',   (15) wa_spfli-cityto.
    ULINE.

    LOOP AT tab_sflight INTO wa_sflight
                        WHERE carrid = wa_spfli-carrid
                          AND connid = wa_spfli-connid.

      SKIP.
      WRITE: / 'Date:', wa_sflight-fldate.
      WRITE: 20 'Book-ID', 40 'Smoker', 50 'Class'.
      ULINE.

      sum = 0.
      cnt = 0.
      LOOP AT tab_sbook INTO wa_sbook
                        WHERE carrid = wa_sflight-carrid
                          AND connid = wa_sflight-connid
                          AND fldate = wa_sflight-fldate.

        WRITE: / wa_sbook-bookid UNDER 'Book-ID',
                 wa_sbook-smoker UNDER 'Smoker',
                 wa_sbook-class  UNDER 'Class'.

        sum = sum + wa_sbook-luggweight.
        cnt = cnt + 1.

      ENDLOOP.

      ULINE.
      WRITE: 'Number of bookings:  ', (3) cnt,
           / 'Total luggage weight:',
          (3) sum, wa_sbook-wunit.

    ENDLOOP.

  ENDLOOP.

Dieses Programm erzeugt die Liste in Beispiel für aufbereitete Daten.

Die Datenbeschaffung über GET-Ereignisse ist deutlich von der Sortierung getrennt. Struktur und der Inhalt der Datenbanktabellen werden vollständig auf drei interne Tabellen abgebildet. Nach der Sortierung werden die Tabelleninhalte ausgegeben. Die Schleifenstruktur entspricht genau der Struktur der SELECT-Schleifen des Beispiels unter Daten beim Lesen aufbereiten.

Datenaufbereitung mit geschachtelten internen Tabellen

Beispiel

Das folgende Programm sei mit der logischen Datenbank F1S verknüpft.

REPORT demo_data_process_int_tables_2.

DATA: sum TYPE i, cnt TYPE i.

NODES: spfli, sflight, sbook.

DATA: BEGIN OF wa_sbook,
        bookid     TYPE sbook-bookid,
        smoker     TYPE sbook-smoker,
        class      TYPE sbook-class,
        luggweight TYPE sbook-luggweight,
        wunit      TYPE sbook-wunit,
      END OF wa_sbook.

DATA: BEGIN OF wa_sflight,
        fldate TYPE sflight-fldate,
        sbook  LIKE TABLE OF wa_sbook,
      END OF wa_sflight.

DATA: BEGIN OF wa_spfli,
        carrid   TYPE spfli-carrid,
        connid   TYPE spfli-connid,
        cityfrom TYPE spfli-cityfrom,
        cityto   TYPE spfli-cityto,
        sflight  LIKE TABLE OF wa_sflight,
      END OF wa_spfli.

DATA tab_spfli LIKE TABLE OF wa_spfli.

START-OF-SELECTION.

GET spfli.
  REFRESH wa_spfli-sflight.

GET sflight.
  REFRESH wa_sflight-sbook.

GET sbook.
  MOVE-CORRESPONDING sbook TO wa_sbook.
  APPEND wa_sbook TO wa_sflight-sbook.

GET sflight LATE.
  MOVE-CORRESPONDING sflight TO wa_sflight.
  APPEND wa_sflight TO wa_spfli-sflight.

GET spfli LATE.
  MOVE-CORRESPONDING spfli TO wa_spfli.
  APPEND wa_spfli TO tab_spfli.

END-OF-SELECTION.
  SORT tab_spfli BY cityfrom cityto connid.
  LOOP AT tab_spfli INTO wa_spfli.
    SKIP.
    WRITE: / wa_spfli-carrid,
             wa_spfli-connid,
             'from', (15) wa_spfli-cityfrom,
             'to',   (15) wa_spfli-cityto.
    ULINE.
    SORT wa_spfli-sflight BY fldate.
    LOOP AT wa_spfli-sflight INTO wa_sflight.
      SKIP.
      WRITE: / 'Date:', wa_sflight-fldate.
      WRITE: 20 'Book-ID', 40 'Smoker', 50 'Class'.
      ULINE.
      SORT wa_sflight-sbook BY class smoker bookid.
      sum = 0.
      cnt = 0.
      LOOP AT wa_sflight-sbook INTO wa_sbook.
        WRITE: / wa_sbook-bookid UNDER 'Book-ID',
                 wa_sbook-smoker UNDER 'Smoker',
                 wa_sbook-class  UNDER 'Class'.
        sum = sum + wa_sbook-luggweight.
        cnt = cnt + 1.
      ENDLOOP.
      ULINE.
      WRITE: 'Number of bookings:  ', (3) cnt,
           / 'Total luggage weight:',
          (3) sum, wa_sbook-wunit.
    
ENDLOOP.
  ENDLOOP.

Dieses Programm erzeugt die Liste in Beispiel für aufbereitete Daten.

Während der GET-Ereignisse werden die Daten in die dreifach geschachtelte Tabelle tab_spfli mit der Untertabelle SFLIGHT und deren Untertabelle SBOOK eingelesen. Die Sortierung erfolgt in den einzelnen Schachtelungsebenen.

Diese Programmierung erfordert keine Schlüsselbeziehungen zwischen den internen Tabellen (keine WHERE-Bedingungen), ist aber komplexer als mit flachen Tabellen. Der interne Verwaltungsaufwand ist ebenfalls höher, was sich negativ auf den Speicherplatzbedarf und die Laufzeit auswirken kann.

 

 

Ende des Inhaltsbereichs