Schlüsselbefehl Select

Aus SAP-Wiki
Wechseln zu: Navigation, Suche

Der Schlüsselbefehl “Select” ist sehr mächtig. Er liest Datensätze von ein oder mehr Datenbanktabellen.

Siehe auch Kategorie Kategorie:Select.

Performance-Tuning

Performance und optimale Selektionen

Kombination Read itab und Select dbtbl

Select form table where Feld LIKE

Select client

Die Daten können aus einem anderen Mandanten als dem aktuellen Mandanten (sy-mandt) gelesen werden mit dem Befehl "using client <mandant>".

Das kann nützlich für Programme sein, um im Entwicklungsmandanten ein Programm testen zu können und es nicht im Testmandanten ausführen zu müssen.

SELECT DISTINCT
  vbtyp,
  kunnr
  INTO TABLE @DATA(lt_kunnr)
  FROM vbak
  USING CLIENT '102'
  ORDER BY kunnr, vbtyp.

Select single

Select * vermeiden

Select into itab

Select distinct into itab

Select Key und Index

Select Inner-Join, Select-Endselect oder View

Selects in Selects

Select For all entries

Eine interessante Alternative zu einem Range, bzw. Select-Options bei einer Select-Abfrage oder einem geschachtelten Loop-Select-Endloop ist der Befehl "FOR ALL ENTRIES".

Dieser Befehl ist auch deutlich performanter als wenn man über eine Tabelle loopt und innerhalb des Loops jeweils ein Select-Single.

Siehe auch SAP-Hilfe: For all entries und Tricktresor: For all entries.

select * from sbook 
  into table lt_bookings
  where customid = p_custid
    and carrid   in s_carrid
  order by primary key.

select * from spfli 
  into table lt_connections
 for all entries in lt_bookings
 where carrid = lt_bookings-carrid
   and connid = lt_bookings-connid
 order by primary key.

In der Auflösung auf Datenbankebene verhält sich der Befehl „for all entries“ etwas anders als ein Range/Select-Options. Siehe hierzu https://www.dpunkt.de/common/leseproben//10992/Abschnitt_4.4.pdf, S. 181 ff.. Der Befehl „for all entries“ soll langsamer sein als ein vergleichbarer Range. Aber dafür besteht bei einer sehr großen Vergleichstabelle nicht die Gefahr eines Laufzeitfehlers, wie beim Select-Options/Range.

Zur Vorsicht bei Select for all entries

Wenn die interne Tabelle bei "for all entries" leer ist, erfolgt in diesem Fall keine Einschränkung über die Where-Felder, die mit "for all entries" verknüpft sind. Oftmals ist es sinnvoll hier ein Coding einzubauen

if lt_itab is not initial.
  ...
endif.

Im umgekehrten Fall, wenn die interne Tabelle bei "for all entries" sehr viele Datensätze enthält, kann es auch zu einem Laufzeitfehler kommen.

Select mit Neuem ABAP (ab Release 7.40) (kommagetrennte Select-Felder)

Bei der neuen ABAP-Syntax werden die Feldnamen beim Select mit Komma getrennt. Ebenso werden die Felder beim "order by" mit Komma getrennt.

Die interne Tabelle (Zielvariablen) und die Parameter der Where-Bedingungen (Hostvariablen) müssen dann mit dem Fluchtsymbol "@" gekennzeichnet werden. Literale oder Zahlen werden nicht mit "@" gekennzeichnet.

Die alte Syntax mit leerzeichengetrennten Select-Feldern funktioniert natürlich immer noch, aber SAP bezeichnet sie in der SAP-Hilfe als obsolet und empfiehlt die kommagetrennte Liste von Select-Feldern.

Select Felder into itab

 SELECT
   tsp01~rqident,    "Spoolnumer
   tsp01~rq0name,    "Name
   tsp01~rq1name,    "Suffix1
   tsp01~rq2name,    "Suffix2
   tsp01~rqowner,    "User
   tsp01~rqdoctype   "DocTyp
   INTO TABLE @ct_itab
   FROM tsp01
   WHERE
     tsp01~rqident   IN @s_rqid  AND
     tsp01~rqdoctype IN @s_docty AND
     tsp01~rqowner   IN @s_user.

Select Felder into itab (Inline-Deklaration)

Bei Inline-Deklaration der internen Tabelle.

 SELECT
   tsp01~rqident,    "Spoolnumer
   tsp01~rq0name,    "Name
   tsp01~rq1name,    "Suffix1
   tsp01~rq2name,    "Suffix2
   tsp01~rqowner,    "User
   tsp01~rqdoctype   "DocTyp
   INTO TABLE @data(ct_itab)
   FROM tsp01
   WHERE
     tsp01~rqident   IN @s_rqid  AND
     tsp01~rqdoctype IN @s_docty AND
     tsp01~rqowner   IN @s_user.

