1. Die im Batch erzeugte Liste war vollständig, aber Du hast Dir nur die ersten 10 Seiten angesehen, beim zweiten mal wurde das Programm im Dialog gestartet und Du hast die komplette Liste gesehen.Slim_Chance hat geschrieben:Wie kann sowas passieren?
Code: Alles auswählen.
SELECT * FROM vbrk WHERE vbeln IN s_vbeln AND
vkorg IN s_vkorg AND
erdat IN s_erdat.
CLEAR flag.
IF sy-subrc = 0.
Code: Alles auswählen.
SELECT * FROM vbrp WHERE vbeln = vbrk-vbeln AND
cuobj = space.
IF sy-subrc = 0.
SELECT SINGLE matnr vkorg prodh
INTO CORRESPONDING FIELDS
OF wa_matnr FROM mvke WHERE matnr = vbrp-matnr AND
vkorg = vbrk-vkorg.
Wenn man Massendaten auswertet, ist das mit der Performance und dem Speicherverbrauch sicher richtig.Frank Münker hat geschrieben: - Warum machst Du zweimal einen "SELECT * " wenn Du nur eine Handvoll Felder brauchst ? VBRK und VBRP haben zusammen 328 (!) Felder, die Du jedesmal durchs Netzwerk pumpst, aber wenn ich richtig gezählt habe, benötigst Du ganze 4 davon.
Auch wenn für Dich selbst die Performance egal sein mag, Deine Mituser würden es Dir sicherlich danken ...
Also, im konkreten Beispiel hier sehe ich bis zu 10.000 Rechnungsköpfe. Auch wenn jede Rechnung nur eine einzige Position hat, ergeben sich damit schon 20.000 Einzel-Selects. Da kann man nicht mehr wirklich von "frisst ja kein Brot" reden. Und wenn ich richtig gerechnet habe, werden durch die SELECT * - Anweisungen etwa 40 MB durchs Netzwerk bewegt, anstatt nur ca. 2 MB ohne den ganzen Overhead. Ich finde, das sollte man nicht unterschätzen.Wenn man Massendaten auswertet, ist das mit der Performance und dem Speicherverbrauch sicher richtig.
Für die Wartbarkeit ist SELECT * angenehmer.
Und in Dialog-Transaktionen oder bei Auswertung sehr kleiner Datenbestände würde ich auch immer SELECT (SINGLE) * nehmen und nicht SELECT feld1 feld7 feld9 feld27 ..., auch aus Performance-Gründen!