Select cast Substring in einem Inner-Join

Aus SAP-Wiki
Zur Navigation springenZur Suche springen

Siehe Schlüsselbefehl Select.

Siehe Kategorie:Neues ABAP.

Siehe Select Substring.

Es kann der Fall auftreten, dass man Felder im Inner-Join nicht direkt joinen kann, da sie eine unterschiedliche Feldlänge haben, z. B. EKPO-EBELP (Numc5) <> KONV-KPOSN (Numc6), obwohl sie eigentlich jeweils in diesem Fall die Bestellposition speichern.

Typkonflikt

Ein direkter Inner-Join würde zu keinem Ergebnis kommen

Select
  ...
from ekko
inner join ekpo
 on ekpo~ebeln = ekko~ebeln
INNER JOIN konv
  ON konv~knumv = ekko~knumv
 and konv~kposn = ekpo~ebelp

Cast Substring

Der Inner-Join wird nun angepasst mit CAST SUBSTRING, wo nur 5 Zeichen vom Feld KONV-KPOSN angesprochen werden und mit EKPO-EBELP gleichgesetzt wird.

Select
  ...
from ekko
inner join ekpo
 on ekpo~ebeln = ekko~ebeln
INNER JOIN konv
  ON konv~knumv = ekko~knumv
 AND CAST( SUBSTRING( konv~kposn, 2, 5 ) AS NUMC( 5 ) ) = ekpo~ebelp
 ...

In einem anderen Beispiel, von die Felder LIPS-VKPOS und EKPO-EBELP unterschiedlichen Datentyp haben (NUMC6 und NUMC5).

Es wird hier die kleinste Lieferposition und passende Bestellposition gelesen zum Inputparameter IV_VBELN_LF.

SELECT
  likp~vbeln,
  SUBSTRING( likp~kunnr, 7, 4 ),
  ekpo~lgort
  FROM likp
  inner join lips
    on lips~vbeln = likp~vbeln
  inner join ekpo
    on lips~vgbel = ekpo~ebeln
   and CAST( SUBSTRING( lips~vgpos, 2, 5 ) AS NUMC( 5 ) ) = ekpo~ebelp
  WHERE likp~vbeln = iv_vbeln_lf
  order by lips~posnr
  INTO (@ev_vbeln_lf,
        @ev_werks,
        @ev_lgort)
  up to 1 rows.
 endselect.

In einem weiteren Beispiel musste das Feld EKBE-BUZEI (NUMC4) mit LIPS-POSNR (NUMC6) verknüpft werden.

Select
  ekko~ebeln,
  ekpo~matnr,
  ekpo~lgort,
  lips~lfimg
  from ekko                      "Tabelle: Bestellung Kopf
  inner join ekpo                "Tabelle: Bestellposition
    on ekpo~ebeln = ekko~ebeln
  inner join ekbe                "Tabelle: Bestellhistorie
    on ekbe~ebeln = ekpo~ebeln
   and ekbe~ebelp = ekpo~ebelp
   and ekbe~vgabe = '8'          "Verknüpfung zur Lieferung
  inner join lips                "Tabelle: Lieferposition
    on lips~vbeln = ekbe~belnr
   and CAST( SUBSTRING( lips~posnr, 3, 4 ) AS NUMC( 4 ) ) = ekbe~buzei
  where ...

CAST-Statement im CDS

  • In CDS-Views funktioniert die CAST-Lösung in der FROM-Klausel allerdings leider nicht. Siehe SAP-Hilfe: CAST-Express im CDS (EN)
  • Hier muss man dann eine andere Lösung finden.

Ein Kollege hat diese Lösung realisiert, wo das 5stellige Feld EKPO-EBELP zu einem 6stelligen Feld mit einer führenden Null konvertiert wird.

key cast(lpad(ekpo.ebelp,6,'0') as abap.numc( 6 ) ) as ebelp,

Web-Links