Wie Sie sehen, ist es wichtig zu erkennen, dass fiir die dynamischen
Angaben in einer Anweisung, die ja erst zur Laufzeit ausgewertet werden,
die potenziellen Fehlersituationen vorhergesehen und entsprechend
abgefangen werden miissen
3.1.4 Dynamische Erzeugung eines Datenobjekts
beliebigen Typs
Aufgabenstellung
Haufig kommt es vor, dass wahrend der Laufzeit Datenobjekte bendtigt
werden, deren Typ vor der Laufzeit noch nicht bekannt ist. Will man zum
Beispiel den Inhalt einer dynamisch spezifizierten Datenbanktabelle in
eine interne Tabelle schreiben, muss wahrend der Laufzeit eine interne
Tabelle mit dem richtigen Zeilentyp angelegt werden. In Listing 3.4 wird
dieses Problem adressiert. Das Programm soll nach dem Start den Namen
einer Datenbanktabelle entgegennehmen, dynamisch eine interne
Tabelle gleicher Struktur erzeugen und deren Inhalt ausgeben.
Vorgehensweise
» Es wird ein Feldsymbol vom Typ ANY TABLE bendtigt, das spater die
dynamisch erstellte Tabelle reprasentiert. Die beiden weiteren Feld-
symbole in Listing 3.4 werden zur Ausgabe der internen Tabelle bend-
tigt und hier nicht weiter erlautert. Die Erklarung fir den Ausgabeme-
chanismus finden Sie in Abschnitt 3.1.5.
» Danach legen Sie mittels CREATE DATA ein Datenobjekt an, das auf den
dynamisch spezifizierten Typ zeigt. Hier wird wiederum die Klammer-
syntax eingesetzt. Die Variable ptrInternalTable ist jetzt vom Typ
»Zeiger auf eine interne Tabelle der Struktur, die im Datenobjekt pa_
Struc steht«,
> Um mit dem so erzeugten Datenobjekt arbeiten zu kénnen, miissen
Sie den Zeiger mit dem Dereferenzierungsoperator ->* dereferenzie-
ren und dem Feldsymbol zuweisen. Bei dynamisch erzeugten Daten-
objekten ist die Dereferenzierung die einzige Méglichkeit, um auf den
Inhalt zuzugreifen.
> Bedingt durch die dynamische Typangabe gehen wir von einigen
Annahmen fiir die Verarbeitung aus, so dass wir eine geeignete Aus-
nahmebehandlung einbauen missen, die in der Erlauterung zur Lésung
diskutiert wird.
Dynamische und generische Programmierung
105Codebeispiel
Wenn nee ee eee *
*& Report Z_BP_DYNAMIC_INTERNAL_TABLE *
*& . a
REPORT Z_BP_DYNAMIC_INTERNAL_TABLE.
PARAMETERS :
pa_Struc TYPE C LENGTH 30.
DATA:
oError TYPE REF TO cx_root,
txtError TYPE STRING,
ptrInternalTable TYPE REF TO DATA.
FIELD-SYMBOLS :
TYPE ANY TABLE,
‘TYPE DATA,
TYPE DATA,
TRY.
CREATE DATA ptrInternalTable
TYPE TABLE OF (pa_Struc).
ASSIGN ptrInternalTable->* T0 .
SELECT *
FROM (pa_Struc)
INTO TABLE .
LOOP AT ASSIGNING .
DO.
ASSIGN COMPONENT sy-index
OF STRUCTURE TO .
IF sy-subre <> 0.
RXIT.
ENDIF.
WRITE: .
ENDDO. " Felder abarbeiten
SKIP.
ENDLOOP. " Zeilen abarbeiten
406 — Lisungskonzepte fir die tagliche Programmierarbeit mit ABAPCATCH cx_sy_create_data_error INTO oError.
txtError = ofrror->get_text( ).
WRITE: / 'Ausnahme: ', txtError.
CATCH cx_sy_dynamic_osql_semantics INTO oError.
txtError = oError->get_text( ).
WRITE: / ‘Ausnahme: ', txtError.
ENDTRY.
isting 3.4 Dynamische Angabe des Datentyps
Erlauterung zur Lésung
Auch hier wird die dynamische Komponente wieder iiber die Klammer-
syntax an die entsprechende Anweisung — hier CREATE DATA - libergeben
Die folgenden Zeilen sind fur die eigentliche Arbeit verantwortlich:
CREATE DATA ptrInternalTable TYPE TABLE OF
(pa_struc).
ASSIGN ptrInternalTable->* TO .
Wie bereits erwahnt, wird der Zeiger ptrInternalTable durch die CRE-
ATE DATA-Anweisung dazu gebracht, auf ein initiales Datenobjekt von
dem Typ zu zeigen, der durch (pa_struc) aufgelést wird.
Dabei entsteht gleichzeitig das erste potenzielle Ausnahmeszenario: Wird
hier ein Typ angegeben, der nicht existiert, wird die Ausnahme CX_SY_
CREATE_DATA_ERROR ausgelést, die wir entsprechend abfangen. Des
Weiteren kann es natiirlich sein, dass wir zwar einen vorhandenen Typen
spezifiziert haben, es sich dabei jedoch um keine Datenbanktabelle han-
delt. In diesem Fall wirde unsere SELECT-Anweisung die Ausnahme CX_
SY_DYNAMIC_OSQL_SEMANTICS auslésen, die wir ebenfalls abfangen.
Das Programm erzeugt bei den verschiedenen Eingabeszenarien die fol-
genden Bildschirmausgaben
> Bei der Eingabe des Typs SCARR, der sowohl ein Zeilentyp als auch
eine Datenbanktabelle ist, lauft das Programm korrekt ab und liefert
die folgende Ausgabe:
000 AA American Airlines USD http://www.aa.com
000 AB Air Berlin DEM http://www. airberlin.de
000 AC Air Canada CAD http: //www.aircanada.ca
000 AF Air France FF | http://www.airfrance. ir
000 AZ Alitalia TTL http://www.alitalia,it
Dynamische und generische Programmierung 407