Select alle Felder einer Datenbanktabelle

 SELECT
   tsp01~*
   INTO TABLE @data(ct_itab2)
   FROM tsp01
   WHERE
     tsp01~rqident   IN @s_rqid  AND
     tsp01~rqdoctype IN @s_docty AND
     tsp01~rqowner   IN @s_user.

oder beim Lesen von 2 Tabellen. Hier dürfen allerdings nicht 2 Tabellen mit "*" selektiert werden.

 SELECT
   tsp01~*,
   tsp02~PJNUMMER
   INTO TABLE @data(ct_itab2)
   FROM tsp01
   inner join tsp02
     on tsp02~pjident = tsp01~rqident
   WHERE
     tsp01~rqident   IN @s_rqid  AND
     tsp01~rqdoctype IN @s_docty AND
     tsp01~rqowner   IN @s_user.

Hier werden die Felder der Tabelle "TSP01" einer Struktur TSP01 zugewiesen.

TSP01 12.JPG

Select mit Case when .. then ..

Bei der neuen ABAP-Syntax ist auch möglich im Select Befehle einzubauen, die Werte in die Zieltabelle schreiben, die nicht aus der Datenbank stammen, sondern lediglich eine Abhängigkeit zu einem/den Select-Feldern haben. Hier wird z. B. in Abhängigkeit von den Werten in TSP01-RQDOCTYPE das Feld "ICON" gefüllt.

 SELECT
   tsp01~rqident,    "Spoolnumer
   tsp01~rq0name,    "Name
   tsp01~rq1name,    "Suffix1
   tsp01~rq2name,    "Suffix2
   tsp01~rqowner,    "User
   tsp01~rqcmode,    "External mode of an
   tsp01~rqfinal,    "Spool request comple
   tsp01~rqcretime,  "Created
   tsp01~rqdeltime,  "Deleted At
   tsp01~rqdest,     "Output Device
   tsp01~rqcopies,   "No. of copies
   tsp01~rqdoctype,   "DocTyp
   case when tsp01~rqdoctype = 'LIST'
          then '@3D@'
        when tsp01~rqdoctype = 'SMART'
          then  '@0Q@'
        when tsp01~rqdoctype = 'OTF'
          then '@0Y@'
        when tsp01~rqdoctype = 'ADSP'
          then '@0N@'
        end as icon      "Zielfeld
   INTO TABLE @ct_itab
   FROM tsp01
   WHERE
     tsp01~rqident   IN @s_rqid  AND
     tsp01~rqdoctype IN @s_docty AND
     tsp01~rqowner   IN @s_user.

TSP01 13.JPG

Coalesce-Funktion

Bei einem Select eines Feldes kann ein Ersatzwert angegeben werden, wenn der Feldwert initial ist.

coalesce( <feldname>, ersatzwert ) 

Hier wird z. B. bei einem initialen Verkaufsbüro der Wert "9999" eingetragen im Zielfeld der internen Tabelle.

SELECT 
 coalesce( vkbur, '9999' ) 
 FROM vbak 
 INTO ...

Füllen mit Werten nicht aus Datenbank

Es ist auch möglich Werte in ein Zielfeld eines Selects zu schreiben, die nicht aus einem Datenbankfeld stammen.

 SELECT
   tsp01~rqident,    "Spoolnumer
   tsp01~rq0name,    "Name
   tsp01~rq1name,    "Suffix1
   tsp01~rq2name,    "Suffix2
   tsp01~rqowner,    "User
   '20190306' as test,
   @sy-datum  as datum
   INTO TABLE @ct_itab
   FROM tsp01
   WHERE
     tsp01~rqident   IN @s_rqid  AND
     tsp01~rqdoctype IN @s_docty AND
     tsp01~rqowner   IN @s_user.

Parameters und Select-Options

Generische Selects

Tabellennamen

Feldlisten

Where

Order-by

Select Aggregierungsfunktionen (Sum, Max, Min, Avg)

Select into Range-Objekt

Select like %

  • Manchmal möchte man selektieren nach einem Bestandteil von einem Feld. Das lässt sich mit "like" durchführen.
  • Hier soll im Feld "MATNR" der Feldwert mit "L" beginnen mit beliebig folgenden Zeichen.
 SELECT
   vbeln
   posnr
   matnr
   INTO TABLE lt_lips
   FROM lips
   WHERE vbeln = lv_vbeln
     and posnr > 900000
     and matnr like 'L%'.

Collect

Web-Links

Literatur