Report Optimierung

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

Report Optimierung

Beitrag von Alexandra (ForumUser / 26 / 0 / 0 ) »
Hallo ihrs,

könnt ihr mir Tipps geben, wie ich den folgenden Report optimieren kann? Der verursacht doch einiges an Datenbank Zugriffszeit...

Danke und liebe Grüße Alex

Code: Alles auswählen.

Code zur besseren Lesbarkeit des Threads entfernt...
Zuletzt geändert von Alexandra am 10.12.2007 10:16, insgesamt 1-mal geändert.

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


Re: Report Optimierung

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
Alexandra hat geschrieben:Hallo ihrs,
könnt ihr mir Tipps geben, wie ich den folgenden Report optimieren kann? Der verursacht doch einiges an Datenbank Zugriffszeit...
Lies nur die Daten die du wirklich brauchst. Kein * wenn du aus der Zielmenge nur 2-3 Felder brauchst.
Mit einem Join können der Materialdaten auf einen Schlag gelesen werden. Zudem entfallen dann je 3 Sort und READ BINARYs.


Hier ein Beispiel:

Code: Alles auswählen.


* interne Tabellen
data: begin of gt_material occurs 0,
           matnr  TYPE makt-mara,
           maktx TYPE makt-maktx,
           ntgew TYPE mara-ntgew,
           gewei TYPE  mara-gewei,
           zzlkla TYPE mara-zzlkla
           zzassp TYPE mara-zzassp
           stawn TYPE marc-stawn.
         end of gt_amterial


*&---------------------------------------------------------------------*
*&      Form  READ_MATERAIL
*&---------------------------------------------------------------------*
form read_material.

  clear:   gt_material.
  refresh: gt_material.

  check not i_equi[] is initial.

  select makt~matnr
         makt~maktx
         mara~ntgew
         mara~gewei
         mara~zzlkla
         mara~zzassp
         marc~stawn
  into table gt_material
  from makt
  join mara ON mara~matnr = makt~matnr
  join marc ON marc~matnr = makt~matnr          
  for all entries in i_equi
  where makt~matnr = i_equi-matnr
     and makt~spras = 'DE
     and marc~werks = '20'.

  sort gt_material by matnr.
endform.                    " READ_MATERAIL

*&---------------------------------------------------------------------*
*&      Form  wb
*&---------------------------------------------------------------------*
form wb.

  clear:   i_equi, gt_material.
  refresh: wb, wb2.

  loop at i_equi.

    if i_equi-equnr(1) ne 'W'.
      shift i_equi-equnr by 8 places.
    endif.

    read table gt_material with key matnr = i_equi-matnr binary search.

    move:  i_equi-equnr to wb-equnr,
           i_equi-matnr to wb-matnr,
           gt_material-maktx to wb-maktx,
           gt_material-ntgew to wb-ntgew,
           gt_material-gewei to wb-gewei,
           gt_material-stawn to wb-stawn.

    if gt_material-zzlkla ne ''.
      move i_mara-zzlkla to wb-zzlkla.
    else.
      move i_mara-zzassp to wb-zzlkla.
    endif.

    append wb.

    move wb-ntgew to gewi.

    concatenate wb-equnr
                wb-matnr
                wb-maktx
                gewi
                wb-gewei
                wb-stawn
                wb-zzlkla
           into wb2 separated by '|'.

    append wb2.

    clear:   i_equi, i_mara, i_makt, wb, wb2.
  endloop.

  loop at wb2.
    write: / wb2-datxt.
  endloop.
endform.                    " wb
Zuletzt geändert von JHM am 06.12.2007 14:04, insgesamt 1-mal geändert.
Gruß Hendrik

Beitrag von hjstruebig (ForumUser / 49 / 0 / 0 ) »
Servus Alexandra,

pfui ;-). Also - zunächst einmal hast Du es Dir natürlich einfach gemacht in dem Du über die komplette Tabellenbreite liest. Lesen nur die Daten aus den einzelnen Tabellen, die Du auch benötigst.

