Select-Single und Select up to 1 rows
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
- SAP-Hilfe: Open SQL-Ausdrücke
- https://help.sap.com/doc/abapdocu_750_index_htm/7.50/de-de/abensql_expr_literal_abexa.htm SAP-Hilfe: Konstante in Select Single]