Do.

ABAP CTE( Common Table Expressions) 본문

SAP/ABAP

ABAP CTE( Common Table Expressions)

성공보다는 가치를.. 2022. 9. 14. 17:35
728x90

해당 기능은 ABAP 7.51 부터 지원한다. 

 

CTE는 Internal Table간의 Join을 지원합니다.

아래 예제를 보면 이해가 편할듯 하네요. 

 

    "-- Get EKBE
    WITH +base AS ( SELECT a~ebeln, a~ebelp, a~werks, a~matnr,
                        CASE WHEN shkzg = 'S'
                           THEN SUM( a~menge ) * -1
                           ELSE SUM( a~menge )
                        END AS menge
                        FROM ekbe AS a
                        INNER JOIN @lt_ekko AS b ON b~ebeln = a~ebeln
                                                AND b~ebelp = a~ebelp
                       WHERE vgabe = '1'
                         AND a~werks = @i_werks
                       GROUP BY a~ebeln, a~ebelp, a~shkzg, a~werks, a~matnr ) ,
         "-- EKBE Group by
          +sum AS ( SELECT
                      FROM +base AS a
                      FIELDS ebeln, ebelp, werks, matnr,
                      SUM( menge ) AS menge
                      GROUP BY ebeln, ebelp, werks, matnr )

   "-- Set EKBE Return
    SELECT *
    FROM +sum
    INTO TABLE @DATA(lt_ekbe).

위 예제는 구매문서, 항번, 자재, 플랜트별 수량 합계를 CTE로 구현한 예로써 차대변 지시자를 기준으로 계산을 해줍니다. 

 

기존대로라면 가져와서 Loop 돌면서 계산을 해주었겠지만 개발 서버 버전이 높아서 CTE를 통해 구현을 해보았습니다.

 

참고로 With 에서 마침표까지가 하나의 With문으로 +base 는 다른 With에서 사용할 수 없습니다. 

동일한 이름으로 다른 구조를 가지도록 선언해도 됩니다. 

 

아래는 같은 Function의 다른로직

  "-- Get PO Data
  WITH +base AS ( SELECT a~lifnr, b~ebeln, b~ebelp, b~werks, b~matnr,
                         CASE WHEN retpo = 'X'
                              THEN SUM( menge ) * -1
                              ELSE SUM( menge )
                          END AS menge
                    FROM ekko AS a
                    INNER JOIN ekpo AS b ON b~ebeln = a~ebeln
                    WHERE b~werks IN @r_werks
                      AND b~bstyp EQ 'F'
                      AND a~bsart IN ('NB','SB')
                      AND a~loekz EQ @space
                      AND b~elikz EQ @space
                      AND b~loekz EQ @space
                     "-- 제외할 저장위치
                      AND b~lgort NOT IN ( SELECT lgort
                                             FROM mdlg
                                            WHERE werks EQ @i_werks )
                GROUP BY a~lifnr, b~ebeln, b~ebelp, b~werks, b~matnr, b~retpo ),

         "-- EKKO Group by
          +sum AS ( SELECT
                      FROM +base AS a
                      FIELDS a~lifnr, a~ebeln, a~ebelp, a~werks, a~matnr,
                      SUM( menge ) AS menge
                      GROUP BY a~lifnr, a~ebeln, a~ebelp, a~werks, a~matnr )

   "== Set EKKO Return
    SELECT *
    FROM +sum
    INTO TABLE @DATA(lt_ekko).

 

아시다시피 HANA에서는 FOR ALL ENTRIES를 지양합니다.

CTE가 대안이 될 수 있을 것 같네요.

 

참고하시면 좋을듯 합니다.

728x90

'SAP > ABAP' 카테고리의 다른 글

[HANA] For All Entries의 사용  (0) 2022.11.04
HANA에서 Smartform 사용 하는 법  (0) 2022.10.14
HTML 본문 메일 전송  (0) 2022.07.28
ABAP 동적 구조생성  (0) 2022.07.26
ABAP Debugging에 대한 설명  (0) 2022.07.22