Code optimierung

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

Code optimierung

Beitrag von swonny (Specialist / 102 / 10 / 2 ) »
Hallo liebe abapuser,

ich habe folgenden report geschrieben, nun werden eingtlich bei der abfrage keine riesigen datenmengen bewegt, dennoch ist dieser report recht langsam.

Könntet Ihr mir ein paar performance tipps geben?

Grüße und ein schönes WE

Code: Alles auswählen.

DATA: begin of iNBEW occurs 0,
FALNR       like  N1ANF-PATNR,
BWIDT       like  NBEW-BWIDT,
 end of iNBEW.

DATA: begin of iNLEM occurs 0,
ANFID       like  NLEM-ANFID,
IBGDT       like  NLEM-IBGDT,
end of iNLEM.

DATA: begin of iN1ANF occurs 0,                "Ausgabe
FALNR       like  N1ANF-FALNR,
PATNR       like  N1ANF-PATNR,
ANFID       like  N1ANF-ANFID,
IBGDT       like  NLEM-IBGDT,
ERDAT       like  N1ANF-ERDAT,
TAGE        TYPE  i,
end of iN1ANF.

clear iN1ANF.      refresh iN1ANF.
clear iNLEM.       refresh iNLEM.

SELECT FALNR BWIDT  FROM NBEW into corresponding fields of table iNBEW
 WHERE  FALNR  BETWEEN S_FALLNR-LOW AND S_FALLNR-HIGH
 AND    BWART    = 'OP'
 AND    STORN    = ' '.

SELECT ANFID IBGDT FROM NLEM CLIENT SPECIFIED INTO CORRESPONDING FIELDS OF TABLE iNLEM for all entries in iNBEW
WHERE FALNR = iNBEW-FALNR
AND   IBGDT = iNBEW-BWIDT
AND   ERBOE = 'OP'
AND   OPNR  = ' '
AND   STOID = ' '.

 SELECT FALNR PATNR ERDAT ANFID  FROM N1ANF CLIENT SPECIFIED into corresponding fields of table iN1ANF for all entries in iNLEM
 WHERE  ANFID = iNLEM-ANFID.

LOOP AT iNLEM.
LOOP AT iN1ANF WHERE ANFID = iNLEM-ANFID.
MOVE-CORRESPONDING iNLEM TO iN1ANF.
MODIFY iN1ANF.
ENDLOOP.
ENDLOOP.

LOOP AT iN1ANF.
iN1ANF-TAGE =  iN1ANF-IBGDT - iN1ANF-ERDAT.
MODIFY iN1ANF.

DELETE ADJACENT DUPLICATES FROM iN1ANF
COMPARING ANFID.
ENDLOOP.

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


Beitrag von khb (Specialist / 184 / 7 / 1 ) »
Hallo swonny,

mir sind 2 Dinge aufgefallen:

1.

Code: Alles auswählen.

LOOP AT iNLEM. 
LOOP AT iN1ANF WHERE ANFID = iNLEM-ANFID. 
MOVE-CORRESPONDING iNLEM TO iN1ANF. 
MODIFY iN1ANF. 
ENDLOOP. 
ENDLOOP
Ersetze den 2. loop mal durch ein read table ... binary search.
Dazu muss die iN1ANF nach ANFID sortiert sein.

2.

Code: Alles auswählen.

LOOP AT iN1ANF. 
iN1ANF-TAGE =  iN1ANF-IBGDT - iN1ANF-ERDAT. 
MODIFY iN1ANF. 

DELETE ADJACENT DUPLICATES FROM iN1ANF 
COMPARING ANFID. 
ENDLOOP
nimm das delete adjacent aus dem loop.
machden modiy und sortiere die Tabelle nach dem loop. Anschließend kannst du das delete adjacent machen.

Gruß khb

Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
Hi!
mach mal eine Laufzeitanalyse (SE30), dann siehst du, wo genau viel Zeit verbraucht wird. Evtl. ist es ein Select, bei dem du zu wenig keyfelder mitgibst und es keinen Index auf der Tabelle gibt.

Kleine Verbesserungen dürfte noch bringen:

Code: Alles auswählen.

LOOP AT itab ASSIGNING <wa>
anstelle von

Code: Alles auswählen.

loop at itab. Modify...
und

Code: Alles auswählen.

SELECT INTO TABLE
anstelle von

Code: Alles auswählen.

