Durchlaufen zweier Tabellen

Getting started ... Alles für einen gelungenen Start.
10 Beiträge • Seite 1 von 1
10 Beiträge Seite 1 von 1

Durchlaufen zweier Tabellen

Beitrag von Spookykid (Specialist / 140 / 28 / 0 ) »
Hallo zusammen,

ich möchte gerne 2 Tabellen durchlaufen. lt_itb und lt_bla. Sollten die Schlüsselfelder identisch sein, muss ein die Zeile an einer bestimmten Stelle gekennzeichnet werden, sollte dies nicht der Fall sein, muss die Kennzeichnung in einem anderem Feld erfolgen.

Ich habe hierzu etwas geschrieben:

Code: Alles auswählen.

data lt_bla type table of ty_itab.

  loop at lt_posid_ne ASSIGNING <z5>.
    loop at lt_itab ASSIGNING <z4>.



    if <z5>-posid = <z4>-posid.
        Write 'X' to <z5>-info1.
        APPEND <z5> to lt_bla.
        DELETE lt_itab WHERE posid = <z5>-posid.
        DELETE lt_posid_ne WHERE posid = <z5>-posid.
        CONTINUE.


      ELSEIF <z5>-posid <> <z4>-posid.
        Write 'X' to <z5>-info4.
        APPEND <z5> to lt_bla.
        DELETE lt_posid_ne WHERE posid = <z5>-posid.
        Continue.
   endif.
    
     endloop.
  endloop.
append LINES OF lt_bla to lt_erg.

Ich bekomme aber eine Exception, dass ich auf ein Zeiger-Symbol verweise, welcher auf einen gelöschten Datensatz zeigt . Ich gehe davon aus, dass dies der Fall sein muss, wenn eine der Tabellen leer ist und die zweite Verzweigung keinen 2. Operanden zum Vergleich mehr hat.

Kennt jemand hier eine praktikable Lösung?

Vielen Dank im Voraus

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


Re: Durchlaufen zweier Tabellen

Beitrag von km216 (Specialist / 151 / 6 / 11 ) »
Kannst du nicht über den sy-subrc abfragen, ob das assign geklappt hat?

Code: Alles auswählen.

data lt_bla type table of ty_itab.

  loop at lt_posid_ne ASSIGNING <z5>.
    loop at lt_itab ASSIGNING <z4>.

if sy-subrc eq 0.

    if <z5>-posid = <z4>-posid.
        Write 'X' to <z5>-info1.
        APPEND <z5> to lt_bla.
        DELETE lt_itab WHERE posid = <z5>-posid.
        DELETE lt_posid_ne WHERE posid = <z5>-posid.
        CONTINUE.


      ELSEIF <z5>-posid <> <z4>-posid.
        Write 'X' to <z5>-info4.
        APPEND <z5> to lt_bla.
        DELETE lt_posid_ne WHERE posid = <z5>-posid.
        Continue.
   endif.
 endif.   
     endloop.
  endloop.
append LINES OF lt_bla to lt_erg.



Re: Durchlaufen zweier Tabellen

Beitrag von Spookykid (Specialist / 140 / 28 / 0 ) »
hmm, ich bekomme weiterhin die gleiche Exception. Kann man irgendwie abfragen/abfangen ob einer der Operanden Null ist? oder wird dies durch das sy-subrc schon abgefangen?

Re: Durchlaufen zweier Tabellen

Beitrag von black_adept (Top Expert / 4080 / 125 / 935 ) »
Hallo spookykid,

1.) Das ELSEIF ist doch ein ganz normales ELSE, oder?
2.) Beim oberflächlichen Drüberschauen vermute ich, dass es nicht der 2. sondern der 1. Operand ( <z5> ) ist, welcher nicht zugewiesen ist.
3.) Sobald die Exception/Kurzdump auftritt: Drück auf den Knopf "Debugger" und schau einfach nach, welches der Feldsymbole grade initial ist. Und dann wirst du sehen, dass der letzte DELETE-Befehl auf die äußere Tabelle dir das Assignement des Feldsymbol <z5> initialisiert hat.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Durchlaufen zweier Tabellen

Beitrag von Ratazong (Specialist / 144 / 1 / 14 ) »
Das ist doch logisch nicht ganz korrekt aufgebaut. Wenn übereinstimmend, löschst du sowohl Zeile aus äußerer und innerer Tabelle, machst aber mit dem inneren loop weiter. Da ist natürlich der Zeiger beim nächsten Zugriff auf die äußere Tabellenzeile pfutsch.

Das sollte eher so aussehen:

Code: Alles auswählen.

  loop at lt_posid_ne ASSIGNING <z5>.
    loop at lt_itab ASSIGNING <z4>
      where posid = <z5>-posid.
* Kennzeichen INFO1 setzen
      exit.
    endloop.
    if sy-subrc <> 0.
