Tiefe, dynamische Struktur korrekt referenzieren

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
13 Beiträge • Seite 1 von 1
13 Beiträge Seite 1 von 1

Tiefe, dynamische Struktur korrekt referenzieren

Beitrag von ABAP_User (Specialist / 146 / 20 / 0 ) »
Hallo!

Ich habe ein Problem beim Kopieren einer tiefen, dynamischen Struktur, da die Werte nicht korrekt referenziert werden:

Code: Alles auswählen.

FIELD-SYMBOLS: <lt_table_structure> TYPE table.
FIELD-SYMBOLS: <ls_table_structure> TYPE any.
FIELD-SYMBOLS: <value>              TYPE ANY.

"aus einer Customizing-Tabelle lese ich die tiefe Felkomponente und weise sie <lt_table_structure> zu.
ASSIGN COMPONENT ls_mapfld-component OF STRUCTURE gs_partner TO <lt_table_structure>.  
                      
LOOP AT <lt_table_structure> ASSIGNING <ls_table_structure>.
   
" aus meiner Customizing-Tabelle bestimme ich nun das entsprechende Feld innerhalb tiefen Struktur       
  ASSIGN COMPONENT ls_mapfld-fieldname OF STRUCTURE <ls_table_structure> TO <value>.
        
ENDLOOP.

<value> wird als BSP-Komponente an der Oberfläche angezeigt. Ändere ich diese und speichere ich, sind die tiefen Komponenten der Struktur gs_partner noch die alten Werte.


Wie also referenziere ich die Variable <value> korrekt auf ein einzelnes Feld einer tiefen Struktur? Wäre euch für Hinweise dankbar!

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Tiefe, dynamische Struktur korrekt referenzieren

Beitrag von Lucyalison (Specialist / 262 / 51 / 26 ) »
Das sieht, was die Referenz anbelangt, für mich eigentlich gut aus. Hast Du denn überprüft ob <value> dann auch wirklich 'assigned' ist? Also klappt der Zugriff mit dem Feldnamen aus der Customizingtabelle sicher?

Gruss
Nicola

Re: Tiefe, dynamische Struktur korrekt referenzieren

Beitrag von ABAP_User (Specialist / 146 / 20 / 0 ) »
Hallo,

danke für deine Antwort. Erfolgreich assigned wird es schon. Wenn die BSP aufgebaut wird,
so wird auch der Wert korrekt ausgelesen und an der Oberfläche dargestellt.
Ändere ich nun den Wert an der Oberfläche meiner BSP, so wird er bei einfachen Datentypen
übernommen, bei komplexen jedoch nicht.
Möglicherweise ist das auch ein BSP Problem??

Code: Alles auswählen.

<tr>
<td class="column1"><%= ls_display_order-description%></td>
<%
      READ TABLE lt_mapfld INTO ls_mapfld WITH KEY fieldname = ls_display_order-field.
      IF sy-subrc = 0."Feld ist von einem komplexen Datentypen --> Wert wird nicht in gs_partner übernommen


        ASSIGN COMPONENT ls_mapfld-component OF STRUCTURE gs_partner TO <lt_table_structure>.

        READ TABLE <lt_table_structure> ASSIGNING <ls_table_structure> INDEX 1.

        ASSIGN COMPONENT ls_mapfld-fieldname OF STRUCTURE <ls_table_structure> TO <value>.

      ELSE."Feld ist von einem einfachen Datentypen --> Wert wird in gs_partner übernommen

        ASSIGN COMPONENT ls_display_order-field OF STRUCTURE gs_partner TO <value>. 

      ENDIF.

%>
<td class="colIntake2"><%= <value>%></td>
<td class="column3">&nbsp;</td>
<td class="column_sep">&nbsp;</td>

Grüße

Re: Tiefe, dynamische Struktur korrekt referenzieren

Beitrag von Lucyalison (Specialist / 262 / 51 / 26 ) »
Hmmm - mit BSP kenne ich mich leider nicht aus, vielleicht magst Du die Frage im BSP-Forum posten?
Sorry - ich hätte Dir gerne weitergeholfen.

Viele Grüsse
Nicola

Re: Tiefe, dynamische Struktur korrekt referenzieren

Beitrag von ABAP_User (Specialist / 146 / 20 / 0 ) »
Hallo!

Jetzt muss ich nochmals ein Update bringen, beim oben dargestellten Code waren meine Felder tatsächlich nicht assigned.
Bei mir lief es allerdings auf keinen Fehler, da noch mein altes Coding durchlaufen wurde. Das sieht wie folgt aus:

Code: Alles auswählen.

        CREATE DATA ls_table_line TYPE (ls_mapfld-substructure).
        ASSIGN ls_table_line->* TO <fs_table_line>.

        ASSIGN COMPONENT ls_mapfld-component OF STRUCTURE gs_partner TO <lt_table_structure>.
        ASSIGN ls_table_line->* TO <ls_table_structure>.

        READ TABLE <lt_table_structure> INTO <ls_table_structure> INDEX 1.

        ASSIGN COMPONENT ls_mapfld-fieldname OF STRUCTURE <ls_table_structure> TO <value>.
