SELECT SINGLE in ABAP

Der SELECT SINGLE Befehl in ABAP ist eines der wichtigsten und am meisten genutzten ABAP-Befehl. In diesem Artikel wird SELECT SINGLE umfangreich erklärt. Mit beispielhaften Programmausschnitten kann man einfach und schnell den Befehl an sein eigenes Programm adaptieren. In diesem Zusammenhang ist der Artikel “SELECT in ABAP” ebenfalls sehr nützlich.

SELECT SINGLE *
  FROM <tabelle>
  WHERE <spalte> = <variable>
  INTO CORRESPONDING FIELDS OF <int_tabelle>.

SELECT SINGLE in ABAP einfach erklärt

Ein SELECT SINGLE ist eine Art der Tabellenabfrage. Hierbei wird mit dem Zusatz SINGLE der SELECT-Befehl in ABAP erweitert. Die Ergebnismenge wird dadurch einzeilig und liefert genau einen Treffer bzw. eine Zeile. Und dabei wird der erste gefundene Treffer zurückgegeben.

Die Syntax der Abfrage sieht folgendermaßen aus:

" Abfrage einer Zeile (Angaben mit <> ersetzen, z.B. <tabelle>)
SELECT SINGLE *
  FROM <tabelle>
  WHERE <spalte> = <variable>
  INTO CORRESPONDING FIELDS OF <interne_tabelle>.

" Abfrage von einer Spalte bzw. Attribut (Angaben mit <> ersetzen, z.B. <spalte1>)
SELECT SINGLE <spalte1>
  FROM <tabelle>
  WHERE <spalte> = <variable>
  INTO <variable1>.

" Abfrage von mehreren Spalten bzw. Attributen (Angaben mit <> ersetzen, z.B. <spalte1>)
SELECT SINGLE <spalte1>, <spalte2>
  FROM <tabelle>
  WHERE <spalte> = <variable>
  INTO (<variable1>, <variable2>).

Im Vergleich zu einer reinen SELECT-Abfrage wird hierbei nicht mit einem ENDSELECT eine Schleife geöffnet und liefert auch keine Tabelle als Ergebnismenge zurück, sondern nur eine Struktur.

Wenn man mit einer SELECT SINGLE Abfrage mehr als einen gültigen Treffer in der Tabelle anspricht, wird trotzdem der erste gültige Treffer zurückgegeben. Deshalb sollte man bei der Verwendung von einer SELECT SINGLE-Abfrage stets darauf achten, in der WHERE-Bedingung alle Schlüsselfelder zu verwenden und in der Abfrage mit einzuschließen.

Folgende SELECT-Zusätze können bei der Verwendung von SELECT SINGLE nicht verwendet werden:

  • ORDER BY
  • UP TO
  • UNION
  • FOR ALL ENTRIES

Außerdem kann man SELECT SINGLE nicht in der Anweisung OPEN CURSOR oder innerhalb einer Subquery verwenden, also eine SELECT-Abfrage innerhalb einer SELECT-Abfrage.

Die ABAP-Schlüsselwortdokumentation zu SELECT SINGLE liefert weitere wichtige Erklärungen.

Wann sollte man SELECT SINGLE verwenden?

Wie bereits näher erläutert, liefert eine SELECT SINGLE-Abfrage genau einen einzigen Treffer aus der selektierten Datenbanktabelle zurück. Diese Erkenntnis ist zugleich der Vor- und Nachteil des SELECT-Zusatzes und liefert die Antwort auf die Frage “Wann sollte man SELECT SINGLE verwenden?”.

Man sollte den Zusatz SINGLE verwenden, wenn man genau einen Treffer erhalten möchte. Dabei kann man schneller und einfacher auf die Ergebnismenge zugreifen als mit einer herkömmlichen SELECT-Abfrage.

Unter SAP S/4HANA sollte man den Zusatz SINGLE immer bei einer vollständigen Angabe der Primärschlüsselfelder verwenden. Unter der HANA-Datenbank hat sich die Organisation der Daten geändert. Nun werden die Daten nicht mehr zeilen-, sondern spaltenbasiert gespeichert. Ohne die Verwendung des ORDER BY-Zusatzes können unterschiedliche Zeilen selektiert werden.

SELECT SINGLE FOR UPDATE

Man kann zusätzlich den Zusatz FOR UPDATE verwenden. Dabei wird bei der gelesenen Zeile eine Schreibsperre gesetzt. Dabei wird die SAP-Pufferung umgangen. Die Datenbanksperre ist bis zum Ende des Datenbank LUW existent und wird danach entfernt.

Datenbanksperren können nicht mit der Transaktion SM12 angezeigt werden. Hierbei nutzt man den Verwendungsnachweis im ABAP Dictionary (Transaktion SE11) und wählt im angezeigten Verwendungsnachweis die Checkbox “Sperrobjekten” aus.

SELECT SINGLE – Beispiele

Datensatz aus Tabelle lesen

  DATA: wa_ekko  TYPE ekko,  " Struktur
        lv_ernam TYPE ernam. " Variable

*----------------------------------------------------------------------
* SELECT SINGLE - Abfrage alle Informationen einer Bestellung
*----------------------------------------------------------------------
  SELECT SINGLE *
         FROM ekko
         WHERE ebeln = '1234567890'
         INTO CORRESPONDING FIELDS OF @wa_ekko.