Also nicht select * from mara sonder select matnr matkl ... from mara

Das gilt für jede Tabelle, die Du anfasst.

Dann ist mir aufgefallen: Du überprüfst nicht, ob der erste Selekt auf die EQUI erfolgreich war. Wenn nicht, dann ist deine itab i_equi leer und Dein darauf folgender select auf die makt liest dann sämtliche Einträge.

Stelle ausserdem die Reihenfolge um. Zuerst die MARC mit einem left-outer join auf die MARA.
Dann select auf die MAKT. Den ohne Join, da der Join auf eine Texttabelle Zeit kostet.

Das sollte schon einiges verbessern.

Grüsse...
...Jochen

PS: Immer überprüfen, ob ein select erfolgreich war!

Beitrag von Alexandra (ForumUser / 26 / 0 / 0 ) »
hi,

danke für eure Tipps, die ich auch schon weitesgehend umgesetzt hab :D
Aber eine Frage hab ich noch..

Dieses Select

Code: Alles auswählen.

  SELECT makt~matnr
         makt~maktx
         mara~ntgew
         mara~gewei
         mara~zzlkla
         mara~zzassp
         marc~stawn
  INTO TABLE gt_material
  FROM makt
  JOIN mara ON mara~matnr = makt~matnr
  JOIN marc ON marc~matnr = makt~matnr
  FOR ALL entries IN i_equi
  WHERE makt~matnr = i_equi-matnr
     AND makt~spras = 'DE'
     AND marc~werks = '20'.
liefert mir gar kein Ergebnis, wenn es zu dem Material keinen Eintrag in Werk 20 in der Tabelle MARC gibt. Wie kann ich es erreichen, dass das nur das Feld stawn leerbleibt und nicht gleich der ganze Datensatz??

Danke Alex

Beitrag von poldi (Specialist / 116 / 0 / 0 ) »
Hallo Alex,

statt JOIN MARC -> LEFT OUTER JOIN MARC. Aber alles ohne Garantie. Ich habe es nicht ausprobiert. Hinter LEFT OUTER JOIN darf aber kein weiteres JOIN folgen.

Viele Grüße
Wilfried
Wir sind lustig und haben es gar nicht nötig!

Beitrag von khb (Specialist / 184 / 7 / 1 ) »
Hallo,
siehe auch F1-Hilfe zu select - join:
...Der äußere Join erstellt im Prinzip die gleiche Ergebnismenge wie der innere Join mit dem Unterschied, dass für jede selektierte Zeile der linken Seite mindestens eine Zeile in der Ergebnismenge erzeugt wird, auch wenn keine Zeile der rechten Seite die Bedingung join_cond erfüllt. Die Spalten der rechten Seite, die die Bedingung join_cond nicht erfüllen, werden mit Null-Werten gefüllt.
...
...

Beispiel
Verknüpfung der Spalten carrid, carrname und connid der Datenbanktabellen scarr und spfli über einen äußeren Join. Bei allen Flügen, die nicht von p_cityfr ausgehen, wird die Spalte connid auf den Null-Wert gesetzt, der bei der Übergabe an das zugeordnete Datenobjekt in den typgerechten Initialwert verwandelt wird. Die LOOP-Schleife gibt alle Fluggesellschaften aus, die nicht von p_cityfr fliegen.

PARAMETERS p_cityfr TYPE spfli-cityfrom.

DATA: BEGIN OF wa,
carrid TYPE scarr-carrid,
carrname TYPE scarr-carrname,
connid TYPE spfli-connid,
END OF wa,
itab LIKE SORTED TABLE OF wa
WITH NON-UNIQUE KEY carrid.

SELECT s~carrid s~carrname p~connid
INTO CORRESPONDING FIELDS OF TABLE itab
FROM scarr AS s
LEFT OUTER JOIN spfli AS p ON s~carrid = p~carrid
AND p~cityfrom = p_cityfr.

