select

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

select

Beitrag von c oco (Specialist / 326 / 12 / 16 ) »
Hallo,

ist folgende Situation mit einem inner join möglich?
es geht um daten aus der ekbe. Die Ekbe hat über 17 Mio Einträge. Also muss ich nach einer performanten Lösung suchen.

Chargen die gebucht sind haben Einträge in der EKBE mit dem Feld Charge_neu.
also zqm_exws_eq45-charge_neu = ekbe-charg.
Chargen die nicht gebucht sind haben Einträge in der EKBE mit dem Feld charge.
zqm_exws_eq45-charg = ekbe-charg.

ich brauche die bldat, j_3asize und j_4kscat.
aber manchmal ist das feld charge und manchmal charge_neu.
Gibt es eine Möglichkeit, die Daten auch zu bekommen, bei denen charge_neu = charge ist?
Wie kann ich dies in mein Select einbauen?

Code: Alles auswählen.

SELECT t1~trucknr t1~charg t1~laufnr
             t1~matnr t1~ebeln t1~ebelp
             t1~menge_netto t1~meins t1~status
             t1~j_3acomord t1~charge_neu t1~zqm_cut
             t2~bldat t2~j_3asize t2~j_4kscat
        FROM zqm_exws_eq45 AS t1
        INNER JOIN ekbe AS t2
        ON t1~matnr  = t2~matnr
        AND t1~charg = t2~charg       
        AND t1~ebeln = t2~ebeln
        AND t1~ebelp = t2~ebelp
        INTO CORRESPONDING FIELDS OF TABLE ct_eq45
          FOR ALL ENTRIES IN ct_vers_eh
          WHERE t1~trucknr = ct_vers_eh-trucknr
            AND t1~matnr   IN s_matnr
            AND t1~charg   IN s_charg
            AND t1~ebeln   IN s_ebeln
            AND t1~status = 'W'
            AND t2~bewtp = 'E'
            AND t2~bldat IN s_bldat.
Viele Grüße
coco

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


Re: select

Beitrag von a-dead-trousers (Top Expert / 4485 / 231 / 1205 ) »
hi!

Wieviele Einträge gibt es in der ZQM_EXWS_EQ45?
Wie wäre es wenn du zuerst die benötigten Chargen hieraus liest.
Dann ein Loop und sowohl CHARG_NEU als auch CHARG in eine Tabelle übertragen, sortieren und verdichten.
Und anschließend damit ein SELECT FOR ALL ENTRIES auf die EKBE machen.
Performancetechnisch wäre das glaub ich sogar sinnvoller als ein JOIN, da der die Datebank (vorallem bei einer derart großen Tabelle) sehr belastet.
Auch wäre ein neuer Index auf CHARG in der EKBE für so einen Abfrage sinnvoll.

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: select

Beitrag von c oco (Specialist / 326 / 12 / 16 ) »
Hi adt,

zqm_exws_eq45 hat ca. 13.000 Einträge
ekbe hat über 75 Mio Einträge.

dein Vorschlag: das hatte ich gemacht aber
problem 1: dauert trotzdem sehr lange
problem 2: füllt nicht alle belegdatum felder

mein code mit 2 selects:

Code: Alles auswählen.

   SELECT trucknr charg laufnr
         matnr ebeln ebelp
         menge_netto meins status
         j_3acomord charge_neu zqm_cut
         lifnr_p etenr
    FROM zqm_exws_eq45
    INTO CORRESPONDING FIELDS OF TABLE ct_eq45
      FOR ALL ENTRIES IN ct_vers_eh
      WHERE trucknr = ct_vers_eh-trucknr
        AND matnr   IN s_matnr
        AND charg   IN s_charg
        AND ebeln   IN s_ebeln
        AND status = 'W'.
      IF sy-subrc = 0.
        SELECT bldat j_3asize j_4kscat matnr charg
          FROM ekbe
          INTO TABLE lt_inter
          FOR ALL ENTRIES IN ct_eq45
          WHERE matnr = ct_eq45-matnr
          AND   charg = ct_eq45-charge_neu
          AND   bewtp = 'E'.
        IF sy-subrc = 0.
          SORT ct_eq45 BY matnr charg.
          SORT lt_inter BY matnr charg.
          LOOP AT ct_eq45 ASSIGNING <ls_eq45>.
            READ TABLE lt_inter ASSIGNING <ls_inter> WITH KEY matnr = <ls_eq45>-matnr
                                                              charg = <ls_eq45>-charge_neu.
            IF sy-subrc = 0.
              <ls_eq45>-bldat    = <ls_inter>-bldat.
              <ls_eq45>-j_3asize = <ls_inter>-j_3asize.
              <ls_eq45>-j_4kscat = <ls_inter>-j_4kscat.
            ENDIF.
          ENDLOOP.
        ENDIF.
      ENDIF.
