Sie sind auf Seite 1von 5
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 105 Codebeispiel 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 ABAP CATCH 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

Das könnte Ihnen auch gefallen