Fehler im select

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

Fehler im select

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Hallo alle Zusammen!

Ich brauch mal wieder Hilfe.

Ich bekomme bei dieser geschachtelten Select-Anweisung bei der makierten Zeile einen Kurzdump. Kann mir bitte wer erklären warum, und wo der Fehler liegt.

Vielen Dank!

Schöne Grüße

Robin

Code: Alles auswählen.

DATA: wa_land TYPE lfa1-land1,
      wa_lifnr TYPE lfa1-lifnr,
      wa_perio TYPE bkpf-monat,
      wa_gjahr TYPE bseg-gjahr,
      wa_zuonr TYPE bseg-zuonr,
      wa_zdlkz TYPE zdlkz_t-zdlkz.

SELECT-OPTIONS: so_land FOR wa_land,
                so_perio FOR wa_perio.

PARAMETERS pa_gj TYPE bseg-gjahr.

SELECT-OPTIONS: so_dlkz FOR wa_zdlkz.

DATA: wa_lfa1 TYPE lfa1,
      wa_bkpf TYPE bkpf,
      wa_bseg TYPE bseg.

DATA: BEGIN OF wa_res,
        lifnr TYPE lfa1-lifnr,
        land1 TYPE lfa1-land1,
        diekz TYPE bseg-diekz,
        belnr TYPE bseg-belnr,
        zuonr TYPE bseg-zuonr,
        belart TYPE bkpf-blart,
        monat TYPE bkpf-monat,
        gjahr TYPE bkpf-gjahr,
      END OF wa_res,
      itab_sumla LIKE TABLE OF wa_res.

START-OF-SELECTION.
*##################

  SELECT lifnr land1
    INTO wa_lfa1 FROM lfa1
      WHERE land1 in so_land.
    APPEND wa_lfa1 TO itab_sumla.
    SELECT lifnr belnr diekz zuonr
      INTO wa_bseg FROM bseg
 :!:         WHERE lifnr = wa_lfa1-lifnr.
      APPEND wa_bseg TO itab_sumla.
      SELECT belnr monat gjahr blart
        INTO wa_bkpf FROM bkpf
          WHERE belnr = wa_bseg-belnr.
        APPEND wa_bkpf TO itab_sumla.
        SELECT zdlkz
          INTO wa_zdlkz FROM zdlkz_t
            WHERE zdlkz = wa_bseg-diekz.
          APPEND wa_zdlkz TO itab_sumla.
        ENDSELECT.
      ENDSELECT.
    ENDSELECT.
  ENDSELECT.

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


Beitrag von gast ( / / 0 / 3 ) »
Warum machst du überhaupt solch einen geschachtelten
Select Mach doch einen Join das ist wahrscheinlich viel performanter.
Gruss
Uwe

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

abgesehen davon, dass geschachtelte Selects ziemlich sch&%)#§ sind, musst du auch eine entsprechende Feldleiste bei INTO angeben, wenn du einzelne Felder selektierst.
Also entweder:

Code: Alles auswählen.

SELECT feld1 feld2 feld3 
  INTO (wa-feld1, wa-feld2, wa-feld3)...
oder

Code: Alles auswählen.

SELECT feld1 feld2 feld3 
  INTO CORRESPONDING FIELDS OF wa....
Gruß,
Enno

PS: Hier war es eindeutig, was für ein Kurzdump kommt. Generell kann hier aber keiner Gedanken lesen, weswegen ein Hinweis auf den Kurzdump selbst schon gut wäre!

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Hallo Uwe!

Danke für Deine Antwort.

Das wäre mir eh lieber gewesen, nur leider kann ich auf die Tabelle BSEG keinen Join machen, da diese eine Cluster-Tabelle ist.

Schöne Grüße

Robin

Beitrag von gecko (ForumUser / 8 / 0 / 0 ) »
Hatte es dir auch schon per PM geschickt, aber hier nochmal, der von allen Fehlern (hoffentlich) bereinigte Code:

Code: Alles auswählen.

TABLES: lfa1, bseg, bkpf.

DATA: wa_land TYPE lfa1-land1,
wa_lifnr TYPE lfa1-lifnr,
wa_perio TYPE bkpf-monat,
wa_gjahr TYPE bseg-gjahr,
wa_zuonr TYPE bseg-zuonr,
wa_zdlkz TYPE bseg-diekz.

DATA: wa_lfa1 TYPE lfa1,
wa_bkpf TYPE bkpf.
*wa_bseg TYPE bseg.

DATA: BEGIN OF wa_bseg,
      lifnr LIKE bseg-lifnr,
      belnr LIKE bseg-belnr,
      diekz LIKE bseg-diekz,
      zuonr LIKE bseg-zuonr,
      END OF wa_bseg.