LOOP AT itab INTO wa.
IF wa-connid = '0000'.
WRITE: / wa-carrid, wa-carrname.
ENDIF.
ENDLOOP.
hth khb

Beitrag von Alexandra (ForumUser / 26 / 0 / 0 ) »
hi,

hhmm ...
In der WHERE-Bedingung dürfen keine Felder aus der rechten Tabelle
eines LEFT OUTER JOIN auftreten: "MARC~WERKS".
Muss ich demnach die MARC extra lesen? Wie mache ich das am performantesten?

Danke und Gruß Alex

Beitrag von poldi (Specialist / 116 / 0 / 0 ) »
Hallo Alexandra,

wenn zur MAKT in der MARA ein Satz gefunden wird (sollte immer zutreffen) wird dieser zur entsprechenden Selektion bereitgestellt unabhängig davon, ob in der MARC ein Eintrag vorhanden ist. Die MARC muß nicht extra gelesen werden.

Hier mal ein größerer JOIN (INNER JOIN ist wie JOIN)

SELECT mara~zzfsfabn1 mara~matnr
mseg~mblnr mseg~matnr mseg~erfmg mseg~erfme mseg~charg mseg~werks
mseg~bwart mseg~mjahr mseg~zeile mseg~sgtxt mseg~aufnr
mkpf~budat mkpf~mblnr mkpf~mjahr
makt~matnr makt~maktx
afpo~aufnr afpo~sernr afpo~matnr afpo~psmng
FROM ( mara
INNER JOIN mseg
ON mseg~matnr = mara~matnr
INNER JOIN mkpf
ON mkpf~mblnr = mseg~mblnr
AND mkpf~mjahr = mseg~mjahr
INNER JOIN makt
ON makt~matnr = mseg~matnr
INNER JOIN afpo
ON afpo~aufnr = mseg~aufnr )
INTO (mara_zzfsfabn1,mara_matnr,
mseg_mblnr,mseg_matnr,mseg_erfmg,mseg_erfme,mseg_charg,mseg_werks,
mseg_bwart,mseg_mjahr,mseg_zeile,mseg_sgtxt,mseg_aufnr,
mkpf_budat,mkpf_mblnr,mkpf_mjahr,
makt_matnr,makt_maktx,
afpo_aufnr,afpo_sernr,afpo_matnr,afpo_psmng)
FOR ALL ENTRIES IN seltab
WHERE mara~matnr = seltab-matnr
AND mseg~werks = werks
AND mseg~bwart = '261'
AND mkpf~budat IN budat
AND makt~spras = sy-langu
AND afpo~sernr GE serievon
AND afpo~sernr LE seriebis.


Viele Grüße
Wilfired
Wir sind lustig und haben es gar nicht nötig!

Beitrag von Alexandra (ForumUser / 26 / 0 / 0 ) »
hallo,

danke für deine Antwort.Ich benötige aber auch Daten aus der MARC, demzufolge muss ich die doch auch lesen oder hege ich da grad einen falschen Gedanken??

Allerdings kann ich anscheinend nicht eine Tabelle in ein Join UND die where Klausel einschließen...

:-(

Gruß Alex

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
Alexandra hat geschrieben: danke für deine Antwort.Ich benötige aber auch Daten aus der MARC, demzufolge muss ich die doch auch lesen oder hege ich da grad einen falschen Gedanken??
Nicht unbendingt, s.u.

Code: Alles auswählen.

  SELECT makt~matnr 
         makt~maktx 
         mara~ntgew 
         mara~gewei 
         mara~zzlkla 
         mara~zzassp 
         marc~stawn 
  INTO TABLE gt_material 
  FROM mara 
  JOIN makt ON mara~matnr = makt~matnr 
  LEFT JOIN marc 
         ON marc~matnr = makt~matnr 
        AND marc~werks = '20'       
  FOR ALL entries IN i_equi 
  WHERE mara~matnr = i_equi-matnr 
    AND makt~spras = 'DE'. 
Gruß Hendrik

Beitrag von Alexandra (ForumUser / 26 / 0 / 0 ) »
Guten Morgen,

na, also muss ich doch aus der MARC lesen :-))

