Optimierung eines LOOPS

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

Optimierung eines LOOPS

Beitrag von Foxbat (ForumUser / 4 / 5 / 0 ) »
Hallo Zusammen,

ich bin kein Entwickler und fummle mich zumindest was den ABAP SQL BEreich angeht etwas mit einigen Mühen durch. ISt normal auch nicht mein Schwerpunkt, aber im BW Umfeld kommt man halt nicht um ABAP drumherum. Ich habe folgendes Konstrukt und würde gerne ein paar Tips ahben, wie man es besser machen kann. Meiner Meinung nach ist das nicht sonderlich optimal. Mir geht es dabei um doe oberen beiden hintereinander geschalteten LOOPS:

Code: Alles auswählen.

LOOP AT lt_docref ASSIGNING <ls_docref>.
      MOVE <ls_docref>-INBOUND_REF(12)
        TO <ls_docref>-INBOUND_REF_K.

      CLEAR: lt_beleg.

      SELECT BELZEILE STGRQNT STGRAMT V_ABRMENGE N_ABRMENGE MASSBILL
       FROM DBERCHZ1
        INTO CORRESPONDING FIELDS OF TABLE lt_beleg
          WHERE BELNR = <ls_docref>-INBOUND_REF_K.

      IF sy-subrc = 0.

        LOOP AT lt_beleg ASSIGNING <ls_beleg>.

          CLEAR: lt_data.

          <ls_beleg>-MANDT            = <ls_docref>-MANDT.
          <ls_beleg>-INT_INV_DOC_NO   = <ls_docref>-INT_INV_DOC_NO.
          <ls_beleg>-INBOUND_REF_TYPE = <ls_docref>-INBOUND_REF_TYPE.
          <ls_beleg>-INBOUND_REF_NO   = <ls_docref>-INBOUND_REF_NO.
          <ls_beleg>-INBOUND_REF      = <ls_docref>-INBOUND_REF.
          <ls_beleg>-INBOUND_REF_K    = <ls_docref>-INBOUND_REF_K.

          <ls_beleg>-G_ABRMENGE =
              <ls_beleg>-v_abrmenge + <ls_beleg>-n_abrmenge.

          MOVE-CORRESPONDING <ls_beleg> TO lt_data.

          SELECT NETTOBTR TWAERS INTO (lt_data-NETTOBTR, lt_data-TWAERS)
            FROM DBERCHZ3
              WHERE BELNR = <ls_beleg>-INBOUND_REF_K
              AND BELZEILE = <ls_beleg>-BELZEILE.
          ENDSELECT.

          SELECT CREATED_ON CHANGED_ON
              INTO (lt_data-CREATED_ON, lt_data-CHANGED_ON)
            FROM TINV_INV_HEAD
              WHERE INT_INV_NO = <ls_docref>-INT_INV_NO.
          ENDSELECT.

* additional select because of impossible use equal statement
* between both field symbols I_FS_BELEG and I_FS_DOCREF after clear
* statement
*-----------------------------------------------------------------------

          SELECT INT_INV_NO
              INTO lt_data-INT_INV_NO
            FROM TINV_INV_DOCREF
              WHERE INT_INV_DOC_NO = <ls_docref>-INT_INV_DOC_NO.
          ENDSELECT.

* end of additionsal select
*-----------------------------------------------------------------------

          APPEND lt_data TO E_T_DATA.

        ENDLOOP.

      ENDIF.

    ENDLOOP.

Würde mich über Anregungen sehr freuen. Vielen Dank schonmal im Voraus!

Viele Grüße
Foxbat

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


Re: Optimierung eines LOOPS

Beitrag von donossi (ForumUser / 66 / 2 / 1 ) »
Hallo,

ich sehe dort nur ein Loop

Code: Alles auswählen.

LOOP AT lt_docref ASSIGNING <ls_docref>.


@Edit: ohhhh....sorry, hatte der Scrollbalken übersehen.....jetzt sehe ich auch 2 Loops ;)

Gruss
DonOssi
Zuletzt geändert von donossi am 17.11.2011 12:40, insgesamt 1-mal geändert.

Re: Optimierung eines LOOPS

Beitrag von Foxbat (ForumUser / 4 / 5 / 0 ) »
Hm? Erst kommt eine Loop, dann ein Select und dann nochmal ein Loop....

Die FRage ist eben ob man daran was verbessern kann bzw. was optimaler wäre.

Re: Optimierung eines LOOPS

Beitrag von RockyAM (ForumUser / 30 / 0 / 7 ) »
Eine absolute Performancebremse was du da hast.

Select-Statements gehören nie in eine Loop-Schleife.

