Zugriff auf dynamische Struktur

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).

Zugriff auf dynamische Struktur

Postby Helga5133 » Tue Mar 29, 2011 3:54 pm

Hallo zusammen,

ich erzeuge dynamisch zur Laufzeit eine itab und ein dazugehörige Struktur.
Per 'READ_TABLE' lese ich aus der itab einen bestimmten Datensatz und schreibe diesen in die Struktur.
Bis hierher funktioniert's auch.
Dann möchte ich auf best. Felder der Struktur zugreifen, um div. Prüfungen durchzuführen.

Hier bekomme ich aber den Fehler, das meine definierte Struktur keine Struktur besitzt und man somit nicht auf Feld XYZ zugreifen kann.
Wie könnte ich das lösen?

Anbei der Code.

Besten Dank schonmal euch allen.

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. FORM create_object  USING    p_dbtab      TYPE tabname
  2.                                              p_key_ds    TYPE .
  3.  
  4.   DATA: r_strdescr TYPE REF TO cl_abap_structdescr,
  5.             r_tabdescr TYPE REF TO cl_abap_tabledescr,
  6.  
  7.             r_itab     TYPE REF TO data,
  8.             r_struc    TYPE REF TO data.
  9.  
  10.  field-symbols:   <struc>     TYPE ANY,
  11.                         <itab>      TYPE ANY TABLE.
  12.  
  13.   r_strdescr ?= cl_abap_typedescr=>describe_by_name( p_dbtab ).
  14.  
  15.   r_tabdescr = cl_abap_tabledescr=>create( p_line_type = r_strdescr ).
  16.  
  17.   CREATE DATA r_itab TYPE HANDLE r_tabdescr.
  18.   ASSIGN r_itab->* TO <itab>.
  19.  
  20.   CREATE DATA r_struc TYPE HANDLE r_strdescr.
  21.   ASSIGN r_struc->* TO <struc>.
  22.  
  23.   SELECT * FROM (p_dbtab) INTO TABLE <itab>.
  24.  
  25.    if sy-subrc = 0.
  26.      READ TABLE <itab> ASSIGNING <struc> WITH KEY ('KEY_DS') = p_key_ds.
  27.         if sy-subrc = 0.
  28.           if <struc>-var1 = 'XYZ'         "[b]HIER TRITT DER FEHLER AUF[/b]
  29.               .....
  30.           endif.
  31.        endif.
  32.    endif.
  33.  
  34.  
GeSHi ©
Helga5133
..
..
 
Posts: 72
Joined: Wed Nov 25, 2009 5:29 pm

Re: Zugriff auf dynamische Struktur

Postby Silke1341 » Tue Mar 29, 2011 4:13 pm

Hallo Volker,

um auf Felder einer, dem Compiler, unbekannten Struktur zuzugreifen, benötigst Du den Befehl ASSIGN [COMPONENT]...

PS:
der Fehler tritt auf, weil der Compiler prüft, ob es ein Feld 'XYZ' zu <struct> gibt, die jedoch den (korrekten) Typ ANY hat. Um welche Struktur es sich handelt, ist jedoch erst zur Laufzeit bekannt.
Silke1341
.....
.....
 
Posts: 1985
Joined: Thu Aug 19, 2004 3:20 pm

Re: Zugriff auf dynamische Struktur

Postby Ilja583 » Tue Mar 29, 2011 4:19 pm

Hallo Volker,

wie dynamisch ist denn der Zugriff auf das Feld?

Wenn du den Feldnamen auch nur dynamisch zur Verfügung hast (im feld fieldname ), solltest du
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. ASSIGN component fieldname of structure <row> TO <field>.
GeSHi ©
verwenden.

Wenn der Feldname fest ist auch wenn du versch. Tabellen übergibst, kannst du sogar
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. ASSIGN component 'MATNR' of structure <row> TO <field>.
GeSHi ©
benutzen.

Wenn du eine ganze Reihe von Feldern hast von denen du weißt, dass sie in der dynamischen Tabelle vorkommen, finde ich es am übersichtlichsten dir eine Struktur anzulegen, die genau diese Felder enthält und dann mittels
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. move-corresponding <row> to struktur.
GeSHi ©
in diese Struktur zu schieben. Danach kannst du wieder mit benannten Feldnamen arbeiten
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. struktur-feldname = ...
GeSHi ©
Ilja583
.....
.....
 
Posts: 1372
Joined: Wed Jan 08, 2003 3:00 pm

Re: Zugriff auf dynamische Struktur

Postby Helga5133 » Tue Mar 29, 2011 4:32 pm

Besten Dank euch beiden!

Funktioniert :D

Schönen Tag noch!

Gruß
Volker
Helga5133
..
..
 
Posts: 72
Joined: Wed Nov 25, 2009 5:29 pm


Return to ABAP Objects®

Who is online

Users browsing this forum: No registered users and 10 guests

cron