Gerade hier habe ich aber eben das Problem, dass der Wert beim Laden zwar Assigned wird, Änderungen an der
Variablen <value> jedoch nicht in gs_partner übernommen werden.

Könnt ihr hier das Problem erkennen?

Re: Tiefe, dynamische Struktur korrekt referenzieren

Beitrag von Pyro (Specialist / 121 / 14 / 18 ) »
Guten Morgen,

ich habe das Coding jetzt nur überflogen, aber meiner Meinung nach fehlt bei einem

Code: Alles auswählen.

READ TABLE <lt_table_structure> INTO <ls_table_structure> INDEX 1.
ASSIGN COMPONENT ls_mapfld-fieldname OF STRUCTURE <ls_table_structure> TO <value>.
nach der Änderung von <value> noch ein update/modify der lt. Möglich wäre hier natürlich auch, <ls_table_structure> vom type any zu machen und mit

Code: Alles auswählen.

READ TABLE <lt_table_structure> ASSIGNING <ls_table_structure> INDEX 1.
ASSIGN COMPONENT ls_mapfld-fieldname OF STRUCTURE <ls_table_structure> TO <value>.
dann direkt auf die lt-Zeile zu referenzieren und somit über die lt direkt in der gs-(tabellenspalte) zu ändern.

Gruß
Pyro

Re: Tiefe, dynamische Struktur korrekt referenzieren

Beitrag von ABAP_User (Specialist / 146 / 20 / 0 ) »
Hi!

Bin mir jetzt nicht sicher, ob ich dich richtig verstanden habe. Aber so wie ich dich verstanden habe, wäre die einzige Änderung in der vorletzten Zeile. INTO --> ASSIGNING.
Funktioniert so leider noch nicht bei mir. Oder habe ich das falsch verstanden?

Code: Alles auswählen.

        CREATE DATA ls_table_line TYPE (ls_mapfld-substructure).
        ASSIGN ls_table_line->* TO <fs_table_line>.

        ASSIGN COMPONENT ls_mapfld-component OF STRUCTURE gs_partner TO <lt_table_structure>.
        ASSIGN ls_table_line->* TO <ls_table_structure>.

        READ TABLE <lt_table_structure> ASSIGNING <ls_table_structure> INDEX 1.

        ASSIGN COMPONENT ls_mapfld-fieldname OF STRUCTURE <ls_table_structure> TO <value>.
LG abap_user

Re: Tiefe, dynamische Struktur korrekt referenzieren

Beitrag von Pyro (Specialist / 121 / 14 / 18 ) »
So, ich bin das grad nochmal durchgegangen:

du hast eine Struktur und in einer Spalte dieser Struktur hast du eine interne Tabelle, in welcher du Daten hast, welche du Bearbeiten willst?
Zuerst musst du über

Code: Alles auswählen.

 FIELD-SYMBOLS: <lt_table_structure> TYPE STANDARD TABLE.
 ASSIGN COMPONENT ls_mapfld-component OF STRUCTURE gs_partner TO <lt_table_structure>.
das Feldsymbol auf die entsprechende Tabelle in der Struktur zeigen lassen (bereits erledig) --> Hier muss geprüft werden, ob in ls_mapfld-component die richtige Spalte steht und das Feldsymbol korrekt zugewiesen wird.

Danach musst du ein anderes Feldsymbol auf die zu ändernde Zeile in dieser itab zeigen lassen:

Code: Alles auswählen.

READ TABLE <lt_table_structure> ASSIGNING <ls_table_structure> INDEX 1.
->erledigt --> auch hier prüfen, ob das Feldsymbol zugewiesen wurde. Das funktioniert auf diesem Weg logischerweise nur, wenn bereits min. eine Zeile in <lt_table_structure> existiert.

Anschließend musst du ein weiteres Feldsymbol auf das zu ändernde Feld in dieser gerade zugewiesenen Struktur zuweisen:

Code: Alles auswählen.

ASSIGN COMPONENT ls_mapfld-fieldname OF STRUCTURE <ls_table_structure> TO <value>.
Auch hier solltest du prüfen, ob in ls_mapfld-fieldname der richtige Feldname steht und das FS <value> erfolgreich zugewiesen wurde.

Also nochmal zusammengefasst brauchst du nur dieses Coding:

Code: Alles auswählen.

 FIELD-SYMBOLS: <lt_table_structure> TYPE STANDARD TABLE.
 ASSIGN COMPONENT ls_mapfld-component OF STRUCTURE gs_partner TO <lt_table_structure>.

READ TABLE <lt_table_structure> ASSIGNING <ls_table_structure> INDEX 1.

ASSIGN COMPONENT ls_mapfld-fieldname OF STRUCTURE <ls_table_structure> TO <value>.
Wenn jetzt <value> erfolgreich zugewiesen wurde kann hierüber das entsprechende Feld in der Itab in der Struktur geändert werden.

Gruß
Pyro

