Code: Alles auswählen.
DATA: LV_IDENT TYPE ZZBC_DRUCK-IDENT.
SELECT SINGLE IDENT FROM ZZBC_DRUCK
WHERE PROG = @I_PROG
AND STKZ = @I_STKZ
AND IDENT = @I_USER
OR IDENT = @I_FRONTEND
INTO @LV_IDENT.
IF LV_IDENT IS NOT INITIAL.
SELECT SINGLE DRUCKER FROM ZZBC_DRUCK
WHERE PROG = @I_PROG
AND STKZ = @I_STKZ
AND IDENT = @LV_IDENT
INTO @E_DRUCKER.
ELSE.
SELECT SINGLE DRUCKER FROM ZZBC_DRUCK
WHERE PROG = @I_PROG
AND STKZ = @I_STKZ
AND IDENT = 'DEFAULT'
INTO @E_DRUCKER.
ENDIF.
Code: Alles auswählen.
SELECT IDENT, DRUCKER
FROM ZZBC_DRUCK
WHERE PROG = @I_PROG
AND STKZ = @I_STKZ
AND ( IDENT = @I_USER OR IDENT = @I_FRONTEND OR IDENT = 'DEFAULT' )
INTO TABLE @DATA(printers).
READ TABLE printers INTO DATA(printer) WHERE ident <> 'DEFAULT'.
IF sy-subrc <> 0.
READ TABLE printers INTO printer WHERE ident = 'DEFAULT'.
ENDIF.
e_drucker = printer-drucker.
Code: Alles auswählen.
SELECT SINGLE DRUCKER FROM ZZBC_DRUCK
WHERE PROG = @I_PROG
AND STKZ = @I_STKZ
AND IDENT = @I_USER
OR IDENT = @I_FRONTEND
INTO @E_DRUCKER.
IF SY-SUBRC <> 0. " Fallbackfall, falls zu IDENT nix gefunden wurde
SELECT SINGLE DRUCKER FROM ZZBC_DRUCK
WHERE PROG = @I_PROG
AND STKZ = @I_STKZ
AND IDENT = 'DEFAULT'
INTO @E_DRUCKER.
ENDIF.
Code: Alles auswählen.
WHERE PROG = @I_PROG
AND STKZ = @I_STKZ
AND IDENT = @I_USER
OR IDENT = @I_FRONTEND
Code: Alles auswählen.
WHERE PROG = @I_PROG
AND STKZ = @I_STKZ
AND IDENT IN (@I_USER,@I_FRONTEND)
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
qyurryus
Den IN gibt es schon sehr lange. Wenn meine Erinnerung mich nicht täuscht, ging das schon bei Release 3.1i. Er ist es auch, was SAP gegenüber der Datenbank typischerweise zu verwenden pflegt, wenn Du in ABAP einen FOR ALL ENTRIES IN nutzt. Dadurch kann die Performance drastisch gesteigert werden, da man in Richtung der Datenbank entsprechend weniger Zugriffe benötigt. Allerdings verpackt FOR ALL ENTRIES IN nicht alle Werte aus der internen Tabelle in ein einziges IN-Statement, da zu viele Werte bei IN dazu führen, dass die Datenbank den Index für das Feld nicht mehr nutzt. Wie viele Werte pro SELECT performant sind, hängt von der verwendeten Datenbank ab und wird in den Profilparametern des Systems eingestellt. Nach meiner Erinnerung soll man bei Oracle nur 5 Werte verwenden, bei Sybase immerhin 128. Die entsprechende Stückelung macht der ABAP-Interpreter dann aber automatisch; als Programmierer brauchst Du Dich darum nicht zu kümmern. Hauptsache, die Profilparameter stehen richtig (und dafür gibt es SAP-Hinweise).qyurryus hat geschrieben:Cool, kannte das inline IN gar nicht!
Würde ich auch so sehen, zumal die zwar (leider noch immer) weniger verbreitet, aber ja eigentlich von der Lesbarkeit her viel anschaulicher ist, jedenfalls sobald man sich einmal daran gewöhnt hat. Zum ersten Schritt muss man sich zwingen, aber danach schaut man nicht mehr zurück und will den alten Kram nicht mehr haben. READ TABLE braucht man dann nur noch, wenn man entweder den SY-TABIX braucht oder per BINARY SEARCH auf einer als Standardtabelle deklarierten, aber dennoch inhaltlich sortierten internen Tabelle performant suchen möchte. Was die seltene Ausnahme sein sollte, da es normalerweise besser ist, solche Tabellen gleich als SORTED oder gar HASHED zu deklarieren.qyurryus hat geschrieben:Die olle READ TABLE Notation habe hier der Einfachheit halber genommen, ist für Neulinge vielleicht etwas einfacher zu verstehen... aber andererseits sollte man wahrscheinlich trotzdem die neuere Notation nehmen, damit diese mal etwas geläufiger wird!