Daher den ersten Select rausziehen, Ergebnis in interner Tabelle speichern (am besten ne Hashed Table).
Dann loopen (wird nur geloopt wenn auch ein Satz in interner Tabelle vorhanden ist). Dann ein Read auf die lt beleg.

Die anderen Selects auch rausziehen aus der Loop.

Viele Grüße

Re: Optimierung eines LOOPS

Beitrag von RockyAM (ForumUser / 30 / 0 / 7 ) »
im ersten Select noch mit For all entries lt_docref zugreifen

Re: Optimierung eines LOOPS

Beitrag von RockyAM (ForumUser / 30 / 0 / 7 ) »
Habs mal in paar Min zusammengeschustert wie es ungefähr aussehen sollte. Ist jetzt aus dem Kopf raus ohne groß nachzuschauen im Editor zusammengebastelt,
damit du verstehst wie ich es meine.

SELECT BELZEILE STGRQNT STGRAMT V_ABRMENGE N_ABRMENGE MASSBILL
FROM DBERCHZ1
FOR ALL ENTRIES IN lt_docref
INTO CORRESPONDING FIELDS OF TABLE lt_beleg
WHERE BELNR = lt_docref-INBOUND_REF_K.

if sy-subrc <> 0.
* Fehlerhandling
endif.


Types mit belnr belzeile nettobtr twaers als temp_tab)
SELECT NETTOBTR TWAERS BELNR BELZEILE INTO lt_temp_tab
FROM DBERCHZ3
FOR ALL ENTRIES IN lt_beleg
WHERE BELNR = lt_beleg-INBOUND_REF_K
AND BELZEILE = lt_beleg-BELZEILE.
if sy-subrc <> 0.
* Fehlerhandling
endif.

* hier TYPES Tabelle mit Belnr Belzeile Created on Changed on definieren und hinein selekten
SELECT CREATED_ON CHANGED_ON BELNR BELZEILE IN lt_temp_tabelle
FROM TINV_INV_HEAD
FOR ALL ENTRIES IN lt_docref
WHERE INT_INV_NO = lt_docref-INT_INV_NO.
if sy-subrc <> 0.
* Fehlerhandling
endif.

SELECT INT_INV_NO
INTO lt_data-INT_INV_NO
FROM TINV_INV_DOCREF
FOR ALL ENTRIES IN lt_docref
WHERE INT_INV_DOC_NO = lt_docref-INT_INV_DOC_NO.



LOOP AT lt_docref ASSIGNING <ls_docref>.
MOVE <ls_docref>-INBOUND_REF(12)
TO <ls_docref>-INBOUND_REF_K.


LOOP AT lt_beleg ASSIGNING <ls_beleg>
WHERE BELNR = <ls_docref>-INBOUND_REF_K.

CLEAR: lt_data.

<ls_beleg>-MANDT = <ls_docref>-MANDT.
<ls_beleg>-INT_INV_DOC_NO = <ls_docref>-INT_INV_DOC_NO.
<ls_beleg>-INBOUND_REF_TYPE = <ls_docref>-INBOUND_REF_TYPE.
<ls_beleg>-INBOUND_REF_NO = <ls_docref>-INBOUND_REF_NO.
<ls_beleg>-INBOUND_REF = <ls_docref>-INBOUND_REF.
<ls_beleg>-INBOUND_REF_K = <ls_docref>-INBOUND_REF_K.

<ls_beleg>-G_ABRMENGE =
<ls_beleg>-v_abrmenge + <ls_beleg>-n_abrmenge.

MOVE-CORRESPONDING <ls_beleg> TO lt_data.


Read Table lt_temp_tab assigning <fs_temp>
where BELNR = <fs_beleg>-INBOUND_REF_K
AND BELZEILE = <fs_beleg>-BELZEILE.

if sy-subrc = 0.
ls_data-nettobtr = <fs_temp>-nettobtr.
ls_data-twaers = <fs_temp-twaers.
endif.


Read Table lt_temp_tabelle assigning <fs_temp_tbl>
where INT_INV_NO = <ls_docref>-INT_INV_NO.

if sy-subrc = 0.
ls_data-created_on = <fs_temp_tbl>-created_on.
ls_data-changed_on = <fs_temp_tbl>-changed_on.
endif.

Read Table lt_data assigning <fs_data>
where INT_INV_DOC_NO = <fs_docref>-INT_INV_DOC_NO.
if sy-subrc = 0.
ls_data-INT_INV_DOC_NO = <fs_data>-INT_INV_DOC_NO.
endif.


APPEND ls_data TO lt_data


ENDLOOP.

ENDIF.

ENDLOOP.

APPEND lt_data TO E_T_DATA.

Viele Gr+ße

Folgende Benutzer bedankten sich beim Autor RockyAM für den Beitrag:
Foxbat


Re: Optimierung eines LOOPS

