Wenn feld in Tabelle leer ist anderen Select ausführen

Getting started ... Alles für einen gelungenen Start.
12 Beiträge • Seite 1 von 1
12 Beiträge Seite 1 von 1

Wenn feld in Tabelle leer ist anderen Select ausführen

Beitrag von f.weissenberger (ForumUser / 23 / 3 / 0 ) »
Hallo Zusammen,

ich würde gerne wissen, was der Best-Practice für folgenden Fall ist.

Ich will schauen ob ein Eintrag in einer Tabelle einen Wert in einem bestimmten Feld hat oder nicht.
Je nachdem soll dann ein anderer Select ausgeführt werden.
Also wenn das Feld befüllt ist, soll es dieses Datensatz ziehen, ansonsten den mit dem Eintrag "DEFAULT".

So habe ich es momentan gelöst:

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.
Wir löst man so etwas im Normalfall bzw. am besten?

Danke & Gruß
Fabio


Re: Wenn feld in Tabelle leer ist anderen Select ausführen

Beitrag von ewx (Top Expert / 4383 / 214 / 486 ) »

Code: Alles auswählen.

If lv_ident is initial.
  lv_ident = 'DEFAULT'.
endif.

Re: Wenn feld in Tabelle leer ist anderen Select ausführen

Beitrag von qyurryus (ForumUser / 68 / 48 / 25 ) »
Alternativ den "DEFAULT"-Eintrag sofort mitlesen und in eine interne Tabelle zwischenspeichern, damit reduziert man auf eine einzige DB-Operation.

z.B. sowas:

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.
Zuletzt geändert von qyurryus am 16.03.2021 16:55, insgesamt 1-mal geändert.

Re: Wenn feld in Tabelle leer ist anderen Select ausführen

Beitrag von ralf.wenzel (Top Expert / 3570 / 167 / 244 ) »
Alternative: Tabelle sortieren nach ident und einen LOOP auf die printers machen. Dann trifft er den ersten Eintrag, das ist entweder DEFAULT oder eben nicht.

Ralf

Re: Wenn feld in Tabelle leer ist anderen Select ausführen

Beitrag von ewx (Top Expert / 4383 / 214 / 486 ) »
Das wird nix, Ralf.
Du weißt ja nicht, ob AAA oder ZZZ zugeordnet ist.

Re: Wenn feld in Tabelle leer ist anderen Select ausführen

Beitrag von ralf.wenzel (Top Expert / 3570 / 167 / 244 ) »
Nein, im OP ist ident entweder leer oder nicht.


Ralf

Re: Wenn feld in Tabelle leer ist anderen Select ausführen

Beitrag von ewx (Top Expert / 4383 / 214 / 486 ) »
Nein. Nur *falls* Ident leer ist, soll DEFAULT genommen werden.

Re: Wenn feld in Tabelle leer ist anderen Select ausführen

Beitrag von black_adept (Top Expert / 3522 / 71 / 697 ) »
Moin Fabio,
was du da machst ist doch eine normale Fallbacklösung. Aber statt der 3 Selects brauchst du eigentlich nur 2.
Etwa so:

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.
Man könnte das auch in einen einzigen SELECT verpacken ( hint: COALESCE ), aber das ist dann etwas schwerer zu lesen.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Wenn feld in Tabelle leer ist anderen Select ausführen

Beitrag von ewx (Top Expert / 4383 / 214 / 486 ) »
Ich würde die OR-Bedingung noch mal prüfen.

Aber ansonsten lässt sich eindeutig sagen:
Es gibt einen Best-practice dafür.
Und der ist: Jeder macht es anders... 🙃

Re: Wenn feld in Tabelle leer ist anderen Select ausführen

Beitrag von DeathAndPain (Top Expert / 1533 / 177 / 340 ) »
Wollt auch gerade sagen... AND bindet enger als OR, und bei

Code: Alles auswählen.

  WHERE PROG = @I_PROG
  AND STKZ = @I_STKZ
  AND IDENT = @I_USER
   OR IDENT = @I_FRONTEND
werden im Falle IDENT = @I_FRONTEND die Spalten STKZ und PROG nicht mehr geprüft.

Was stattdessen höchstwahrscheinlich gemeint ist (und sich obendrein besser liest), ist:

Code: Alles auswählen.

  WHERE PROG = @I_PROG
  AND STKZ = @I_STKZ
  AND IDENT IN (@I_USER,@I_FRONTEND)
Ansonsten halte ich den Ansatz von qyurryus für optimal, jedenfalls wenn man mal davon absieht, dass er auch auf den obenstehenden Logikfehler mit dem OR reingefallen ist (der aber per IN leicht zu heilen ist) und dass er zwar Inline-Deklaration nach Release 7.40, dann aber den ollen READ TABLE statt der neuen Notation verwendet.

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
qyurryus


Re: Wenn feld in Tabelle leer ist anderen Select ausführen

Beitrag von qyurryus (ForumUser / 68 / 48 / 25 ) »
Cool, kannte das inline IN gar nicht!
Habe in meinem Select mal Klammern ergänzt um den Logikfehler zu beheben.

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!

Re: Wenn feld in Tabelle leer ist anderen Select ausführen

Beitrag von DeathAndPain (Top Expert / 1533 / 177 / 340 ) »
qyurryus hat geschrieben:Cool, kannte das inline IN gar nicht!
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: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!
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.

Seite 1 von 1

Aktuelle Forenbeiträge

SmartForms show table...
vor 5 Tagen von Lucyalison 2 / 2261
Wie groß ist mein DynPro?
vor 5 Tagen von JanR gelöst 3 / 1135

Vergleichbare Themen

Dynpro-Feld aus Marc leer
von 82kolu1bma » 31.05.2016 16:46
ist Feld leer (kein Datensatz) ?
von bohne » 03.03.2006 23:38
Mailversand wenn Feld leer ist | SO_NEW_DOCUMENT_SEND_API1
von f.weissenberger » 08.01.2020 09:10
select-options wenn sel leer ist
von sarah » 23.04.2004 11:04