DATA: BEGIN OF wa_res,
lifnr TYPE lfa1-lifnr,
land1 TYPE lfa1-land1,
diekz TYPE bseg-diekz,
belnr TYPE bseg-belnr,
zuonr TYPE bseg-zuonr,
belart TYPE bkpf-blart,
monat TYPE bkpf-monat,
gjahr TYPE bkpf-gjahr,
END OF wa_res,
itab_sumla LIKE wa_res OCCURS 10 WITH HEADER LINE.


SELECT-OPTIONS: so_land FOR lfa1-land1,
so_perio FOR bkpf-monat.

PARAMETERS pa_gj LIKE bseg-gjahr.

SELECT-OPTIONS: so_dlkz FOR bseg-diekz.


START-OF-SELECTION.
*##################

  SELECT lifnr land1
  FROM lfa1 INTO CORRESPONDING FIELDS OF wa_lfa1
  WHERE land1 IN so_land.
    MOVE-CORRESPONDING wa_lfa1 TO itab_sumla.
    SELECT lifnr belnr diekz zuonr
    FROM bseg INTO CORRESPONDING FIELDS OF wa_bseg
    WHERE lifnr = wa_lfa1-lifnr
    AND diekz IN so_dlkz.
      MOVE-CORRESPONDING wa_bseg TO itab_sumla.
      SELECT belnr monat gjahr blart
      FROM bkpf INTO CORRESPONDING FIELDS OF wa_bkpf
      WHERE belnr = wa_bseg-belnr
      AND monat IN so_perio
      AND gjahr = pa_gj.
        MOVE-CORRESPONDING wa_bseg TO itab_sumla.
        APPEND itab_sumla.
      ENDSELECT.
    ENDSELECT.
    clear itab_sumla.
  ENDSELECT. 

Beitrag von meinrad (ForumUser / 67 / 0 / 0 ) »
Hallo,
1. Es wäre möglich einen Join zumachen, wenn die richtigen Tabellen benützt werden. Schau dir mal
BSIK und BSAK an. da ist der LIFNR im Primärindex.
2. Deine Selects sind äusserst inperformant !
warum selektierst du die Lieferanten-Daten nicht ersteinmal KOMPLETT in eine interne Tabelle:
SELECT lifnr land1
FROM lfa1 INTO table t1_lfa1
WHERE land1 IN so_land.
(t1_lfa1 besteht nur aus 2 Feldern: lifnr land1 )
Und dann mit loop weiter arbeiten und die
selects mit: .. APPENDING TABLE IT_BSEG WHERE ...
Wobei it_bseg auch nur wenige Felder enthält.
(lifnr belnr diekz zuonr )
Du kannst dann den select auch zweimal machen. (BSIK/BSAK).
Du liest nämlich bei jedem Lieferanten immer die komplette BSEG durch !

3. erst wenn dann die drei Hilfstabellen gefüllt sind. Wird die eigentliche itab_sumla gefüllt.
(LOOP)

Beitrag von robin1at (Specialist / 190 / 0 / 0 ) »
Hallo Meinrad!

Vielen Dank für Deine Hilfe!

Habe meinen Select jetzt geändert. (Hoffe ich habe es richtig verstanden.) Im Debugger scheint es zu funktionieren, aber ich bekomme leider keine Liste.

Wäre nett von Dir, wenn Du mal kurz drüber schauen könntest ob Du meinen Fehler findest.

Nochmals vielen Dank!

Schöne Grüße

Robin

Code: Alles auswählen.

TABLES: lfa1, bseg, bsik, bsak, bkpf, zdlkz_t.

DATA: wa_land TYPE lfa1-land1,
      wa_lifnr TYPE lfa1-lifnr,
      wa_perio TYPE bkpf-monat,
      wa_gjahr TYPE bseg-gjahr,
      wa_zuonr TYPE bseg-zuonr,
      wa_zdlkz TYPE zdlkz_t-zdlkz.

DATA: wa_lfa1 TYPE lfa1,
      wa_zdlkz_t TYPE zdlkz_t,
      wa_bkpf TYPE bkpf,
      wa_bsak TYPE bsak,
      wa_bsik TYPE bsik.

DATA: BEGIN OF wa_bseg,
        lifnr LIKE bseg-lifnr,
        belnr LIKE bseg-belnr,
        diekz LIKE bseg-diekz,
        zuonr LIKE bseg-zuonr,
        bukrs LIKE bseg-bukrs,
      END OF wa_bseg.

