본문 바로가기
SAP Story/CDS View

DDL정의(2) View 정의 - 데이터 집계(Select)- ASSOCIATION (path_expr)

by 돈보따리 2022. 11. 30.
반응형

Association에서 사용하는 경로식에 대해서 알아보도록 합니다.
당연하겠지만 Inner Join 및 Outer Join 에서도 사용됩니다.

 


문법

... [viewEntity.]_assoc1[ parameters][attributes]
                     [._assoc2[ parameters][ attributes] ... ][.element] ...

 

효과

CDS View의 Select 선택부분 에서 CDS 경로식을 지정합니다. ( Association에 대한 데이터 소스 사이의 관계를 지정 ) 경로식은  _assoc1, _assoc2 등을 사용하여 지정된 이름과 같은 연관 문자열입니다. 이것은 마침표( . )으로 구분됩니다.

 

ABAP CDS 의 CDS DDL 에서 사용하는 경로식은 다음과 같이 이용할 수 있다.

  ■ 데이터 소스의 이름

  ■ Select 목록의 요소

  ■ Where 조건 또는 Having 조건의 피연산자

 

조건의 피연산자로 지정된 경로식을 Elements를 사용하여 종결해야합니다. Where 조건 또는 Having 조건에서 집계식의 선Select 목록의 집계되지 않은 Elements에서 경로식의 결과는 1개이어야 합니다. 이것은 사용된 모든 연관의 카디널리티가 '1'이라는 것을 의미합니다. 또는 경로식에 '1:.'을 추가 사용하여 1개로 선언된 필터 조건만 포함할 수 있습니다.

 

경로식을 사용하여 CDS View에 접근할 때 다음 내용이 반영됩니다.

  ■ 연관에의한 결합(Join)은 왼쪽에서 오른족으로 정의

  ■ 질의에서 CDS View의 다른 모든 조건

 

경로식은 이 평가의 전체 결과 또는 .element를 사용하여 추가된 단일 요소를 처리합니다.

  ■ element를 사용하여 경로식이 종료되었다면, 경로는 최종 연관의 타겟 데이터 소스의 element 이어야 합니다.

  ■ 연관을 사용하여 경로직을 종결하면, 이는 경로식의 위치에 따라 다음과 같이 해석됩니다.

      - 연관은 From 뒤에오는 데이터 소스 data_source 입니다.

      - Select 목록의 elements 로써 연관은 다른 CDS View 또는 Open Sql 에서 사용을 위해 게시됩니다.

 

Where 구문 또는 Having 구문에서 경로식은 Element를 사용하여 종결되어야 합니다.

 

첫번째 연관이 지정된 CDS View의 이름은 이 연결 앞에 지정할 수 있습니다. 경로식의 첫 번쨰 연관른 현재 CDS View에서 정의되거나, 현재 View의 데이터 소스에서 Element로 게시되어야 합니다. 이후의 모든 연관은 경로식에서 직접적으로 사전 정의된 연관의 대상 데이터소스에 게시되어야 합니다.

 

  ■ attributes 를 사용하여 모든 연관 이후에 각 괄호 안에 속성을 지정할 수 있습니다. 이러한 속성은 경로식에서 다음과 같은 추가 속성을 정의합니다

      - 단일 값 선언

      - 결합 식(Join expression)의 범주
      - 필터 조건 지정

  ■ 데이터 소스인 target 을 입력 매개변수(Input Parameters)를 사용하여 CDS 엔터티에 대한 연관을 지정했다면, 매개변수는 실제 매개변수를 전달히기 위해 반드시 _assoc 이름 다음에 사용되어야 합니다. 게시된 연관에 대해서 Select 목록의 element로 매개변수를 지정할 수 없습니다.

 

메모

  ■ 가장 간단한 경로식은 단일 연관의 이름입니다.

  ■ CDS DDL 경로식은 ABAP CDS의 ABAP CDS DCL(Data control language)에서 사용될 수 있습니다.

  ■ 타겟 데이터 소스의 연관을 게시하지 않은 연관은 경로식에서 연결할 수 없습니다. 더 구체적으로, 타겟 데이터 소스가 데이터 베이스 테이블 또는 Classic View 인 연관 후에는 더 이상의 연관을 경로식으로 만들 수 없습니다.

  ■ View의 경로식의 연관이 Join으로 정듸될 때, Join식에는 가능한 한 적게 매핑됩니다. ABAP 주석인  AbapCatalog.compiler.compareFilter 가 여기에서 사용됩니다. true  값은 의미적으로 동일한 조건을 가진 연관이 서로 다른 Join 식을 생성하지 않도록 보장합니다.

 

