Struktur dynamisch auslesen / schreiben

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

Struktur dynamisch auslesen / schreiben

Beitrag von Ingo (ForumUser / 46 / 20 / 0 ) »
Moin moin,

ich möchte mithilfe des BAPIs "BAPI_USER_CHANGE" Benutzerdaten zu einem neuen Benutzer transferieren. Das Ganze soll möglichst über eine Klasse wiederverwendbar und automatisch laufen. Die Schnittstelle hat für die unterschiedlichen Registerkarten in der Transaktion SU01 jeweils eigene Parameter, z.B. für Adressen:

*" VALUE(ADDRESS) LIKE BAPIADDR3 STRUCTURE BAPIADDR3 OPTIONAL
*" VALUE(ADDRESSX) LIKE BAPIADDR3X STRUCTURE BAPIADDR3X OPTIONAL

Felder und Werte stehen hier z.B. in ADDRESS. Möchte man diese ändern, muss zusätzlich der gleiche Feldname in ADDRESSX mit einem Flag ('X') versehen werden. Die Feldnamen sind in dieser Struktur alle gleich. Es könnte natürlich über den Report an die Klasse mit entsprechender Signatur weitergegeben werden. Ich fände es besser, wenn die Methode nur die "wirklichen" Daten bekommen würde und schaut, wo Felder befüllt wurden und dann in ADDRESSX im gleichnamigen Feld den Paramter auf true setzt. Ich hoffe, es ist halbwegs verständlich, was ich möchte. Hier mein Ansatz, im Moment fällt mir aber keine Lösung für die dynamische Zuweisung ein.

Code: Alles auswählen.

   IF is_user_address IS NOT INITIAL.
      lo_struc ?= cl_abap_structdescr=>describe_by_data(
                    p_data = is_user_address ).

      DO.
        ASSIGN COMPONENT sy-index OF STRUCTURE is_user_address TO <lfs_field>.
        IF sy-subrc NE 0.
          EXIT. 
        ENDIF.

        IF <lfs_field> IS NOT INITIAL.
          READ TABLE lo_struc->components INDEX sy-index INTO DATA(ls_components).
          "HIER MÜSSTE DER PARAMETER IN ADDRESSX auf true gesetzt werden das "Feld hat den gleichen Namen 
"wie in ls_components bzw. is_user_address
          BREAK-POINT.
        ENDIF.

      ENDDO.
    ENDIF.
Wie geht das? Habt Ihr eine Idee?

Danke vorab!
Save a tree - eat a beaver

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


Re: Struktur dynamisch auslesen / schreiben

Beitrag von black_adept (Top Expert / 3944 / 105 / 886 ) »
Moin Ingo,

du hast es doch schon fast geschafft.
Statt des DO...ENDDO mach doch einen LOOP über lo_struc->components. Da hast du dann den Feldnamen und kannst statt ASSIGN COMPONENT sy-index ein ASSIGN COMPONENT feldname... (->siehe Doku zu ASSIGN COMPONENT ) machen.
Und letzteres geht sowohl auf der normalen als auch auf der X-Struktur.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
Ingo

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Struktur dynamisch auslesen / schreiben

Beitrag von Ingo (ForumUser / 46 / 20 / 0 ) »
Moin,
danke für Deine schnelle Antwort. Mein Problem ist die dynamische Zuweisung zur neuen Struktur, wo das Feld den gleichen Namen hat, aber nur noch ein Zeichenfeld von Länge 1 ist und mit einem FLAG ('X') versehen werden soll anstelle - hier zum Beispiel - der Telefonnummer.

ADDRESS wird dynamisch ausgelesen ist vom Typ BAPIADDR3 --> in meinem Code is_user_address

ls_user_address ist vom TYP ADDRESSX und soll dynamisch gefüllt werden.

Mit dem LOOP wäre das ja so:

Code: Alles auswählen.

     LOOP AT lo_struc->components ASSIGNING FIELD-SYMBOL(<lfs_component>).
       ASSIGN COMPONENT <lfs_component>-name OF STRUCTURE is_user_address
        TO FIELD-SYMBOL(<lfs_field>).


        IF <lfs_field> IS NOT INITIAL.
  "HIER LS_USER_ADDRESS im gleichnamigen Feld zu <lfs_component>-name ein X zuweisen
          BREAK-POINT.

        ENDIF.

     ENDLOOP.
