Modifizierte Zeile an interne Tabelle anhängen

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

Modifizierte Zeile an interne Tabelle anhängen

Beitrag von Margolwes (ForumUser / 83 / 2 / 0 ) »
Hallo,

ich habe zwei Tabellen, beide gefüllt, und möchte die Zeilen der Tabelle 1 an die von Tabelle 2 anfügen und dabei einen Feldwert ergänzen. Mein Code sieht so aus:

Code: Alles auswählen.

types: begin of type1
        , felda type c
        , feldb type c
        , feldc type c
        , end of type 1
        .

types: begin of type2
        , felda type c
        , feldb type c
        , feldc type c
        , feldd type c
        , end of type 2
        .

data: lt_table1 type table of type1
    , lt_table2 type table of type2
    .

* Annahme: Beide Tabellen sind gefüllt
lt_table2 = value type2( base lt_table2 ( value #( for line in lt_table1 ( value #( base corresponding #( line ) feldd = 'X' ) ) ) ) ).
Ich erhalte hier immer die Fehlermeldung "Es existiert keine Komponente mit Namen "FOR".". Wo liegt mein Fehler?

Viele Grüße
Margolwes

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


Re: Modifizierte Zeile an interne Tabelle anhängen

Beitrag von DeathAndPain (Top Expert / 1952 / 259 / 413 ) »
Trickreicher Code. 😃 Aber finde ich gut, dass Du modernes ABAP programmierst.

Zu Deiner Frage: Hinter dem BASE-Wert erwartet VALUE eine Auflistung von Einzelwerten, die zusätzlich in die Tabelle gefüllt werden müssen. Dein Beispielcode ist sowieso falsch, weil Du vorne VALUE type2 schreibst, obwohl Du nicht einen Wert der Struktur type2, sondern eine Tabelle type standard table of type2 haben möchtest. Du musst also zunächst mal noch einen entsprechenden Tabellentyp definieren (und zwar mit Schlüsselangabe, sonst weist VALUE es als generisch zurück. Du kannst als Schlüsselangabe aber WITH EMPTY KEY verwenden).

Wenn Du beim ersten Value dann den richtigen Tabellentyp angibst, kommst Du schon weiter. Wenn Du beim zweiten VALUE anstelle der Raute auch den Tabellentyp angibst (Dein FOR ergibt ja eine Tabelle), dann bekommst Du eine aussagekräftigere Fehlermeldung, die Dich auf die richtige Fährte schickt: der erste VALUE will an dieser Stelle gar keine Tabelle haben. Grund ist der eingangs Genannte: nach dem BASE-Argument erwartet VALUE eine Auflistung der zu ergänzenden Werte.

Retten kannst Du Dich mit dem LINES OF VALUE-Konstrukt. Du kannst es also so bauen:

Code: Alles auswählen.

LT_TABLE2 = VALUE TT_TYPE2( BASE LT_TABLE2 ( LINES OF VALUE #( FOR LINE IN LT_TABLE1 ( VALUE #( BASE CORRESPONDING #( LINE ) FELDD = 'X' ) ) ) ) ).
Dann funktioniert es.

Re: Modifizierte Zeile an interne Tabelle anhängen

Beitrag von Thomas R. (Expert / 755 / 78 / 34 ) »
Hallo zusammen,

zumindest in meinem Release(SAP_BASIS und SAP_ABA 740/Package 27) funktioniert es nicht. Bei den angefügten Zeilen ist FELDD leer.

MfG
Thomas R.

Edit:
Mea Culpa - natürlich funktioniert es. Ich hatte Tomaten auf den Augen...
Zuletzt geändert von Thomas R. am 13.10.2023 14:32, insgesamt 2-mal geändert.

Re: Modifizierte Zeile an interne Tabelle anhängen

Beitrag von DeathAndPain (Top Expert / 1952 / 259 / 413 ) »
Bei mir (Release 7.50) funktioniert es einwandfrei. Hier der vollständige Report zum Copy&Paste:

Code: Alles auswählen.

REPORT ZTEST4.

TYPES: BEGIN OF TYPE1
        , FELDA TYPE C
        , FELDB TYPE C
        , FELDC TYPE C
        , END OF TYPE1
        .

TYPES: BEGIN OF TYPE2
        , FELDA TYPE C
        , FELDB TYPE C
        , FELDC TYPE C
        , FELDD TYPE C
        , END OF TYPE2
        ,
        TT_TYPE2 TYPE STANDARD TABLE OF TYPE2 WITH EMPTY KEY.

DATA: LT_TABLE1 TYPE TABLE OF TYPE1
    , LT_TABLE2 TYPE TABLE OF TYPE2
    .


LT_TABLE1 = value #( ( felda = 'X'
                       feldb = 'Y'
                       feldc = 'Z' ) ).

LT_TABLE2 = value #( ( felda = 'A'
                       feldb = 'B'
                       feldc = 'C'
                       feldD = 'D' ) ).

