Select coalesce-Funktion
Siehe Schlüsselbefehl Select.
Siehe Kategorie:Neues ABAP.
Ab ABAP-Release 7.40 SP5 gibt es die eingebaute Funktion "Coalesce".
Bei einem Select eines Feldes kann ein Ersatzwert angegeben werden, wenn der Feldwert NULL ist. Ein NULL-Wert kommt zustande, wenn ein "Left outer join" auf eine Tabelle selektiert wird und auf der rechten Seite kein Datensatz existiert. Es können zur Vergleichstabelle Datensätze vorhanden sein, aber müssen nicht.
coalesce( <feldname>, ersatzwert )
Mit der Coalesce-funktion können auch Tabellenfelder von einer Left-Outer-Join-Tabelle in einem Select mit einem Select-Options oder Parameter korrekt abgefragt werden.
Coalesce beim Selektionsfeld
Hier wird z. B. Entweder die Kundennummer KUNNR von der Tabelle VBPA für den Partner "ZF" eingetragen, wenn vorhanden oder den Wert "0" im Zielfeld der internen Tabelle. Der Partnerrolle "ZF" kann für den Kundenauftrag vorhanden sein oder nicht.
SELECT
coalesce( vpba-kunnr, '0' )
FROM vbak
INNER JOIN vbpa
On vbpa-vbeln = vbak-vbeln
And vbpa-parvw = 'ZF'
INTO ...
Hier könnte auch ein "Left outer join" (bzw. "left join") verwendet werden
SELECT
coalesce( vpba-kunnr, '0' )
FROM vbak
LEFT OUTER JOIN vbpa
On vbpa-vbeln = vbak-vbeln
And vbpa-parvw = 'ZF'
INTO ...
Coalesce beim Where-Feld
- Sehr spannend ist es nach einem Feld einer Tabelle abfragen, was per "Left outer join" im Select einbezogen ist. In älteren ABAP-Releases war dies nicht möglich und es gab einen Syntaxfehler bei der Codeprüfung.
- Fragt man jedoch in einem neuen ABAP-Release in der Where-Bedingung nach einem Feld der "left Outer Join"-Tabelle ab, kann dies ohne Nutzung von "Coalesce" zu unerwünschten Ergebnissen der Selektion führen. Es funktioniert korrekt, wenn man im Select-Options nach "Inclusive"-Einträgen selektiert. Dann werden diese Werte selektiert und alle Werte, die diese Bedingung nicht erfüllen, nicht selektiert - so wie erwartet. Wenn man jedoch im Select-Options nach dem nicht gefüllten Datensatz/Wert der "Left Outer Join"-Tabelle abfragen möchte, würde man intuitiv doppelt auf das nicht gefüllte Select-Options-Feld klicken und dann mit "EQ" den Initialwert abfragen. Bei einem nicht vorhandenen Datensatz der "Left Outer Join"-Tabelle ist jedoch der abgefragte Feldwert nicht initial, sondern nicht vorhanden (NULL). Eine Abfrage auf den Initialwert wird diesen Select-Datensatz nicht ausgebeben. Mit der Coalesce-Funktion kann man nun jedoch einen Ersatzwert angeben, wenn die "Left Outer Join"-Tabelle diesen Datensatz nicht hat. Hier trägt man dann den Initialwert des Feldes (meist Space oder 0) ein.
- Die Tabelle "Z_LO_ARUN2LSP" wird in diesem Beispiel per "left outer join" eingebunden. Nicht für jeden Satz in der Tabelle FSH_BDBS gibt es einen Datensatz in der Tabelle "Z_LO_ARUN2LSP". Es wird in der Where-Abfrage für das Feld IDOC_NUM der Ersatzwert SPACE (Initialwert) angegeben und dann kann korrekt auf den Select-Options "S_IDOC" abgefragt werden.
- Das Füllen der internen Tabelle CT_ITAB muss bei dieser Konstruktion am Ende des Selects stehen, sonst gibt es einen Syntaxfehler.
Select fsh_bdbs~werks, ... lsp~eindt, lsp~send2lsp, lsp~idoc_num, lsp~timestamp_upd FROM fsh_bdbs left outer join z_lo_arun2lsp as lsp on lsp~aufnr = fsh_bdbs~aufnr and lsp~posnr = fsh_bdbs~posnr and lsp~ETENR = fsh_bdbs~ETENR WHERE fsh_bdbs~werks IN @s_werks AND ... coalesce( lsp~idoc_num, ' ' ) in @s_idoc INTO TABLE @ct_itab.
Ähnlich war das Problem, als in einem komplexen Inner-Join die Tabelle EINA abgefragt wurde bei Left Outer Join und wenn EINA-Datensätze gefunden werden, dann sollte EINA-LOEKZ = space sein.
Die Where-Bedingung
Select ... from vbrk inner join vbrp on vbrp~vbeln = vbrk~vbeln left ounter join eina on eina~matnr = vbrp~matnr where eina~loekz = @space and ..
wäre dann nicht korrekt, wenn keine EINA-Datensätze gefunden werden über die Left Outer Join-Bedingung. Um auch diesen Fall abzufragen wird die Where-Abfrage korrigiert
where coalesce( eina~loekz, ' ' ) = @space