예시

다음 CDS View 는 Select 목록에 간단한 경로식인 _scarr[inner].carrname 를 포함하고 있습니다. Join유형을 제어하는 속성으로는 Inner 가 지정되었습니다. 프로그램  DEMO_FROM_JOIN_TO_ASSOCIATION 는 이 View가 ABAP CDS 또는 Open SQL 에서 직접 프로그래밍된 Inner join과 동일한 결과를 반환한다는 것을 보여줍니다.

 

프로그램 DEMO_FROM_JOIN_TO_ASSOCIATION

REPORT demo_from_join_to_association.

CLASS demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS main.
ENDCLASS.

CLASS demo IMPLEMENTATION.
  METHOD main.

    "Open SQL Join
    SELECT FROM spfli
              INNER JOIN scarr ON
                 spfli~carrid scarr~carrid
           FIELDS scarr~carrname  AS carrier,
                  spfli~connid    AS flight,
                  spfli~cityfrom  AS departure,
                  spfli~cityto    AS arrival
           ORDER BY carrierflight
           INTO TABLE @DATA(result_open_sql_join).

    "ABAP CDS Join
    SELECT FROM demo_cds_join1
           FIELDS *
           ORDER BY carrierflight
           INTO TABLE @DATA(result_cds_join).

    "ABAP CDS Association
    SELECT FROM demo_cds_join2
           FIELDS *
           ORDER BY carrierflight
           INTO TABLE @DATA(result_cds_assoc).

    ASSERT result_cds_join  result_open_sql_join.
    ASSERT result_cds_assoc result_cds_join.

    cl_demo_output=>displayresult_cds_assoc ).
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  demo=>main).

Inner Join 으로 구현한 CDS 엔터티

@AbapCatalog.sqlViewName: 'DEMO_CDS_JN1'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view demo_cds_join1
  as select from spfli
    inner join   scarr on
      spfli.carrid = scarr.carrid
  {
    scarr.carrname  as carrier,
    spfli.connid    as flight,
    spfli.cityfrom  as departure,
    spfli.cityto    as arrival
  }

 

Association으로 구현한 CDS 엔터티

@AbapCatalog.sqlViewName: 'DEMO_CDS_JN2'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view demo_cds_join2
  as select from spfli
  association to scarr as _scarr on
    spfli.carrid = _scarr.carrid
  {
    _scarr[inner].carrname as carrier,
    spfli.connid           as flight,
    spfli.cityfrom         as departure,
    spfli.cityto           as arrival
  }

두 CDS 엔터티의 결과는 동일합니다.

 

 

예시

다음은 3개의 CDS View 예시입니다. ( sales_order, business_partner, and invoice ) CDS View 'invoice'는 경로식에서 자신에 대한 연관 및 다른 2개의 View에 있는 연관을 사용했습니다.

  ■ CDS View business_partner 의 연관 sales_order 는 From 뒤에서 데이터 소스로 지정되었습니다. 필터 조건은 특정 주문만 데이터 소스로 사용할 수 있음을 보장합니다.

  ■ 분리된 연관인 invoice_header 는 Where 조건에서 피연산자로 경로식에 사용됩니다.

  ■ CDS View sales_order 의 연관 note_headerbusiness_partner 에서 대체 이름 bpa로 사용되고, Select 목록의 elements로 정의됩니다.

 

@AbapCatalog.sqlViewName: 'SALES_ORDER_VW'
define view sales_order as
  select from snwd_so
         association [0..1] to snwd_text_key as _note_header
           on snwd_so.note_guid = _note_header.node_key
  { * } // Include all fields from snwd_text_key
@AbapCatalog.sqlViewName: 'BPA_VW'
define view business_partner as
  select from snwd_bpa
         association [0..*] to sales_order
           on snwd_bpa.node_key = sales_order.buyer_guid
  { * }
