Code: Alles auswählen.
Code zur besseren Lesbarkeit des Threads entfernt...
Lies nur die Daten die du wirklich brauchst. Kein * wenn du aus der Zielmenge nur 2-3 Felder brauchst.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...
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
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'.
hth khb...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.
Nicht unbendingt, s.u.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??
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'.
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)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?