2 interne Tabellen vergleichen Thema ist als GELÖST markiert

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

2 interne Tabellen vergleichen

Beitrag von Bright4.5 (Specialist / 141 / 12 / 0 ) » 28.03.2019 08:56
Hi,

ich hab ein Problem und zwar möchte ich 2 interne Tabellen miteinander vergleichen ob Einträge in der ersten internen Tabelle auch in der zweiten vorkommen. Einen Doppelloop möchte ich vermeiden (Stichwort Performance). Somit hätte ich es wie folgt gemacht (ist nur grob, da ich gerade kein System habe):

Code: Alles auswählen.

Loop at lt_itab1 into ls_work.
read table lt_ausgabe into  ls_ausgabe with key opbel = ls_work
                                                                        iban <> ls_workd-iban.
Hier habe ich das Problem, dass er das ungleich nicht akzeptiert. Ich hätte gedacht, dass ein Read einfach besser ist, auch aufgrund der Performance. Weiß jemand wie man sowas löst (also das mit dem ungleich) oder kennt jemand eine bessere Alternative?

Vielen Dank.


Re: 2 interne Tabellen vergleichen

Beitrag von nickname8 (Specialist / 124 / 16 / 19 ) » 28.03.2019 09:21
Ein Loop hat nicht zwingend schlechtere Performance als ein READ TABLE.

Vielleicht würde dir sowas helfen:

Code: Alles auswählen.

DATA: lv_opbel TYPE opbel,
      lv_iban  TYPE iban.

SORT lt_ausgabe BY opbel iban.
SORT lt_itab1 BY opbel iban.

LOOP AT lt_itab1 ASSIGNING FIELD-SYMBOL(<work>).

  "hier könnte man auch Gruppenstufenverarbeitung nutzen, die ich nicht mag.
  "In neueren Releases könnte man dafür GROUP-BY in dem LOOP nutzen
  IF <work>-opbel NE lv_opbel OR <work>-iban NE lv_iban.

    lv_opbel = <work>-opbel.
    lv_iban = <work>-iban.

    LOOP AT lt_ausgabe TRANSPORTING NO FIELDS WHERE opbel = <work>-opbel
                                                AND iban <> <work>-iban.
      "ungleich
      EXIT.
    ENDLOOP.
  ENDIF.
ENDLOOP.

Re: 2 interne Tabellen vergleichen

Beitrag von ewx (Top Expert / 4244 / 200 / 444 ) » 28.03.2019 09:38
Du brauchst doch deinen READ nur mit "=" zu machen.
Wenn der Eintrag gefunden wird, weißt du, dass er in der zweiten Tabelle auch vorhanden ist.
Wenn nicht, dann nicht...

Re: 2 interne Tabellen vergleichen

Beitrag von Bright4.5 (Specialist / 141 / 12 / 0 ) » 28.03.2019 09:41
hmm das wäre ja leider auch wieder ein Loop im Loop, gerade so etwas wollte ich gerne vermeiden. Es geht darum, dass ich eine interne Tabelle habe in der gewisse Zeilen, welche OPBEL-Nummern beinhalten und ich nun eine zweite interne Tabelle habe und ich von dort auch welche in die erste aufnehmen möchte, diese aber nur aufgenommen werden sollen, wenn sie das Kriterium erfüllen, dass die IBAN-Nummer ungleich ist. :) Beispielcoding wäre super :)

Re: 2 interne Tabellen vergleichen

Beitrag von Bright4.5 (Specialist / 141 / 12 / 0 ) » 28.03.2019 10:05
@ewx.

Ja, aber diese Information würde mir nicht viel bringen.

Re: 2 interne Tabellen vergleichen

Beitrag von ewx (Top Expert / 4244 / 200 / 444 ) » 28.03.2019 10:35
Bright4.5 hat geschrieben:@ewx.

Ja, aber diese Information würde mir nicht viel bringen.
wieso nicht?
Bright4.5 hat geschrieben:[...]ob Einträge in der ersten internen Tabelle auch in der zweiten vorkommen[...]

Re: 2 interne Tabellen vergleichen

Beitrag von Bright4.5 (Specialist / 141 / 12 / 0 ) » 28.03.2019 10:39
Kriterium 1 es kommt ein Eintrag vor, der die gleiche OPBEL-Nummer hat. Kriterium 2 die IBAN-Nummer ist ungleich, erst dann möchte ich diesen Eintrag aus der Tabelle 1 in die Tabelle 2 einfügen.

Re: 2 interne Tabellen vergleichen

Beitrag von Bright4.5 (Specialist / 141 / 12 / 0 ) » 28.03.2019 10:48
Okay, vielen Dank an alle ich hätte es gelöst :).

Re: 2 interne Tabellen vergleichen