Re: Tiefe, dynamische Struktur korrekt referenzieren

Beitrag von ABAP_User (Specialist / 146 / 20 / 0 ) »
Hallo Pyro,

das sieht alles sehr einleuchtend aus. Für die ausführliche Erläuterung
bin ich dir auch sehr dankbar, allerdings funktioniert es noch immer nicht.
Dabei wird <value> beim Laden der Seite erfolgreich zugewiesen und an der Oberfläche angezeigt.
Änderungen an <value> bewirken jedoch keine Änderungen an den Tabellenkomponenten meiner Struktur.

Wenn ich mir zum Zeitpunkt OnInputProcessing mittels folgendem Coding die Formfeldwerte abgreife,
so ist die Änderung zu sehen. gs_partner-[ls_mapfld-fieldname] hat den neuen Wert.

Code: Alles auswählen.

DATA lt_fields         TYPE tihttpnvp.

* Get fields from Layout
    CALL METHOD request->get_form_fields
      CHANGING
        fields = lt_fields.
Allerdings nutze ich diese Methode nicht. gs_partner ist bei mir als Seitenattribut definiert,
die Änderungen werden direkt an gs_partner vorgenommen.

Vermutlich liegt der Fehler in meinem BSP-Coding, oder?

Viele Grüße
abap_user

Re: Tiefe, dynamische Struktur korrekt referenzieren

Beitrag von Pyro (Specialist / 121 / 14 / 18 ) »
Hallo abap_user,

Ich hatte leider übersehen, dass du das via bsp machst. Mein Conding war jetzt eher allgemein und nicht direkt im Bezug auf bsp. Wird der Wert nur nicht auf der Oberfläche angezeigt oder wird die Änderung auch im Debugger in der Tabelle schon nicht angezeigt? Hast du dir das im Debugger schon angesehen?

Gruß Pyro

Re: Tiefe, dynamische Struktur korrekt referenzieren

Beitrag von ABAP_User (Specialist / 146 / 20 / 0 ) »
Hallo Pyro,

im Debugger habe ich mir es schon angesehen. Zum Zeitpunkt OnInputProcessing wird die Änderung schon nicht in der Tabelle angezeigt...

Gruß
abap_user

Re: Tiefe, dynamische Struktur korrekt referenzieren

Beitrag von ABAP_User (Specialist / 146 / 20 / 0 ) »
Keiner eine Idee? Worin unterscheidet sich denn ASSIGN COMPONENT...TO von ASSIGN...TO? Und fehlt nicht evtl. noch eine Zuweisung des neuen Werts zu <value>?

Re: Tiefe, dynamische Struktur korrekt referenzieren

Beitrag von Pyro (Specialist / 121 / 14 / 18 ) »
Hallo Abap_user,

durch [ ASSIGN COMPONENT TO ] wird die angegebene Spalte einer Struktur dem Feldsymbol zugewiesen, durch [ASSIGN .. TO] erhält das Feldsymbol eine Referenz auf die komplette Struktur.

Ich konnte jetzt leider aus deiner Antwort noch nicht ganz herauslesen, ob der geänderte Wert im Debugger in der Itab geändert wurde.
Also:
1. Funktioniert der Datentransport von Oberfläche zu der Codingstelle?
2. Funktioniert die Zuweisung des <fs>? Was passiert, wenn man das <fs> nach Zuweisung im Debugger verändert -> wird der Wert in der Itab der entsprechenden Struktur verändert?
3. Falls Punkt 1 und 2 keine Fehler aufzeigen: Funktioniert der Transport zurück auf die Oberfläche?

Gruß
Pyro

Seite 1 von 1

Vergleichbare Themen

3
Antw.
4629
Views
Tiefe Struktur
von Wigi » 19.02.2013 21:58 • Verfasst in ABAP® für Anfänger
2
Antw.
2012
Views
Zeiger auf tiefe Struktur?
von ABAP_User » 15.08.2011 20:45 • Verfasst in ABAP® für Anfänger
0
Antw.
569
Views
Tiefe Struktur bei Feldcatalog
von autohandel7 » 26.01.2016 18:55 • Verfasst in ABAP® für Anfänger
4
Antw.
2265
Views
Tiefe Struktur bei Feldcatalog
von autohandel7 » 26.01.2016 18:56 • Verfasst in ABAP® für Anfänger
1
Antw.
3042
Views
Feldkatalog für tiefe Struktur?
von sebby » 16.12.2013 17:47 • Verfasst in Dialogprogrammierung

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

SELECT CHAR16 in CHAR12-Feld
vor 2 Stunden von Patrick1982 gelöst 5 / 62
alv_grid aktualisieren
vor 7 Stunden von Egzon gelöst 4 / 83

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

SELECT CHAR16 in CHAR12-Feld
vor 2 Stunden von Patrick1982 gelöst 5 / 62
alv_grid aktualisieren
vor 7 Stunden von Egzon gelöst 4 / 83

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 4 Wochen von Lucyalison 1 / 134
Group Items auf einer Filterbar
vor 5 Wochen von Bright4.5 1 / 170