LT_TABLE2 = VALUE TT_TYPE2( BASE LT_TABLE2 ( LINES OF VALUE #( FOR LINE IN LT_TABLE1 ( VALUE #( BASE CORRESPONDING #( LINE ) FELDD = 'X' ) ) ) ) ).

break-point.
Am Breakpoint kann man im Debugger sehen, dass LT_TABLE2 die beiden Zeilen

A B C D und
X Y Z X

enthält. Also genau, wie es sein sollte.

Re: Modifizierte Zeile an interne Tabelle anhängen

Beitrag von fr-g (ForumUser / 76 / 12 / 25 ) »
Kann es sein, dass im ursprünglichen Lösungsansatz einfach nur ein Value zuviel stand?!

Code: Alles auswählen.

lt_table2 = value #( base lt_table2 for line in lt_table1 ( value #( base corresponding #( line ) feldd = 'X' ) ) ).

Re: Modifizierte Zeile an interne Tabelle anhängen

Beitrag von DeathAndPain (Top Expert / 1952 / 259 / 413 ) »
Ja, das könnte auch sein. Kann man FOR nach BASE benutzen? Wahrscheinlich ja. Dann hättest Du recht.

Optimalerweise ersetzt man jetzt noch das Hilfsfeld line durch ein Hilfsfeldsymbol <line>, um die letzten Mikrosekunden herauszukitzeln. 😁

Re: Modifizierte Zeile an interne Tabelle anhängen

Beitrag von fr-g (ForumUser / 76 / 12 / 25 ) »
Na klar läuft das ^^

Code: Alles auswählen.

TYPES:
  BEGIN OF type1,
    felda TYPE c LENGTH 1,
    feldb TYPE c LENGTH 1,
    feldc TYPE c LENGTH 1,
  END OF type1.

TYPES:
  BEGIN OF type2,
    felda TYPE c LENGTH 1,
    feldb TYPE c LENGTH 1,
    feldc TYPE c LENGTH 1,
    feldd TYPE c LENGTH 1,
  END OF type2.

DATA lt_table1 TYPE TABLE OF type1.
DATA lt_table2 TYPE TABLE OF type2.

lt_table1 = VALUE #( felda = 'a'
                     feldb = 'b'
                     feldc = 'c'
                     ( )
                     ( )
                     ( ) ).

lt_table2 = VALUE #( felda = 'A'
                     feldb = 'B'
                     feldc = 'C'
                     feldd = 'D'
                     ( )
                     ( )
                     ( ) ).

lt_table2 = VALUE #( BASE lt_table2 FOR <line> IN lt_table1 ( VALUE #( BASE CORRESPONDING #( <line> ) feldd = 'X' ) ) ).

cl_demo_output=>display( lt_table2 ).

Seite 1 von 1

Vergleichbare Themen

5
Antw.
4201
Views
Zeile an interne Tabelle anfügen...?
von b0rsti » 13.06.2008 13:49 • Verfasst in ABAP® für Anfänger
4
Antw.
6512
Views
Wie Zeile aus IT in andere interne Tabelle kopieren
von halo5 » 03.09.2009 08:22 • Verfasst in ABAP® für Anfänger
4
Antw.
1136
Views
5
Antw.
2138
Views
Inhalt interne Tabelle an andere interne Tabelle übergeben
von L0w-RiDer » 30.01.2020 16:28 • Verfasst in ABAP® für Anfänger

Aktuelle Forenbeiträge

Regex in where
vor 4 Stunden von edwin 7 / 163
Daten an Tabelle binden
vor 18 Stunden von Bright4.5 3 / 1486

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

Regex in where
vor 4 Stunden von edwin 7 / 163
Daten an Tabelle binden
vor 18 Stunden von Bright4.5 3 / 1486

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 5 Wochen von ralf.wenzel 1 / 3261
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9821