Beitrag von SaskuAc (Specialist / 321 / 37 / 43 ) » 28.03.2019 10:51
verstehe dennoch nicht, warum dir das nichts bringt. ( vielleicht stehe ich auch nur auf den schlauch )
wenn du den Eintrag, mit der gleichen IBAN-Nummer findest, brauchst du halt nichts zu tun, falls du es nicht findest, fügst du den Eintrag aus der Tabelle 1 in Tabelle 2 ein.. ungefähr so ( Pseudocode ):

Code: Alles auswählen.

Loop at itab1 into data(struc1). 
    if not line_exists( itab2[ field1 = struc1-field1 field2 = struc1-field2 ] ). 
        insert struc1 into itab2. 
    endif. 
endloop. 
Ersetze das &#91 / 93 mit eckigen klammern...

anstatt dem line exists könnte man auch read table hernehmen ( bei älteren releases ) und dann sy-subrc <> 0 prüfen..


Edit:
Bright4.5 hat geschrieben:Okay, vielen Dank an alle ich hätte es gelöst :).

wie hast dus jetzt gelöst? für den fall das jemnd anders auch mal das problem hat.

Re: 2 interne Tabellen vergleichen

Beitrag von A6272 (Specialist / 142 / 1 / 17 ) » 28.03.2019 13:59
Hallo,

sowas sollte mit dem Befehl FILTER gehen. Damit kann man z.B. alle Einträge aus Tabelle A filtern die in Tabelle B enthalten sind oder alle Einträge aus Tabelle A filtern die nicht in Tabelle B enthalten sind. Das ist sehr sehr performant.

Grüße
Alex

Folgende Benutzer bedankten sich beim Autor A6272 für den Beitrag:
L0w-RiDer


Re: 2 interne Tabellen vergleichen

Beitrag von DeathAndPain (Top Expert / 1423 / 153 / 325 ) » 28.03.2019 14:05
@Saskuac: In Deinem Codebeispiel prüfst Du ja beides auf Gleichheit. Er braucht aber den Fall, dass der erste Wert gleich und der zweite ungleich ist. Er sucht also die Zeilen mit gleichem ersten Wert, kann aber von den Fundergebnissen nur diejenigen gebrauchen, bei denen der zweite Wert sich unterscheidet.
Bright4.5 hat geschrieben:hmm das wäre ja leider auch wieder ein Loop im Loop, gerade so etwas wollte ich gerne vermeiden.
Diese Diskussion hatten wir kürzlich in einem anderen Thread. Einerseits ist es nicht immer zu vermeiden, zweitens ist es auch nicht notwendigerweise schlimm, und dritterseits reden wir hier von einem Pseudo-Loop, der nur einen EXIT enthält und der daher genauso wie ein READ TABLE nur einmalig durchlaufen wird. Damit hat der LOOP zwar eine etwas sperrigere Syntax, ist performancetechnisch aber nicht nennenswert schlechter.

Trotzdem ist das in meinen Augen eine uralte Schwachstelle von ABAP, und bei Einführung der 7.40-Syntax hat die SAP die Möglichkeit liegengelassen, sie zu beheben. Der READ TABLE liefert so oder so nur die erste von möglicherweise mehreren Zeilen zurück, auf die seine Gleichheitsbedingungen zutreffen. Da könnte man genauso auch Prüfungen auf Ungleichheit oder gar noch komplexeren Kram (IN-Operator etc.) erlauben. Für die implizite 7.40-Syntax mit den eckigen Klammern gilt dasselbe. Ein Eindurchlaufloop ist ein höchst hässlicher und schlecht lesbarer Ersatz.

Re: 2 interne Tabellen vergleichen

Beitrag von L0w-RiDer (Specialist / 307 / 54 / 1 ) » 09.04.2019 17:18
Hey A6272!

könntest du mir vielleicht ein Beispiel geben wie das mit Filter funktioniert??

muss man da mit Select vorgehen??

Re: 2 interne Tabellen vergleichen

Beitrag von A6272 (Specialist / 142 / 1 / 17 ) » 11.04.2019 08:16
Hallo,

man braucht sortierte Tabellen.
von der Logik her folgendes:
lt_auch_in_anderer_Tabelle = FILTER #( lt_Tabelle1 in lt_Tabelle2 where feld1 = feld1 and feld2 = feld2 and ...).

lt_nicht_in_anderer_Tabelle = FILTER #( lt_Tabelle1 EXCEPT in lt_Tabelle2 where feld1 = feld1 and feld2 = feld2 and ...).

Grüße
Alex

Seite 1 von 1

Vergleichbare Themen

interne tabellen vergleichen
von TobiB » 23.11.2007 13:12
2 interne Tabellen vergleichen
von swonny » 06.11.2006 16:12
2 interne Tabellen vergleichen
von Frank Schmitt » 24.06.2020 09:40
2 interne Tabellen vergleichen
von Klende » 21.11.2005 15:16
Interne Tabellen: Feldinhalte vergleichen
von Mario Reum » 09.10.2019 21:36