Select coalesce-Funktion

Aus SAP-Wiki
Zur Navigation springenZur Suche springen

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

Web-Links