Select-Single und Select up to 1 rows

Aus SAP-Wiki
Zur Navigation springenZur Suche springen

Siehe Schlüsselbefehl Select.

Select Single

Um lediglich einen Wert einer Tabelle abzufragen, eignet sich der "Select Single" Befehl am besten. Es ist lediglich ein Zugriff auf die Datenbank nötig.

Select single
  field
  from dbtbl
  into zielfeld
  where bedingung.

Select Single ohne Datentransport

Um die Erfüllung einer Abfrage auf 1 oder mehr Tabellen abzufragen und dies ohne Datentransport von den Tabellen zu realisieren, hat SAP einen interessanten Vorschlag, siehe https://help.sap.com/doc/abapdocu_750_index_htm/7.50/de-de/abensql_expr_literal_abexa.htm.

Es wird lediglich die Konstante ABAP_TRUE ('X') übertragen. Aber aufpassen muss man, wenn man in einer Schleife ist und die Variable LV_EXISTS mehrfach gefüllt wird. Dann sollte man sie auch clearen.

 SELECT SINGLE 
   @abap_true
   FROM scarr
   WHERE carrid = @carrier
   INTO @DATA(lv_exists).

 IF lv_exists = abap_true.
   ...
 ELSE.
   ...
 ENDIF.

Select up to 1 rows

Alternativ kann man auch ein Select-Endselect-Statement verwenden mit dem Zusatz „up to 1 rows“. Hier ist der Vorteil, dass man auch einen Satz entsprechend einer Sortierung (z. B. Erstellungsdatum absteigend, also den neuesten Satz) ermitteln kann:

Select 
  field
  from dbtbl
  into zielfeld
  up to 1 rows
  where bedingung
  order by feldname.
endselect.

Die zweite Alternative verwendet man oft, wenn in der Tabelle nicht nach dem voll qualifizierten Schlüssel abgefragt wird. Die erweiterte Syntaxprüfung würde ansonsten hier bei "Select Single" eine Warnung ausgeben. Dies vermeidet man mit der zweiten Alternative. Allerdings haben beide Anweisungen dieselben Datenbankabfragen des SAP an die Datenbank zur Folge.

Es kann auch sein, dass man die eine Zeile entsprechend einer Sortierung selektieren möchte, z. B. den neuesten Datensatz (Datumsfeld) und dann kann man beim "Select - Endselect" auch den Zusatz "order by" verwenden. Das geht bei "Select single" nicht.

Interessant ist es auch, dass auf der Datenbank die Datensätze nicht unbedingt in der Reihenfolge gespeichert sein müssen, wie man sie mit SE16/SE16N sieht.

Select *
  from vbap
  up to 1 rows
  where vbeln = lv_vbeln
endselect.
Select *
  from vbap
  up to 1 rows
  where vbeln = lv_vbeln
  order by vbeln posnr.
endselect.

Wenn man z. B. an der ersten Position eines Kundenauftrags interessiert ist, müssen die beiden folgenden Selektionen nicht zwingend das gleiche Ergebnis bringen. Nur mit dem Zusatz "order by" nach dem Key der Tabelle VBAP wird auch zwingend die niedrigste Position selektiert.

Web-Links