趣旨
実務の中で「これはCode push downできそう」と思ったネタを実装します。(ネタはエッセンスのみで、実際の要件とは異なります)
思いついたベースでこの記事に追加していきます。
Code push downに関するこれまでの記事
【ABAP】Code push downを実現する方法
【ABAP】Code push down実装編
要件1:EKKOとEKPOを結合、EKPOは削除されていない1件だけ
発注ヘッダ(EKKO)と明細(EKPO)を結合したデータを取得します。
ただし、EKPOから欲しいのはプラント、保管場所情報のみです。
1発注内でプラント、保管場所は共通という制約があるので、EKPOの削除されていない明細の中から最小の明細を取得したいです。
考えたこと
①INNER JOINの条件に最小の明細番号を指定できないか?
SELECT EBELN, EKORG, EKGRP, EBELP, WERKS, LGORT
FROM EKKO
INNER JOIN EKPO
ON EKKO~ebeln = EKPO~EBELN
AND EKPO~ebelp = select min( ebelp ) from ekpo where ebeln = '4500000001' and loekz is initial.
シンタックスとしてONの条件にSELECTを書けないためダメでした。
あと、発注番号がパラメータなどで指定されないとこの書き方では無理。
②CDSビューを2つ作って最小の明細番号を条件に取得できないか?
ちょっと面倒ですが、2つのCDSビューを作ることにしました。
- EKPOから発注番号と削除されていない最小の明細番号の組み合わせを取得するビュー
- EKKOと1.のビューを結合し、さらにEKPOを足したビュー
ビュー1
※アノテーションは省略しています
define view ZMOB58_I_MIN_PO as select from ekpo {
key ebeln,
key min( ebelp ) as ebelp
}where loekz is initial
group by ebeln
ビュー2
define view ZMOB58_C_PO
as select from ekko as h
inner join ZMOB58_I_MIN_PO as min_i on h.ebeln = min_i.ebeln
association [1] to ekpo as _ekpo on min_i.ebeln = _ekpo.ebeln
and min_i.ebelp = _ekpo.ebelp
{
key h.ebeln,
key ebelp,
bukrs,
bsart,
lifnr,
ekorg,
ekgrp,
waers,
_ekpo.werks,
_ekpo.lgort
}
ビュー2をABAPから呼ぶこともできます。
SELECT * from zmob58_c_po
INTO TABLE @DATA(lt_ebelp).
結論
残念ながらSQL一発では無理で、CDS2つでできました。
ビューを定義するのがちょっと面倒ですが、ビューごとに正しい結果になっているか確認しながら進められるのでわかりやすいと思いました。