LoginSignup
7
3

More than 3 years have passed since last update.

【ABAP】Code push down実践編(メモ)

Last updated at Posted at 2019-08-21

趣旨

実務の中で「これは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を書けないためダメでした。
あと、発注番号がパラメータなどで指定されないとこの書き方では無理。

エラー画面
image.png

②CDSビューを2つ作って最小の明細番号を条件に取得できないか?

ちょっと面倒ですが、2つのCDSビューを作ることにしました。
1. EKPOから発注番号と削除されていない最小の明細番号の組み合わせを取得するビュー
2. 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の実行結果
image.png

ビュー2をABAPから呼ぶこともできます。

SELECT * from zmob58_c_po
   INTO TABLE @DATA(lt_ebelp).

結論

残念ながらSQL一発では無理で、CDS2つでできました。
ビューを定義するのがちょっと面倒ですが、ビューごとに正しい結果になっているか確認しながら進められるのでわかりやすいと思いました。

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3