* kennzeichen INFO4 setzen.
    endif.
  endloop.
Grüße

Rata

Folgende Benutzer bedankten sich beim Autor Ratazong für den Beitrag:
Spookykid


Re: Durchlaufen zweier Tabellen

Beitrag von Spookykid (Specialist / 140 / 28 / 0 ) »
black_adept hat geschrieben:Hallo spookykid,

1.) Das ELSEIF ist doch ein ganz normales ELSE, oder?
2.) Beim oberflächlichen Drüberschauen vermute ich, dass es nicht der 2. sondern der 1. Operand ( <z5> ) ist, welcher nicht zugewiesen ist.
3.) Sobald die Exception/Kurzdump auftritt: Drück auf den Knopf "Debugger" und schau einfach nach, welches der Feldsymbole grade initial ist. Und dann wirst du sehen, dass der letzte DELETE-Befehl auf die äußere Tabelle dir das Assignement des Feldsymbol <z5> initialisiert hat.
1. Richtig, habe ich nur mal probehalber geändert.
2/3. Du hast recht. Wobei die <z5> auf die Tabelle mit den meisten Datensätzten zeigt. Theoretisch müsste der Zeiger <z4> vorher auf einen leeren Datensatz zeigen.

Re: Durchlaufen zweier Tabellen

Beitrag von Spookykid (Specialist / 140 / 28 / 0 ) »
Ich möchte nur die Delta Daten von lt_erg und le_bla aufnehmen. Lt_erg ist die Basis. Irgendwie will das aber nicht. Jemand ne Idee?

Code: Alles auswählen.

loop at lt_erg ASSIGNING <z4>.
loop at lt_bla ASSIGNING <z5>
where posid = <z4>-posid.
EXIT.
ENDLOOP.

IF SY-SUBRC <> 0.
append <z5> to lt_temp.
endif.
endloop.

Re: Durchlaufen zweier Tabellen

Beitrag von Ratazong (Specialist / 144 / 1 / 14 ) »
<z4> anstelle von <z5> appenden? ;-)

Alternative: anstelle von "exit" ein "delete lt_erg" einbauen.
=> Dann hast du nach dem loop in lt_erg nur noch die stehen, die nicht in lt_bla stehen.

Rata

Re: Durchlaufen zweier Tabellen

Beitrag von Spookykid (Specialist / 140 / 28 / 0 ) »
Ok, ich habe es jetzt so gelöst:

Code: Alles auswählen.

  loop at lt_erg ASSIGNING <z4>.
    loop at lt_bla ASSIGNING <z5>
      where  posid = <z4>-posid.
        delete lt_bla where posid = <z4>-posid .
        exit. 
     endloop.
  endloop.
Komisch, dass man Datensätze in einer Tabelle, die man gerade durchläuft so einfach löschen kann. Würde man in Java einen Iterator auf ne Collection anwenden, könnte man nicht so einfach Elemente der Collection löschen.

Re: Durchlaufen zweier Tabellen

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
Und hier noch mein Senf zu der ganzen Diskussion:

Code: Alles auswählen.

  loop at lt_erg ASSIGNING <z4>.
    loop at lt_bla ASSIGNING <z5>
      where  posid = <z4>-posid.
        delete lt_bla.
     endloop.
  endloop.
Man braucht nämlich innerhalb einer Schleife beim delete weder Index noch tabellenschlüssel angeben.
Es wird immer die aktuell durchlaufene Zeile gelöscht.

Und btw. unter Java gibts auch die Möglichkeit in einem Iterator-Durchlauf Elemente aus einer Collection zu löschen, nur muss man dazu
1) Eine Collection verwenden die das unterstützt (z.B. ArrayList)
2) Die Löschung über den Iterator auslösen (Methode remove)

hmm....

Code: Alles auswählen.

  loop at lt_erg ASSIGNING <z4>.
    delete lt_bla where  posid = <z4>-posid.
  endloop.
Noch einfacher 8)

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Spookykid

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Seite 1 von 1

Vergleichbare Themen

20
Antw.
6232
Views
Zusammenführen zweier int Tabellen
von Willow » 18.01.2005 10:29 • Verfasst in Basis
2
Antw.
2317
Views
Vergleich Inhalt zweier DB-Tabellen
von schuessler » 12.07.2007 10:40 • Verfasst in ABAP® Core
4
Antw.
2171
Views
Bestimmte Spalten zweier Tabellen abgleichen
von kaufikauf » 15.08.2014 08:55 • Verfasst in ABAP® für Anfänger
4
Antw.
1493
Views
Einfügen zweier interner Tabellen in eine dritte mit LOOP
von alexkr. » 12.12.2017 11:11 • Verfasst in ABAP® für Anfänger
4
Antw.
3177
Views
Vergleich zweier IDocs
von ABAP-Azubi » 07.04.2014 14:57 • Verfasst in ABAP® für Anfänger

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.

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 1674
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8276