Nein, normal ist das nicht!Anonymous hat geschrieben:Morgen,
mal eine Frage an die Leute von der Basis:
Kann es sein, dass eine Selektion mit einem Report auf die Tabelle BKPF und BSEG, wo ca 100.000 DS selektiert werden, mehrere Stunden dauert?
Oder ist da was falsch konfiguriert?
Mfg
Falsch konfiguriert wohl nicht, aber deine Datenselektion gilt es zu optimieren. Poste sie doch mal, dann werden wir uns darauf stürzen *gAnonymous hat geschrieben:Morgen,
mal eine Frage an die Leute von der Basis:
Kann es sein, dass eine Selektion mit einem Report auf die Tabelle BKPF und BSEG, wo ca 100.000 DS selektiert werden, mehrere Stunden dauert?
Oder ist da was falsch konfiguriert?
Mfg
Code: Alles auswählen.
* Selektion BKPF & BSEG
SELECT * FROM bkpf CLIENT SPECIFIED
INTO CORRESPONDING FIELDS OF wa_bkpf
WHERE mandt EQ sy-mandt
AND bukrs EQ sbukrs
AND gjahr EQ sgjahr
AND monat EQ smonat
AND budat IN sbudat.
APPEND wa_bkpf TO it_bkpf.
SELECT * FROM bseg CLIENT SPECIFIED
INTO CORRESPONDING FIELDS OF wa_bseg
WHERE mandt = sy-mandt
AND bukrs EQ sbukrs
AND gjahr EQ sgjahr
AND belnr EQ wa_bkpf-belnr.
APPEND wa_bseg TO it_bseg.
CLEAR wa_bseg.
ENDSELECT.
CLEAR wa_bkpf.
ENDSELECT.
Also, auf den ersten Blick und ohne gerade viel Zeit zu haben, würde ich sofort die Verschachtelung der zwei selects entfernen.Anonymous hat geschrieben:na dann mal viel spass damit
Code: Alles auswählen.
* Selektion BKPF & BSEG SELECT * FROM bkpf CLIENT SPECIFIED INTO CORRESPONDING FIELDS OF wa_bkpf WHERE mandt EQ sy-mandt AND bukrs EQ sbukrs AND gjahr EQ sgjahr AND monat EQ smonat AND budat IN sbudat. APPEND wa_bkpf TO it_bkpf. SELECT * FROM bseg CLIENT SPECIFIED INTO CORRESPONDING FIELDS OF wa_bseg WHERE mandt = sy-mandt AND bukrs EQ sbukrs AND gjahr EQ sgjahr AND belnr EQ wa_bkpf-belnr. APPEND wa_bseg TO it_bseg. CLEAR wa_bseg. ENDSELECT. CLEAR wa_bkpf. ENDSELECT.
Code: Alles auswählen.
* Selektion BKPF & BSEG
select * from bkpf
into corresponding fields of table it_bkpf
where bukrs eq sbukrs
and budat in sbudat.
if not it_bkpf[] is initial.
select * from bseg
into corresponding fields of table it_bseg
for all entries in it_bkpf
where bukrs eq it_bkpf-bukrs
and gjahr eq it_bkpf-gjahr
and belnr eq it_bkpf-belnr.
endif.
Code: Alles auswählen.
DATA: lt_belnr TYPE TABLE OF belnr_d.
CLEAR: it_bseg[].
SELECT belnr
FROM bkpf
INTO TABLE lt_belnr
PACKAGE-SIZE 500
WHERE bukrs EQ sbukrs
AND gjahr EQ sgjahr
AND monat EQ smonat
AND budat IN sbudat.
SELECT *
FROM bseg
APPENDING TABLE it_bseg
FOR ALL ENTRIES IN lt_belnr
WHERE bukrs EQ sbukrs
AND gjahr EQ sgjahr
AND belnr EQ lt_belnr-table_line.
ENDSELECT.
Das ist grundsätzlich suboptimal, aus einem Variablennamen sollten die wichtigsten Eigenschaften der Variable hervorgehen. Ist es eine Tabelle? Oder eine Range? oder ein unstrukturiertes Feld? Das sollte man schon am Namen ablesen können -- ansonsten kannst du die Variablen auch "Peter" und "Susi" nennen.Florian hat geschrieben:die ganzen variablen sbukrs etc sind schon richtig, eingetragen, habs halt nur einfach so benannt egal ob es select options oder paramenter sind.
Das funktioniert immer, die Feldliste muss halt genauso aussehen wie die itab, das ist wichtig dabei.Florian hat geschrieben:funktioniert "select into table itab" auch wenn ich denn nur ein paar felder selektiere, also z.B. "selekt mandt, belnr, monat, ... from bkpf into table itab" ?
Code: Alles auswählen.
DATA:
lt_bkpf TYPE TABLE OF bkpf,
lt_bseg TYPE TABLE OF bseg.
SELECT <feldliste>
FROM BKPF
INTO CORRESPONDING FIELDS OF TABLE lt_bkpf
WHERE bukrs EQ p_bukrs "p_bukrs => Parameter
AND <bedingungen>.
IF sy-subrc EQ 0. "nur dann hat lt_bkpf einen Inhalt
SELECT <feldliste>
FROM BSEG
INTO CORRESPONDING FIELDS OF TABLE lt_bkpf
FOR ALL ENTRIES IN lt_bkpf
WHERE bukrs EQ lt_bkpf-bukrs
AND belnr EQ lt_bkpf-belnr
AND gjahr EQ lt_bkpf-gjahr.
ENDIF.
Wäre ja auch kein Problem. Den SELECT auf die BKPF in eine "temporäre" ITab mit allen Feldern, die benötigt werden. Vor dem ENDSELECT werden dann die Zeilen der temporären ITab mittels "APPEND LINES OF" an die "Nutz-ITab" angehängt. Auf jeden Fall läuft der SELECT auf die BSEG wesentlich schneller, da massenhaft Sätze verarbeitet werden.ereglam hat geschrieben: @Haubi
Florian hat in einem seiner Postings angegeben, dass er die beiden Tabellen noch für spätere Schritte benötigt. Daher ist die Verwendung von PACKAGE-SIZE nur dann zu empfehlen, wenn die nachfolgenden Schritte sich in der Schleife abspielen würden.
Nein, darfst du nicht *lach*ereglam hat geschrieben:darf ich noch anmerken, dass ein CLIENT SPECIFIED nur benutzt werden sollte, wenn auch mandantenübergreifend selektiert werde soll, was hier aber nicht der Fall ist. (abgesehen davon dass es auch unsinnig wäre)
Gibts das überhaupt? Eigentlich nicht, oder? Welches theoretische Konstrukt würde dazu führen dass man eine SELECT-Schleife verwenden *muss*?ereglam hat geschrieben:SELECT-Schleifen verwende ich nur, wenn es absolut keinen anderen Weg gibt...
Der Fall ist immer problematisch.black_adept hat geschrieben:ralf.wenzel hat geschrieben:Beispiel:
Innerhalb der SELECT-Schleife wird eine asynchrone Task gestartet ( Um den COMMIT innerhalb des SELCECt zu vermeiden ), die Daten in die Tabelle einfügt, über die man grade den Select macht.