SELECT INTO CORRESPONDING FIELDS OF TABLE
Bei ...FOR ALL ENTRIES IN itab... musst du sicherstellen, dass die Tabelle ITAB auch Daten enthält. Ansonsten wird der Select über die gesamte Tabelle gemacht.

Vielleicht hilft dir das auch noch: http://www.tricktresor.de/content/index ... =110&aID=0

Gruß,

Re: Code optimierung

Beitrag von ralf.wenzel (Top Expert / 3923 / 200 / 280 ) »

Code: Alles auswählen.

clear iN1ANF.      refresh iN1ANF.
clear iNLEM.       refresh iNLEM. 
Wenn du mit ordentlich deklarierten Tabellen arbeitest, kannst du "refresh" durch "clear" ersetzen - ist ne Stilfrage, finde ich besser. Hat aber mit der Geschwindigkeit des Reports nix zu tun.

Code: Alles auswählen.

SELECT FALNR BWIDT  FROM NBEW into corresponding fields of table iNBEW
"into corresponding fields" sollte man vermeiden, wo immer es geht, weil es Laufzeit frisst. Besser ist es, in eine Tabelle gleicher Struktur zu selektierenmit "into table".

Das kann sogar schneller sein als ein anschließendes Kopieren in eine anders strukturierte itab.

Code: Alles auswählen.

for all entries in iNBEW
Man darf nie vergessen, VOR einem SOLCHEN select immer zu prüfen, ob die itab (hier iNBEW) nicht leer ist. In diesem Falle wird nämlich die ganze Tabelle selektiert!

Zum LOOP und zum DELETE ADJACENT wurde hier ja schon was gesagt.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Code optimierung

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
swonny hat geschrieben:Könntet Ihr mir ein paar performance tipps geben?
DAS INTO CORRESPONDING FILEDS bei den SELECTS kannst du rausnehmen. Da die ITABS genau die Felder in richtiger Reihenfolge enthalten, die du liest
werden die gelesenen Felder von links nach rechts in die ITAB übernommen. Die sparst so die Zeit des Feldvergleichs.

Anstatt MOVE-CORRESPONDING lieber die Felder einzeln zuweisen, dass spart die Zeit des Vergleichens.

Evtl. die Selects mittels Join in einen Select packen, das kann auch Zeit sparen.
Gruß Hendrik

Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
Hi swonny,

du solltest aus der NBEW auch noch das Feld EINRI selektieren, denn dann kannst du den Index~4 von NLEM komplett versorgen.

Beitrag von swonny (Specialist / 102 / 10 / 2 ) »
ewx hat geschrieben:Hi!
mach mal eine Laufzeitanalyse (SE30), dann siehst du, wo genau viel Zeit verbraucht wird. Evtl. ist es ein Select, bei dem du zu wenig keyfelder mitgibst und es keinen Index auf der Tabelle gibt.
Ja, das ist glaube ich der hauptgrund, ich habe wirklich nicht gerade eindeutige keyfelder bzw zu wenige.

Liebe Mitglieder danke für die tollen tipps werde nun versuchen alle umzusetztren

Grüße
talla

Seite 1 von 1

Vergleichbare Themen

5
Antw.
2429
Views
Code Optimierung
von Mischi83 » 23.03.2017 14:08 • Verfasst in ABAP® für Anfänger
5
Antw.
1943
Views
sap gui optimierung ?!
von sml » 30.01.2006 12:01 • Verfasst in Basis
2
Antw.
3580
Views
Performance Optimierung
von honeyjam » 21.03.2011 09:17 • Verfasst in ABAP® für Anfänger
13
Antw.
5444
Views
Report Optimierung
von Alexandra » 06.12.2007 12:13 • 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

Über diesen Beitrag


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

Aktuelle Forenbeiträge

Zeilenumbrüche ersetzen
vor 2 Stunden von rob_abc 4 / 30
Dialog-Container mit Toolbar/Status
vor 22 Stunden von tar gelöst 19 / 2088
SAP Trial Version für SAP Fiori
Gestern von tar 2 / 1444

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

Zeilenumbrüche ersetzen
vor 2 Stunden von rob_abc 4 / 30
Dialog-Container mit Toolbar/Status
vor 22 Stunden von tar gelöst 19 / 2088
SAP Trial Version für SAP Fiori
Gestern von tar 2 / 1444

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
Gestern von Bright4.5 1 / 508
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2143
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8739