@AbapCatalog.sqlViewName: 'SALESO_INV_VW'
define view invoice as
  select from
         /* Association "sales_order" with filter as data source */
         business_partner.sales_order[
           lifecycle_status <> 'C' and lifecycle_status <> 'X']
           as bpa_so //alias for data source
         /* Association only used in this view definition */
         association [0..1] to snwd_so_inv_head as _invoice_header
           on bpa_so.node_key = _invoice_header.so_guid
        { key bpa_so.node_key, //Field from ON-condition in _invoice_header
              bpa_so.so_id,
              bpa_so.note_guid, //Field from ON-condition in note_header
              bpa_so.lifecycle_status,
              /* Association is not published, but its element */
              _invoice_header.dunning_level,
              /* Association from data source is published here */
              bpa_so.note_header }
          /* Path expression in WHERE clause */
          where _invoice_header.dunning_level > '0';

 


프로그램 실행으로 연관을 이해해보자.

이 예시는 Open Sql의 Select 목록에서  경로식을 보여줍니다.

프로그램 demo_cds_association_path 를 보겠습니다.

REPORT demo_cds_association_path.

CLASS demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS main.
ENDCLASS.

CLASS demo IMPLEMENTATION.
  METHOD main.
    DATA carrid TYPE scarr-carrid VALUE 'AA'.
    cl_demo_input=>request( CHANGING field = carrid ).

    "Path expressions in Open SQL
    SELECT scarr~carrname,
           \_spfli[ (*) ]-connid AS connid,
           \_spfli[ (*) ]\_sflight[ (*) ]-fldate AS fldate,
           \_spfli[ (*) ]\_sairport-name AS name
           FROM demo_cds_assoc_scarr AS scarr
           WHERE scarr~carrid = @carrid
           ORDER BY carrname, connid, fldate
           INTO TABLE @DATA(result1).

    "Joins in Open SQL
    SELECT demo_cds_assoc_scarr~carrname,
           demo_cds_assoc_spfli~connid,
           sflight~fldate AS fldate,
           sairport~name  AS name
           FROM demo_cds_assoc_scarr
             LEFT OUTER JOIN demo_cds_assoc_spfli
               ON demo_cds_assoc_spfli~carrid =
                    demo_cds_assoc_scarr~carrid
             LEFT OUTER JOIN demo_cds_sflight AS sflight
               ON sflight~carrid = demo_cds_assoc_spfli~carrid AND
                  sflight~connid = demo_cds_assoc_spfli~connid
             LEFT OUTER JOIN demo_cds_sairport as sairport
               ON sairport~id = demo_cds_assoc_spfli~airpfrom
           WHERE demo_cds_assoc_scarr~carrid = @carrid
           ORDER BY demo_cds_assoc_scarr~carrname,
                    demo_cds_assoc_spfli~connid,
                    fldate
           INTO TABLE @DATA(result2).
    ASSERT result1 = result2.

    "Path expressions in CDS
    SELECT *
       FROM demo_cds_use_assocs( p_carrid = @carrid )
       ORDER BY carrname, connid, fldate
       INTO TABLE @DATA(result3).
    ASSERT result1 = result3.

    "Joins in CDS
    SELECT *
       FROM demo_cds_outer_joins( p_carrid = @carrid )
       ORDER BY carrname, connid, fldate
       INTO TABLE @DATA(result4).
    ASSERT result1 = result4.

    cl_demo_output=>display( result1 ).

  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  demo=>main( ).

 

설명

첫 번째 Select 구문은 CDS View demo_cds_assoc_scarr 에 접근합니다.

@AbapCatalog.sqlViewName: 'DEMO_CDS_ASC_CAR'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view demo_cds_assoc_scarr
  as select from scarr
  association to demo_cds_assoc_spfli as _spfli on
    scarr.carrid = _spfli.carrid
  {
    _spfli,
    carrid,
    carrname
  }

이 View에서 Select 목록에서 _spfli 으로 연관이 게시됩니다. 연관 _spfli는 View demo_cds_assoc_spfli 를 타겟 데이터 소스로 사용합니다.

@AbapCatalog.sqlViewName: 'DEMO_CDS_ASC_SPF'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view demo_cds_assoc_spfli
  as select from
    spfli
    association        to sflight  as _sflight  on
          spfli.carrid = _sflight.carrid
      and spfli.connid = _sflight.connid
    association [1..1] to sairport as _sairport on
      spfli.airpfrom = _sairport.id
    {
      _sflight,
      _sairport,
      carrid,
      connid,
      airpfrom
    }

