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 carrier, flight INTO TABLE @DATA(result_open_sql_join). "ABAP CDS Join SELECT FROM demo_cds_join1 FIELDS * ORDER BY carrier, flight INTO TABLE @DATA(result_cds_join). "ABAP CDS Association SELECT FROM demo_cds_join2 FIELDS * ORDER BY carrier, flight INTO TABLE @DATA(result_cds_assoc). ASSERT result_cds_join = result_open_sql_join. ASSERT result_cds_assoc = result_cds_join. cl_demo_output=>display( result_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_header 는 business_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
'SAP Story > CDS View' 카테고리의 다른 글
DDL정의(2) View 정의 - 데이터 집계(Select)- ASSOCIATION (0) | 2022.11.24 |
---|---|
DDL정의(2) View 정의 - 데이터 집계(Select)- data_source( Join ) (0) | 2022.11.23 |
DDL정의(2) View 정의 - 데이터 집계(Select)- data_source( Parameters ) (0) | 2022.11.22 |
(2) View 정의 - 데이터 집계(Select)- data_source (0) | 2022.11.22 |
DDL정의(2) View 정의 - 데이터 집계(Select) (0) | 2022.11.15 |
댓글