Beitrag von Foxbat (ForumUser / 4 / 5 / 0 ) »
Vielen Dank, ich denke ich hab das soweit verstanden. Werde ich gleich ausprobieren.

Gruss
Foxbat

Re: Optimierung eines LOOPS

Beitrag von casman (Specialist / 420 / 1 / 63 ) »
Rocky, täusch ich mich oder:

Code: Alles auswählen.

LOOP AT lt_docref ASSIGNING <ls_docref>.
MOVE <ls_docref>-INBOUND_REF(12)
TO <ls_docref>-INBOUND_REF_K.
muss zu allererst kommen, da ja damit die INBOUND_REF_K für den Zugriff auf die DBERCHZ1 ermöglicht wird.

:)

Folgende Benutzer bedankten sich beim Autor casman für den Beitrag:
Foxbat


Re: Optimierung eines LOOPS

Beitrag von RockyAM (ForumUser / 30 / 0 / 7 ) »
Ich glaube du täuschst dich, da die lt_docref zu diesem Zeitpunkt schon komplett vorhanden und mit dem For ALL ENTRIES auf die DBERCHZ1 zugegriffen werden kann ;-).

Folgende Benutzer bedankten sich beim Autor RockyAM für den Beitrag:
Foxbat


Re: Optimierung eines LOOPS

Beitrag von casman (Specialist / 420 / 1 / 63 ) »
Sorry, es geht mir nicht um den Zugriff, aber die

Code: Alles auswählen.

MOVE <ls_docref>-INBOUND_REF(12)
        TO <ls_docref>-INBOUND_REF_K.
führt doch dazu, dass nur die ersten 12 Stellen der INBOUND_REF_K als im SELECT als Belegnummer betrachtet werden können. Ansonsten wäre die INBOUND_REF_K zu lang...

Der erste Zugriff müsste dann heißen:

Code: Alles auswählen.

SELECT BELZEILE STGRQNT STGRAMT V_ABRMENGE N_ABRMENGE MASSBILL
FROM DBERCHZ1
FOR ALL ENTRIES IN lt_docref
INTO CORRESPONDING FIELDS OF TABLE lt_beleg
WHERE BELNR = lt_docref-INBOUND_REF_K(12).
Verträgt das SELECT eine Längenangabe im Vergleichoperand?

Folgende Benutzer bedankten sich beim Autor casman für den Beitrag:
Foxbat


Re: Optimierung eines LOOPS

Beitrag von RockyAM (ForumUser / 30 / 0 / 7 ) »
Hallo casman,

jetzt verstehen wir uns :-)) klaro du hast natürlich vollkommen Recht ;-).
War ja nur schnell runtergehakt, der Fehler sei mir verziehn.

Und ja Select müsste damit umgehen können, habs jetzt zwar nicht explizit getestet aber beim READ funktioniert es auch, daher gehe ich mal
davon aus, dass das Select auch damit umgehen kann ;-)

Gruß

Folgende Benutzer bedankten sich beim Autor RockyAM für den Beitrag:
Foxbat


Re: Optimierung eines LOOPS

Beitrag von Foxbat (ForumUser / 4 / 5 / 0 ) »
Hallo Zusammen,

der Select kann damit umgehen. Es funktioniert auch wenn beide Felder unterschiedliche Längen haben, was er dann anmeckert und man dann die Zeichen auf die relevanten Stellen begrenzt.

Gruss
Foxbat

Seite 1 von 1

Vergleichbare Themen

1
Antw.
196
Views
Verschachtelte Loops
von ABAPlerv » 03.04.2022 08:30 • Verfasst in ABAP® für Anfänger
3
Antw.
1944
Views
Loops Zusammenfassen
von BMWi801 » 15.05.2018 13:23 • Verfasst in ABAP® Core
3
Antw.
5225
Views
wie vermeide ich nested loops?
von c oco » 31.05.2012 17:38 • Verfasst in ABAP® für Anfänger
5
Antw.
1663
Views
sap gui optimierung ?!
von sml » 30.01.2006 12:01 • Verfasst in Basis
13
Antw.
4947
Views
Report Optimierung
von Alexandra » 06.12.2007 12:13 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


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

Aktuelle Forenbeiträge

Zugriff auf Daten via Webdav
vor 16 Stunden von msfox 1 / 31
Interne Tabelle
vor 16 Stunden von sap_enthusiast 3 / 162
Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71

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

Zugriff auf Daten via Webdav
vor 16 Stunden von msfox 1 / 31
Interne Tabelle
vor 16 Stunden von sap_enthusiast 3 / 162
Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71

Unbeantwortete Forenbeiträge

Zugriff auf Daten via Webdav
vor 16 Stunden von msfox 1 / 31
Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 111