DATA: BEGIN OF wa_res,
        lifnr TYPE lfa1-lifnr,
        land1 TYPE lfa1-land1,
        diekz TYPE bsak-diekz,
        belnr TYPE bsak-belnr,
        zuonr TYPE bsak-zuonr,
        belart TYPE bsak-blart,
        bukrs TYPE bsak-bukrs,
        monat TYPE bsak-monat,
        gjahr TYPE bsak-gjahr,
      END OF wa_res,

itab_sumla LIKE wa_res OCCURS 10 WITH HEADER LINE.


SELECT-OPTIONS: so_land FOR lfa1-land1,
                so_perio FOR bkpf-monat.

PARAMETERS pa_gj LIKE bseg-gjahr.

SELECT-OPTIONS: so_dlkz FOR zdlkz_t-zdlkz.

START-OF-SELECTION.
*##################

  SELECT lifnr land1
  FROM lfa1 INTO CORRESPONDING FIELDS OF wa_lfa1
  WHERE land1 IN so_land.
    MOVE-CORRESPONDING wa_lfa1 TO itab_sumla.
    SELECT lifnr zuonr gjahr belnr monat blart diekz
    FROM bsak INTO CORRESPONDING FIELDS OF wa_bsak
    WHERE lifnr = wa_lfa1-lifnr.
      MOVE-CORRESPONDING wa_bsak TO itab_sumla.
      SELECT lifnr zuonr gjahr belnr monat blart diekz
      FROM bsik INTO CORRESPONDING FIELDS OF wa_bsik
      WHERE lifnr = wa_lfa1-lifnr.
        MOVE-CORRESPONDING wa_bsik TO itab_sumla.
      ENDSELECT.
    ENDSELECT.
    CLEAR itab_sumla.
  ENDSELECT.

  IF sy-subrc <> 0.
    MESSAGE e180(/bdl/d-).
*   Notwendige Eingabe fehlt
  ENDIF.


  IF sy-subrc = 0.

    LOOP AT itab_sumla INTO wa_res.

      WRITE: wa_land,
             wa_zuonr,
             wa_gjahr,
             wa_perio,
             wa_zuonr,
             wa_zdlkz,
             wa_lifnr.

    ENDLOOP.
  ENDIF.

Beitrag von Gast ( / / 0 / 3 ) »
Habe deinen Code kommentiert (***). Danach solltest du eine Ausgabe erhalten.

Gruß Hendrik

Code: Alles auswählen.

TABLES: lfa1, bseg, bsik, bsak, bkpf, zdlkz_t.

DATA: wa_land TYPE lfa1-land1,
      wa_lifnr TYPE lfa1-lifnr,
      wa_perio TYPE bkpf-monat,
      wa_gjahr TYPE bseg-gjahr,
      wa_zuonr TYPE bseg-zuonr,
      wa_zdlkz TYPE zdlkz_t-zdlkz.

DATA: wa_lfa1 TYPE lfa1,
      wa_zdlkz_t TYPE zdlkz_t,
      wa_bkpf TYPE bkpf,
      wa_bsak TYPE bsak,
      wa_bsik TYPE bsik.

DATA: BEGIN OF wa_bseg,
        lifnr LIKE bseg-lifnr,
        belnr LIKE bseg-belnr,
        diekz LIKE bseg-diekz,
        zuonr LIKE bseg-zuonr,
        bukrs LIKE bseg-bukrs,
      END OF wa_bseg.

DATA: BEGIN OF wa_res,
        lifnr TYPE lfa1-lifnr,
        land1 TYPE lfa1-land1,
        diekz TYPE bsak-diekz,
        belnr TYPE bsak-belnr,
        zuonr TYPE bsak-zuonr,
        belart TYPE bsak-blart,
        bukrs TYPE bsak-bukrs,
        monat TYPE bsak-monat,
        gjahr TYPE bsak-gjahr,
      END OF wa_res,

itab_sumla LIKE wa_res OCCURS 10 WITH HEADER LINE.


SELECT-OPTIONS: so_land FOR lfa1-land1,
                so_perio FOR bkpf-monat.

PARAMETERS pa_gj LIKE bseg-gjahr.

SELECT-OPTIONS: so_dlkz FOR zdlkz_t-zdlkz.

START-OF-SELECTION.
*##################

  SELECT lifnr land1
  FROM lfa1 INTO CORRESPONDING FIELDS OF wa_lfa1
  WHERE land1 IN so_land.
    MOVE-CORRESPONDING wa_lfa1 TO itab_sumla.
    SELECT lifnr zuonr gjahr belnr monat blart diekz
    FROM bsak INTO CORRESPONDING FIELDS OF wa_bsak
    WHERE lifnr = wa_lfa1-lifnr.
      MOVE-CORRESPONDING wa_bsak TO itab_sumla.
      SELECT lifnr zuonr gjahr belnr monat blart diekz
      FROM bsik INTO CORRESPONDING FIELDS OF wa_bsik
      WHERE lifnr = wa_lfa1-lifnr.
        MOVE-CORRESPONDING wa_bsik TO itab_sumla.
      ENDSELECT.
    ENDSELECT.