*----------------------------------------------------------------------
* SELECT SINGLE - Abfrage des Erstellers einer Bestellung
*----------------------------------------------------------------------
  SELECT SINGLE ernam
        FROM ekko
        WHERE ebeln = '1234567890'
        INTO @lv_ernam.

Hinweis: Man kann dabei das Escaping der Hostvariablen mit dem @-Zeichen auch weglassen. Wenn man die OpenSQL-Syntax jedoch verwendet, muss man sie durchgängig verwenden.

Prüfen, ob Datensatz existiert

DATA: lv_ebeln_ok TYPE flag.

PARAMETERS: p_ebeln TYPE ebeln.

*----------------------------------------------------------------------
* SELECT SINGLE - Prüfe, ob Bestellung vorhanden
*----------------------------------------------------------------------
SELECT SINGLE @abap_true FROM ekko INTO @lv_ebeln_ok
  WHERE ebeln = @p_ebeln.

IF lv_ebeln_ok EQ abap_true.
  WRITE: / 'Bestellung ', p_ebeln, ' vorhanden'.
ELSE.
  WRITE: / 'Bestellung ', p_ebeln, ' nicht vorhanden'.
ENDIF.

SELECT, SELECT DISTINCT und SELECT SINGLE

Im folgenden Abschnitt werden einmal die wichtigen SELECT-Abfragemöglichkeiten beispielhaft dargestellt. Dabei sollte man stets auf einen guten ABAP-Programmstil achten.

SELECT – Abfrage aller Ergebnisse

DATA:
  lt_belnr TYPE TABLE OF belnr_d,
  lv_belnr TYPE belnr_d.

PARAMETERS: p_usnam TYPE usnam.

*----------------------------------------------------------------------
* SELECT - Abfrage aller Rechnungen, die von P_USNAM erfasst wurden
*----------------------------------------------------------------------
SELECT belnr FROM bkpf INTO TABLE @lt_belnr
  WHERE usnam = @p_usnam.

SELECT DISTINCT – Abfrage aller Ergebnisse ohne Duplikate

DATA:
  lt_belnr TYPE TABLE OF belnr_d,
  lv_belnr TYPE belnr_d.

PARAMETERS: p_usnam TYPE usnam.

*----------------------------------------------------------------------
* SELECT DISTINCT - Abfrage aller Rechnungen, die von P_USNAM erfasst wurden
*         ohne Duplikate
*         (Hinweis: Primärschlüssel sind Buchungskreis, Belegnummer
*                   und Geschäftsjahr)
*----------------------------------------------------------------------
SELECT DISTINCT belnr FROM bkpf INTO TABLE @lt_belnr
  WHERE usnam = @p_usnam.

SELECT SINGLE – Abfrage des ersten Ergebnisses

DATA:
  lt_belnr TYPE TABLE OF belnr_d,
  lv_belnr TYPE belnr_d.

PARAMETERS: p_usnam TYPE usnam.

*----------------------------------------------------------------------
* SELECT - Abfrage der ersten Rechnungen, die von P_USNAM erfasst wurden
*----------------------------------------------------------------------
SELECT SINGLE belnr FROM bkpf INTO @lv_belnr
  WHERE usnam = @p_usnam.

WRITE: / lv_belnr.

SELECT SINGLE vs UP TO 1 ROWS

Der Zusatz UP TO 1 ROWS liefert die gleiche Ergebnismenge wie SELECT SINGLE. Deshalb fragt man sich zurecht, was die Unterschiede zwischen diesen beiden Abfragen sind.

Beim Zusatz SINGLE kann man nicht den Zusatz ORDER BY verwenden. Bei UP TO 1 ROWS hingegen schon. Deshalb empfiehlt es sich, UP TO 1 ROWS zu verwenden, um maximal eine Zeile einer Ergebnismenge zu selektieren. Der Zusatz SINGLE sollte bei der Selektion einer vollständig spezifizierten Zeile verwendet werden. Wenn man also alle WHERE-Bedingungen angibt.

Wenn man also eine ganze Zeile aus der Datenbank selektiert, ist der Zusatz SINGLE performanter und schneller als UP TO 1 ROWS.

Mit dem Programm DEMO_SELECT_SINGLE_VS_UP_TO kann man sich die Performance der beiden Varianten exemplarisch anzeigen lassen.

Über den Autor

Andreas Geiger

Schön, dass Du Dich für SAP ERP bzw. SAP S/4HANA interessierst.

Mein Name ist Andreas Geiger und ich bin der Gründer von ERP-UP.de. Mein Ziel ist es, so viel nützliches Wissen wie möglich über das SAP ERP-System zu vermitteln. Ich möchte Dir damit einen Mehrwert bieten. Es freut mich, wenn ich Dir damit helfen kann.

Mehr zu ERP UP

ERP UP unterstützen

Wenn Du mit ERP UP zufrieden bist, kannst Du mich gerne unterstützen. Dabei gibt es unzählige Möglichkeiten, wie Du mich einfach und schnell unterstützen kannst. Wie Du genau ERP UP unterstützen kannst, erfährst Du hier. Vielen Dank.

Schreibe einen Kommentar