Daten über interne Tabellen aufbereiten
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 muß 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 muß das System den Datenbestand aus dem Arbeitsspeicher auslagern, was die Ausführung der Bearbeitung nochmals verlangsamt.
Datenaufbereitung mit flachen internen Tabellen
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
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.