이 View는 연관 _sflight_sairport 를 Select 목록에 게시하고 있습니다. 이것이 _spfli 뒤에서 경로식으로 지정할수 있도록 만들어 줍니다. 이러한 연관은 데이터베이스 테이블을 데이터 원본으로 사용하고 항상 경로식을 종결합니다.

 

Select 구문은 Select 목록에 기본 열로 지정된 컬럼과 함께 3개의 경로식을 포함합니다. 첫 번째 연관은 demo_cds_assoc_scarr 의 From 위에 지정된 CDS View의 연관 _spfli만 포함됩니다. 루트 Elements의 데이터 원본의 연관은 다른 두 경로식에 추가됩니다.

 

Select 구문은 동일한 결과를 얻기 위해 Open Sql 에서 생성해야하는 Join을 보여줍니다. 이것은 

assertion에 의해 보장됩니다. ( 프로그램 소스의 ASSERT result1 = result2. 부분 )

 

세번째 Select 구문은 CDS View demo_cds_use_assocs 에 접근합니다.

@AbapCatalog.sqlViewName: 'DEMO_CDS_USE_ASC'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view demo_cds_use_assocs
with parameters
p_carrid :s_carrid
as select from
demo_cds_assoc_scarr as scarr
{
scarr.carrname,
scarr._spfli.connid,
scarr._spfli._sflight.fldate,
scarr._spfli._sairport.name
}
where
scarr.carrid = :p_carrid    

이 View는 CDS DDL 문법에서 View의 Select 구문에 지정된 동일한 경로가 어떻게 동일한 결과를 얻을 수 있는지 보여줍니다.

 

마지막으로 네번째 Select 구문은 CDS View demo_cds_outer_joins 에 접근합니다.

@AbapCatalog.sqlViewName: 'DEMO_CDS_OUTJOIN'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view demo_cds_outer_joins
with parameters
p_carrid :s_carrid
as select from
scarr
left outer join spfli on
spfli.carrid = scarr.carrid
left outer join sflight on
sflight.carrid = spfli.carrid
and sflight.connid = spfli.connid
left outer join sairport on
sairport.id = spfli.airpfrom
{
scarr.carrname as carrname,
spfli.connid as connid,
sflight.fldate as fldate,
sairport.name as name
}
where
scarr.carrid = :p_carrid    

이 View에서 Join을 사용하여 동일한 결과를 얻을 수 있습니다.

 


다음 내용을 이어서 확인합니다.

  ■ ABAP CDS - path_expr, attributes
  ■ ABAP CDS - Joins of Associations


데이터 집계 중 아래 내용을 알아보았습니다.

 

  ■ ABAP CDS - SELECT, data_source
       - ABAP CDS - SELECT, parameters
       - ABAP CDS - SELECT, JOIN
  ■ ABAP CDS - SELECT, ASSOCIATION
       - ABAP CDS - path_expr
             :: ABAP CDS - path_expr, attributes
             ::  ABAP CDS - Joins of Associations
  ■ ABAP CDS - SELECT, select_list
       - ABAP CDS - SELECT, element
       - ABAP CDS - SELECT, element_annot
  ■ ABAP CDS- SELECT, clauses
       - ABAP CDS - SELECT, WHERE
       - ABAP CDS - SELECT, GROUP BY
       - ABAP CDS - SELECT, HAVING
       - ABAP CDS - SELECT, UNION
  ■ ABAP CDS - SELECT, Operands and Expressions
       - ABAP CDS - literal
       - ABAP CDS - field
       - ABAP CDS - parameter
       - ABAP CDS - session_variable
       - ABAP CDS - arith_expr
       - ABAP CDS - aggr_expr
       - ABAP CDS - case_expr
       - ABAP CDS - cast_expr
       - ABAP CDS - cond_expr
  ■ ABAP CDS - SELECT, Built-In Functions
       - ABAP CDS - sql_functions
              - ABAP CDS - Numeric Functions
              - ABAP CDS - String Functions
              - ABAP CDS - coalesce
       - ABAP CDS - Special Functions
              - ABAP CDS - Conversion Functions
                    - ABAP CDS - Type Conversion Functions
                    - ABAP CDS - Conversion Functions for Units and Currencies
              - ABAP CDS - Date Functions and Time Functions
                   - ABAP CDS - Date Functions
                    - ABAP CDS - Time Functions
                    - ABAP CDS - Time Stamp Functions
                    - ABAP CDS - Time Zone Functions
                    - ABAP CDS - Date/Time Conversions

반응형

댓글