Die Struktur für Adressen im genannten BAPI hat zum Beispiel ein Feld TEL1_NUMBR vom Typ CHAR(30), in der Zielstruktur heisst es auch TEL1_NUMBER, aber ist vom Typ CHAR(1). Wenn eine Telefonnummer vorhanden ist, soll hier ein X zugwiesen werden. Ich weiß aber nicht, wie die Syntax hierfür aussehen muss.
Save a tree - eat a beaver

Re: Struktur dynamisch auslesen / schreiben

Beitrag von Ingo (ForumUser / 46 / 20 / 0 ) »
Kleiner Zusatz:
Muss ich dynamisch eine Struktur im LOOP erstellen + befüllen und im Anschluss mit MOVE-CORRESPONDING der Zielstruktur zuweisen? Das muss doch leichter gehen :-)
Save a tree - eat a beaver

Re: Struktur dynamisch auslesen / schreiben

Beitrag von qyurryus (Specialist / 107 / 81 / 45 ) »
Bei den Variablennamen is_user_address und ls_user_address schwirrt mir der Kopf, aber wenn ich es richtig verstanden habe willst du folgendes tun?

Code: Alles auswählen.

LOOP AT lo_struc->components ASSIGNING FIELD-SYMBOL(<component>).
  ASSIGN COMPONENT <component>-name OF STRUCTURE is_user_address TO FIELD-SYMBOL(<data_field>).
  IF sy-subrc = 0 AND <data_field> IS NOT INITIAL.
    ASSIGN component <component>-name OF STRUCTURE ls_user_address TO FIELD-SYMBOL(<datax_field>).
    IF sy-subrc = 0.
      <datax_field> = abap_true.
    ENDIF.
  ENDIF.
 ENDLOOP.

Folgende Benutzer bedankten sich beim Autor qyurryus für den Beitrag:
Ingo


Re: Struktur dynamisch auslesen / schreiben

Beitrag von Ingo (ForumUser / 46 / 20 / 0 ) »
qyurryus hat geschrieben:
04.08.2021 14:27
Bei den Variablennamen is_user_address und ls_user_address schwirrt mir der Kopf, aber wenn ich es richtig verstanden habe willst du folgendes tun?

Code: Alles auswählen.

LOOP AT lo_struc->components ASSIGNING FIELD-SYMBOL(<component>).
  ASSIGN COMPONENT <component>-name OF STRUCTURE is_user_address TO FIELD-SYMBOL(<data_field>).
  IF sy-subrc = 0 AND <data_field> IS NOT INITIAL.
    ASSIGN component <component>-name OF STRUCTURE ls_user_address TO FIELD-SYMBOL(<datax_field>).
    IF sy-subrc = 0.
      <datax_field> = abap_true.
    ENDIF.
  ENDIF.
 ENDLOOP.
Genau das habe ich gesucht! Mir qualmt auch der Kopf ;-)

Vielen, vielen Dank an Euch!
Save a tree - eat a beaver


Seite 1 von 1

Vergleichbare Themen

1
Antw.
258
Views
2
Antw.
1383
Views
Container auswerten und in Struktur schreiben
von Kenny » 04.02.2015 13:01 • Verfasst in ABAP® für Anfänger
2
Antw.
1250
Views
Langen String in Struktur schreiben (UniCode-verträglich)
von Nordlicht » 12.04.2019 09:41 • Verfasst in ABAP® für Anfänger
13
Antw.
10557
Views
Struktur dynamisch bearbeiten
von isp » 02.08.2018 15:28 • Verfasst in ABAP Objects®
1
Antw.
198
Views

Aktuelle Forenbeiträge

PDF-Anzeige unter EDGE
vor 5 Tagen von jocoder 2 / 75

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

PDF-Anzeige unter EDGE
vor 5 Tagen von jocoder 2 / 75

Unbeantwortete Forenbeiträge

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