Danke, das sieht soweit richtig gut aus. Das einzige was mir noch gerade aufgefallen ist .. wenn es zu einem Datensatz (zu einem Equipment) keine Materialnr. gibt, wird kein leerer Datensatz angezeigt sondern die Daten vom vorherigen.

Kann mir jemand noch einen Tipp geben, wie ich das umgehen kann?

Danke für die vielen hilfreichen Antworten. Haben mich echt ein ganz schönes Stückchen vorangebracht und helfen mir vor allem auch bei der Erstellung von weiteren Reports (*Forum mit Suchfunktion als Startseite im Browser hinterleg*) :-)

Gruß Alex

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
Alexandra hat geschrieben: wenn es zu einem Datensatz (zu einem Equipment) keine Materialnr. gibt, wird kein leerer Datensatz angezeigt sondern die Daten vom vorherigen.

Kann mir jemand noch einen Tipp geben, wie ich das umgehen kann?
Entweder ein CLEAR vor dem READ TABLE (dann werden leere Werte zugewiesen) oder aber den SY-SURC nach dem READ TABLE auswerten (bei 0 Mat-Satz gelesen -> zuweisen, bei 4 kein Mat-Satz -> kein zuweisen)
Gruß Hendrik

Beitrag von Alexandra (ForumUser / 26 / 0 / 0 ) »
hi,

danke für deine Antwort. Auf das Clear bin ich sogar noch selbst gekommen :-)

Auf das mit dem Sy-Subrc abfragen wär ich aber nicht gekommen; danke für den Tipp!

Viele grüße Alex

Beitrag von Alexandra (ForumUser / 26 / 0 / 0 ) »
hallo nochmal,

ich hab da mal noch 'ne Frage .. ich hab noch ein wenig geforscht und bin über die Funktion "group by" gestolpert. Allerdings versteh ich die nicht so ganz, denke aber das sie evtl. sinnvoll wäre da ich zu jeder Equipment Nummer immer das Material, den Materialtext usw. lese

Wäre es nicht sinnvoll den Text usw nur einmal zu lesen und entsprechend wieder auszugeben? Wenn ja, mit group by?

Danke Alex

Seite 1 von 1

Vergleichbare Themen

5
Antw.
1947
Views
sap gui optimierung ?!
von sml » 30.01.2006 12:01 • Verfasst in Basis
5
Antw.
2436
Views
Code Optimierung
von Mischi83 » 23.03.2017 14:08 • Verfasst in ABAP® für Anfänger
2
Antw.
3584
Views
Performance Optimierung
von honeyjam » 21.03.2011 09:17 • Verfasst in ABAP® für Anfänger
6
Antw.
3704
Views
Code optimierung
von swonny » 29.06.2007 08:59 • Verfasst in ABAP® für Anfänger
2
Antw.
1858
Views
Hilfe bei Select-Optimierung
von Troilus » 14.12.2007 14:47 • Verfasst in ABAP® Core

Über diesen Beitrag


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

Aktuelle Forenbeiträge

Trennen Strasse und Hausnummer
vor 27 Minuten von ralf.wenzel 16 / 10767
Dialog-Container mit Toolbar/Status
vor 34 Minuten von black_adept gelöst 25 / 3900
User Exit EXIT_RQCPRM10_001
vor 21 Stunden von a-dead-trousers 2 / 355
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1408

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

Trennen Strasse und Hausnummer
vor 27 Minuten von ralf.wenzel 16 / 10767
Dialog-Container mit Toolbar/Status
vor 34 Minuten von black_adept gelöst 25 / 3900
User Exit EXIT_RQCPRM10_001
vor 21 Stunden von a-dead-trousers 2 / 355
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1408

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2937
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9531