kann ich einfach so ein indize anlegen? ich dachte das soll man nicht machen.
Danke für deine Hilfe.

Viele Grüße
coco

Re: select

Beitrag von a-dead-trousers (Top Expert / 4485 / 231 / 1205 ) »
hi!

Wenn du den Index als Z anlegst ist das nicht mal eine Standardänderung.
Wir haben auf unserem System schon einige Indizes in Standardtabellen angelegt.
Wichtig ist nur, dass du VORHER prüfst ob nicht ein Index vielleicht schon deine Anforderungen abdeckt, wenn du ein weiteres Feld einbeziehst.
Und eine Tabelle sollte nicht mehr als 5 Indizes haben, sonst werden Einfüge/Änderungsoperationen wieder langsamer.

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: select

Beitrag von a-dead-trousers (Top Expert / 4485 / 231 / 1205 ) »
probiers mal so. Sollte schneller sein!

Code: Alles auswählen.

types:
  begin of ts_select,
    matnr   type ekbe-matnr,
    charge  type ekbe-charge,
  end of ts_select. 
   
data:
  lt_select type standard table of ts_select with default key.

field-symbols:
  <ls_select> type ts_select.

  SELECT trucknr charg laufnr
         matnr ebeln ebelp
         menge_netto meins status
         j_3acomord charge_neu zqm_cut
         lifnr_p etenr
    FROM zqm_exws_eq45
    INTO CORRESPONDING FIELDS OF TABLE ct_eq45
      FOR ALL ENTRIES IN ct_vers_eh
      WHERE trucknr = ct_vers_eh-trucknr
        AND matnr   IN s_matnr
        AND charg   IN s_charg
        AND ebeln   IN s_ebeln
        AND status = 'W'.

loop at ct_eq45 assigning <ls_eq45>.
* War da nicht noch was mit CHARG in zqm_exws_eq45?
*  append initial line to lt_select assigning <ls_select>.
*  <ls_select>-matnr = <ls_eq45>-matnr.
*  <ls_select>-charge = <ls_eq45>-charg.
  append initial line to lt_select assigning <ls_select>.
  <ls_select>-matnr = <ls_eq45>-matnr.
  <ls_select>-charge_neu = <ls_eq45>-charge.
endloop.

sort lt_select.
delete adjacent duplicates of lt_select.
delete lt_select where charge is initial or matnr is initial.

if lt_select is not initial
  SELECT bldat j_3asize j_4kscat matnr charg
    FROM ekbe
    INTO TABLE lt_inter
    FOR ALL ENTRIES IN lt_select
    WHERE matnr = lt_select-matnr
    AND   charg = lt_select-charge
    AND   bewtp = 'E'.
endif.
Dann werden weniger Zeilen an die zweite SQL-Query geschickt.

lg ADT

EDIT: Vielleicht kannst ja die LT_SELECT noch kleiner machen indem du die Selektion der Materialnummer gleich wie bei der zqm_exws_eq45 machst (mit IN S_MATNR). Dann brauchst du in LT_SELECT wirklich nur mehr die betreffenden Chargennummern und die SQL-Query die im Endeffekt an die DB geschickt wird auch um einiges kleiner.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50


Re: select

Beitrag von c oco (Specialist / 326 / 12 / 16 ) »
Hallo ADT, hallo ewx

vielen Dank für die Hinweise. Habt mir sehr geholfen.
Jetzt muss ich es noch auf dem Produktivsystem testen und hoffen, dass es schneller ist.

Viele Grüße
Coco

Seite 1 von 1

Vergleichbare Themen

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

Über diesen Beitrag


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

Aktuelle Forenbeiträge

Stücklisten
vor einer Stunde von Selma.schwarz 1 / 14
Belege
vor einer Stunde von Selma.schwarz 1 / 6
Belege
vor einer Stunde von Selma.schwarz 1 / 7

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

Stücklisten
vor einer Stunde von Selma.schwarz 1 / 14
Belege
vor einer Stunde von Selma.schwarz 1 / 6
Belege
vor einer Stunde von Selma.schwarz 1 / 7

Unbeantwortete Forenbeiträge

Stücklisten
vor einer Stunde von Selma.schwarz 1 / 14
Belege
vor einer Stunde von Selma.schwarz 1 / 6
Belege
vor einer Stunde von Selma.schwarz 1 / 7