wie vermeide ich nested loops?

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

wie vermeide ich nested loops?

Beitrag von c oco (Specialist / 326 / 12 / 16 ) »
Hallo,

ich neige dazu, verschachtelte Loops zu schreiben, obwohl man dass ja vermeiden sollte.
Aber wie kann ich das in diesem konkreten Fall vermeiden?
Das Feld gstrs soll, wenn es zu einem j_3acomord unterschiedliche Daten enthält leer dargestellt werden.
gt_csdp ist die Ausgabetabelle. lt_comord habe ich als zwischentabelle, um die j_3acomords zuerhalten, nach denen ich dann
von der DB Tab selektiere. Bin für Hinweise und Tipps sehr dankbar.

Code: Alles auswählen.

 
 lt_comord = gt_csdp.
  sort lt_comord by j_3acomord gstrs.
  delete ADJACENT DUPLICATES FROM lt_comord COMPARING j_3acomord.
  delete lt_comord where j_3acomord = ' '. 
  sort gt_csdp by j_3acomord gstrs.


LOOP AT lt_comord ASSIGNING <ls_comord>.
    select * from afko into table lt_int
      where j_3acomord = <ls_comord>-j_3acomord.
    if lt_int is NOT INITIAL.
      LOOP AT lt_int ASSIGNING <ls_int> where gstrs <> <ls_comord>-gstrs.
        if sy-subrc = 0.
          LOOP AT gt_csdp ASSIGNING <ls_csdp> where j_3acomord = <ls_comord>-j_3acomord.
            if sy-subrc = 0.
              clear <ls_csdp>-gstrs.
            endif.
          ENDLOOP.
          exit.
        endif.
      ENDLOOP.
    endif.
  endloop.
Viele Grüße
coco

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


Re: wie vermeide ich nested loops?

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
hallo coco,

so richtig verstanden habe ich deinen Code noch nicht. Einige Anregungen habe ich aber doch, vielleicht hilft es ja ein wenig...

1) Abfrage auf sy-subrc = 0 ist in einem LOOP über eine interne Tabelle sinnlos. Entweder die Tabelle hat Einträge und du läufst in den LOOP rein, oder sie hat keine, dann wird die Stelle wo du den sy-subrc abfragst garnicht durchlaufen.

2) select * from afko liesse sich doch eigentlich aus dem LOOP rausziehen. Das müsste sich positiv auf die Performance auswirken

ich habe jetzt kein System zur Hand, hab den Code im Texteditor zusammengeschrieben. Die LOOPS sind zwar immer noch verschachtelt, der zweite wird aber z.B. nur ein Mal durchlaufen. Wenn das Programm das tut was es tun soll und die Performance hinnembar ist, so würde ich nicht weiter versuchen die LOOPS durch was anderes abzulösen. Was man sich überlegen könnte wäre der Typ der internen Tabellen. Man gewinnt deutlich Performance, wenn die Tabellen hashed oder sortiert wären und man über einen Schlüssel darauf zugreifen würde...

Code: Alles auswählen.

  lt_comord = gt_csdp.
  sort lt_comord by j_3acomord gstrs.
  delete ADJACENT DUPLICATES FROM lt_comord COMPARING j_3acomord.
  delete lt_comord where j_3acomord = ' '.
  sort gt_csdp by j_3acomord gstrs.     
	 		
	check lt_comord is not initial.

	select * from afko appending table lt_int
	for all entries in lt_comord
	  where j_3acomord = lt_comord-j_3acomord.

    LOOP AT lt_comord ASSIGNING <ls_comord>.
	
		LOOP AT lt_int ASSIGNING <ls_int> where j_3acomord = <ls_comord>-j_3acomord 
		  AND gstrs <> <ls_comord>-gstrs.
		  
			  LOOP AT gt_csdp ASSIGNING <ls_csdp> where j_3acomord = <ls_comord>-j_3acomord.
                             clear <ls_csdp>-gstrs.
                          ENDLOOP.				  

	        EXIT.			  
		ENDLOOP
		
      ENDLOOP.
schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: wie vermeide ich nested loops?

Beitrag von c oco (Specialist / 326 / 12 / 16 ) »
Hallo Alexander,

danke für deine hilfreichen Tips.

Habe das jetzt umgebaut. Auch wenn es Performancetechnisch nicht so einen Unterschied macht, sieht es doch übersichtlicher aus. Danke auch für den Hinweis mit dem Sy-subrc in einem Loop. Das werd ich mir merken :up:

Viele Grüße
coco

Re: wie vermeide ich nested loops?

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
Perfromance:
Sortiere deine Tabellen und verwende dann READ TABLE ... BINARY SEARCH.
Damit kann man auch bei NESTED LOOP (sofern man sie nicht vermedien kann oder will) einiges an performance rausholen.

Beispiel:

Code: Alles auswählen.

SORT itab BY feld1 feld2.
READ TABLE itab TRANSPORTING NO FIELDS BINARY SEARCH WITH KEY feld1 = 1 feld2 = 2.
IF sy-subrc EQ 0.
  ld_index = sy-tabix.
  LOOP AT itab ASSIGNING <line> FROM ld_index.
    IF <line>-feld1 NE 1 OR <line>-feld2 NE 2.
      exit.
    ENDIF.
* Verarbeitung
  ENDLOOP.
ENDIF.
Schaut zwar Horrormäßig aus, ist aber eine von SAP empfohlene Zugriffsvariante.
Bis auf HASH-Tabellen ist der Zugriff per INDEX immer SCHNELLER als mit KEY.

lg ADT
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

3
Antw.
2069
Views
Loops Zusammenfassen
von BMWi801 » 15.05.2018 13:23 • Verfasst in ABAP® Core
1
Antw.
366
Views
Verschachtelte Loops
von ABAPlerv » 03.04.2022 08:30 • Verfasst in ABAP® für Anfänger
11
Antw.
3912
Views
Optimierung eines LOOPS
von Foxbat » 17.11.2011 12:01 • Verfasst in ABAP® für Anfänger
1
Antw.
1414
Views
Flat structure, deep structure and nested structure
von newone » 26.06.2018 15:53 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


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

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

Daten an Tabelle binden
vor 2 Tagen von Bright4.5 1 / 715
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2343
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8926