*** Du hast jetzt alle Daten im Arbeitsbereich der Tabelle, 
*** den Arbeitsbereich musst du aber noch an die Tabelle hängen
APPEND itab_sumla.

    CLEAR itab_sumla.
  ENDSELECT.

  IF sy-subrc <> 0.
    MESSAGE e180(/bdl/d-).
*   Notwendige Eingabe fehlt
  ENDIF.


  IF sy-subrc = 0.

    LOOP AT itab_sumla INTO wa_res.
*** Der Write kann nicht funktionieren.
*** Die Werte stehen dir pro Schleifen durchlauf 
*** im Arbeitsbereich wa_res zu Verfügung. 
*** Die unteren Variablen bleiben leer.
*      WRITE: wa_land,
*             wa_zuonr,
*             wa_gjahr,
*             wa_perio,
*             wa_zuonr,
*             wa_zdlkz,
*             wa_lifnr.

*** Du kannst auf die einzelnen Felder zugreifen:
       WRITE: wa_res-lifnr,
              wa_res-land1,
              wa_res-diekz,
              wa_res-belnr,
              wa_res-zuonr,
              wa_res-belart,
              wa_res-bukrs,
              wa_res-monat,
              wa_res-gjahr.
    ENDLOOP.
  ENDIF.

Re: Fehler im select

Beitrag von Gast ( / / 0 / 3 ) »
robin1at hat geschrieben:Hallo alle Zusammen!

Ich brauch mal wieder Hilfe.

Ich bekomme bei dieser geschachtelten Select-Anweisung bei der makierten Zeile einen Kurzdump. Kann mir bitte wer erklären warum, und wo der Fehler liegt.
Warum posten Poster fast NIE den Kurzdump?
Zumindensts die Fehlermeldung?


Wie Frauen in der KFZ-Werkstatt: "Mein Wagen läuft nicht mehr, können Sie mal nachschauen".

Beitrag von meinrad (ForumUser / 67 / 0 / 0 ) »
Hallo,
Wie ich sehe, hast Du mein Posting nicht verstanden.
Ich sehe keine drei bzw vier (wenn bsik und bsak verwendet wird ) getrennten selects.
( OHNE Endselect )
Deine Selects sind immer noch geschachtelt. Ich sehe auch nicht die drei weiteren Internen Tabellen und auch keinen select ... into TABLE it_bseg usw.
Da ich jetzt (abends) kein SAP-System zur Verfügung habe kann ich Dir leider nicht helfen. Gibt es keinen Kollegen der dir helfen kann.

Lies mal die Hinweise von SAP zur Performance von SELECTS und die F1-Hilfe zu INTO TABLE bzw. APPENDING TABLE. Falls ich morgen Zeit habe werde ich Dir nochmal antworten

Beitrag von Gast ( / / 0 / 3 ) »
Robin,

vielleicht hilft dir das hier noch weiter:
Workshop Performance (Tricktresor)

Gruß,
Enno

Beitrag von BesenWesen (Specialist / 183 / 0 / 0 ) »
robin1at hat geschrieben: START-OF-SELECTION.
*##################

SELECT lifnr land1
FROM lfa1 INTO CORRESPONDING FIELDS OF wa_lfa1
WHERE land1 IN so_land.
warum liest du eigentlich hier nicht schon in eine int. Tabelle? und arbeitest diese dann mit einem loop ab?
Gruss
BesenWesen

Seite 1 von 1

Vergleichbare Themen

2
Antw.
816
Views
Job hängt an select, wie herausfinden welches select
von dpz » 01.08.2019 10:23 • Verfasst in ABAP® Core
4
Antw.
9327
Views
Performance: SELECT UP TO 1 ROWS vs. SELECT SINGLE
von roman1983 » 04.09.2008 14:29 • Verfasst in ABAP® für Anfänger
8
Antw.
3040
Views
SELECT SINGLE oder SELECT UP TO 1 ROWS?
von nickname8 » 12.04.2021 10:38 • Verfasst in ABAP® für Anfänger
4
Antw.
18636
Views
Select nach Parameter & Select-Options
von doeme » 10.07.2012 16:37 • Verfasst in ABAP® für Anfänger
2
Antw.
2551
Views
Select * und Select von einzelnen Werten zugleich
von StefanJue » 04.10.2006 18:10 • Verfasst in ABAP® für Anfänger

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.

Unbeantwortete Forenbeiträge

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