Select coalesce-Funktion

Aus SAP-Wiki
Wechseln zu:Navigation, Suche

Siehe Schlüsselbefehl Select.

Ab ABAP-Release 7.40 SP5 gibt es den Befehl "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. 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 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 ...

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.