데이터 집계와 관련한 주제 중 ASSOCIATION에 대해서 알아보도록 하겠습니다.
ASSOCIATION에 대해서 이해하고 다음 내용을 추가로 확인합니다.
- path_expr
문법
... ASSOCIATION [ [min..max] ] TO target [AS _assoc] ON cond_exp
[ WITH DEFAULT FILTER cond_exp ] ...
주요구문
1. ... [min..max]
2. ... AS _assoc
3. ... WITH DEFAULT FILTER cond_exp
효과
CDS View 의 Select 구문에서 _assoc 라는 이름의 CDS 연관(Association)을 정의합니다. 연관은 ON 뒤에서 cond_exp 를 사용하여 연관으로 정의되어 현재 CDS View에서 지정된 소스 데이터소스와 타겟 데이터소스 target 의 관계입니다. 데이터 소스 target 은 ABAP DDIC에서 정의된 테이블, 클래식 View, 확장 View, CDS 엔터티를 사용할 수 있습니다.
CDS View의 Select 구문의 연관은 다음과 같이 접근할 수 있습니다.
■ 동일한 구문 및 문서화된 모든 위치의 경로 표현식에 이름을 지정합니다.
■ 현재 Select 구문의 Select 리스트에 대한 경로 표현식을 사용하여 연관을 사용했다면 경로 표현식에는 다음의 내용을 사용할 수 있습니다.
- 다른 CDS View
- Open SQL 구문
연관 또는 엘리먼트에 접근하는 경로식을 사용한 CDS View를 활성화할 때, 모든 연관(Association)의 경로식은 Join 표현식으로 전환됩니다. 소스 데이터 소스는 왼쪽에 표시되고, 타겟 데이터 소스는 오른쪽에 표시된다. 연관의 ON 조건은 Join의 ON 조건에 반영됩니다. 기본적으로 where 경로식을 사용하여 Join의 범위가 결정됩니다.
■ From 다음에서 Inner Join 입니다.
■ 다른 모든 위치에서 Left Outer Join 입니다.
이 설정은 특성을 사용한 경로식에서 연관을 지정할 때 덮어쓸 수 있습니다. 종결된 연관으로 게시된 Select 목록의 경로식과 엘리먼트를 사용하여 종결되지 않은 경로직은 join으로 정의되지 않습니다.
ON 조건을 지정할때에는 다음의 특별한 규칙이 적용됩니다.
■ 타겟 데이터소스의 필드는 연결 이름으로 ON 조건에 접두사가 있어야 합니다. ( 접두사 _assoc. 마침표로 구분 )
■ Select 구문의 Select 목록에서 연관이 게시되면, On 조건에 지정된 소스 데이터소스의 필드도 Select 목록에 나열되어야 합니다. 이렇게 하면 연관에 대한 Join 식을 작성할 수 있습니다. ( 경로식에서 사용된는 경우 )
■ ON 조건에서 Select 목록의 요소를 참조하려면, 소스 데이터소스 대신 필드 이름에 $projection 접두사를 사용할 수 있습니다. 이 경우 필드이름 대신 AS를 사용하여, 정의된 대체 요소 이름을 지정할 수 있습니다. ON 조건에서 $projection 접두사를 사용할 때 Select 목록의 경로식을 사용하면, 유효하지 않은 Join 식을 피하기 위해 현재 연결 자체를 Select 목록에서 사용할 수 없습니다.
메모
■ Select 목록에 리스트 되지 않은 연관은 현재 Select 구문의 경로식에만 사용할 수 있습니다.
■ 연관을 정의하고 사용하기 위한 구문은 Join 구문의 상위호환입니다. Join을 직접 프로그래밍 하는 대신 연관을 사용하면 CDS View의 정의를 더 쉽게 읽을 수 있습니다. 연관은 CDS View 또는 Open SQL에서 경로식을 사용하여 간단히 접근할 수 있는 CDS 엔터티 간의 관계를 모델링하는 데 사용할 수 있습니다.
■ CDS View가 활성화되면, 연관 정의가 아닌 경로식의 모든 사용에 대해 연고나에 정의된 Join이 생성됩니다. CDS View에서 사용되지 않는 연결에 대해서는 Join이 생성되지 않습니다.
( CDS View에서 사용되지 않는 필드에 대한 연관 Target 데이터소스의 Join은 생성되지 않음 )
■ 현재 Select 구문의 Select 목록의 경로식에 연관이 사용된 경우 현재 View에 대한 Join이 정의됩니다. 연결의 ON 조건이 Join에 직접적으로 적용됩니다. Join의 ON 조건에는 경로식이 허용되지 않습니다. 이는 연관이 여기에서 사용되는 경우 연관의 ON 조건에 접두사 $projection 을 사용할 때 Select 목록의 경로식에 대한 참조를 만들 수 없음을 의미합니다.
■ 연관 및 Join 표현식은 CDS View의 Select 구문에 사용할 수 있습니다.
■ 연관은 Select 구문에서 Union 과 결합하여 특별한 규칙을 적용합니다.
■ CDS 엔터티의 대량 활성화에서 발생하는 문제를 방지하기 위해 연관을 사용할 때 순환 종속성을 피해야 합니다.
추가1
... [min..max]
효과
ASSOCIATION의 연관으로 정의되는 CDS View의 타겟 데이터 소스의 카디날리티를 정의합니다. 대괄호 [] 는 구문의 일부입니다. min / max에 대해서는 0을 포함한 양의 정수만 가능하고, * 값을 지정할 수 있습니다.
■ max는 0을 사용할 수 없습니다.
■ max에 사용한 * 값은 여러 행을 의미합니다.
■ min은 생략할 수 있습니다. ( 생략시 0으로 설정 )
■ min에는 * 를 사용할 수 없습니다.
■ Where 조건에 연관이 사용된 경우 max에는 1이 지정되어야 합니다.
카디날리티가 명시적으로 지정되지 않으면, 암묵적으로 카디날리티 'to 0'을 사용합니다.( [min..1] )
데이터 베이스 시스템에서 데이터 모델의 의미 체계를 문서화하고 최적화하기 위해 카디날리티가 지정됩니다. 이러한 데이터 베이스 시스템에서 경로식으로 제공된 LEFT OUTER JOIN 은 명시적 또는 암묵적 "to 1" 카디널리티가 사용되는 경우 TO ONE 이 제공됩니다. 다른 카니널리티가 사용되는 경우 TO MANY 가 적욛됩니다. 이러한 추가는 LEFT OUTER JOIN에 명시적으로 지정된 경우와 동일한 방식으로 동작합니다. 즉, 최적화가 수행되고 결과 집합이 카디널리티와 일치하지 않으면 결과가 정의되지 않을 수 있스니다.
메모
■ 정의되지 않은 플랫폼 종속적인 동작을 방지하려면 질의에 대한 해당 데이터와 일치하도록 카디널리티를 항상 정의해야 합니다.
■ 지정된 카디널리지는 CDS 의 CDS DDL 또는 Open SQL에 지정된 경로에 대한 구문 검사를 통해 평가됩니다. 일치하지 않는 카디널리는 일반적으로 구문 검사 결과로 경고를 생성합니다.
예시
연관의 카디널리티를 지정 오류입니다. 다음 CDS View는 카디널리티를 명시적으로 지정하지 않고, 연관 _spfli 를 적용하여 DB 테이블 SCARR 과 SPFLI 를 결합했습니다. 암묵적으로 카디널리티 "to 1" 이 지정됩니다. Select 목록에 지정된 경로에서 연관이 사용되는 경우 일부 데이터베이스 시스템(예를들어 SAP HANA Database)에서 암묵적으로 TO ONE이 사용된 Left Outer Join 으로 인스턴스화 됩니다. 하지만 실질적인 카디널리티는 TO MANY 입니다.
@AbapCatalog.sqlViewName: 'DEMOCDSWRGC' define view demo_cds_wrong_cardinality as select from scarr association to spfli as _spfli on _spfli.carrid = scarr.carrid { scarr.carrid as carrid, scarr.carrname as carrname, _spfli.connid as connid } |
프로그램 DEMO_CDS_WRONG_CARDINALITY 는 View에 접근하기 위한 다른 Select 구문을 사용합니다. SAP HANA DB와 같은 데이터베이스 시스템 최적화에 의해 2가지 다른 행 수의 결과를 반환합니다. 이것은 예상치 못한 결과일 수 있습니다.
REPORT demo_cds_wrong_cardinality. CLASS demo DEFINITION. PUBLIC SECTION. CLASS-METHODS main. ENDCLASS. CLASS demo IMPLEMENTATION. METHOD main. DATA(out) = cl_demo_output=>new( ). SELECT * FROM demo_cds_wrong_cardinality INTO TABLE @DATA(itab). out->write( itab ). out->write( sy-dbcnt ). SELECT COUNT(*) FROM demo_cds_wrong_cardinality INTO @DATA(count). out->write( count ). out->write( sy-dbcnt ). out->display( ). ENDMETHOD. ENDCLASS. START-OF-SELECTION. demo=>main( ). |
예시
연관의 카디날리티를 정확하게 지정했습니다. 다음 CDS View는 연관 _spfli에 대해서 명시적으로 카디날리티를 지정하여 데이터베이스 테이블 SCARR 과 SPFLI 를 결합했습니다. 연관이 Select 목록에 지정된 경로에 사용된 경우, 일부 데이터베이스 시스템(ex. SAP HANA DB)에서 데이터의 실제 카디널리티와 일치하는 TO MANY 가 암묵적으로 추가되어 LEFT OUTER JOIN 으로 인스턴스화 됩니다.
@AbapCatalog.sqlViewName: 'DEMOCDSEXPC' define view demo_cds_explicit_cardinality as select from scarr association [1..*] to spfli as _spfli on _spfli.carrid = scarr.carrid { scarr.carrid as carrid, scarr.carrname as carrname, _spfli.connid as connid } |
프로그램 DEMO_CDS_EXPLICIT_CARDINALITY 는 View에 접근하기위해 다른 Select 구문을 사용합니다. 모든 데이터 베이스 시스템에서 두번의 Read를 통해 같은 수의 동일한 결괄를 반환합니다.
REPORT demo_cds_explicit_cardinality. CLASS demo DEFINITION. PUBLIC SECTION. CLASS-METHODS main. ENDCLASS. CLASS demo IMPLEMENTATION. METHOD main. DATA(out) = cl_demo_output=>new( ). SELECT * FROM demo_cds_explicit_cardinality INTO TABLE @DATA(itab). out->write( itab ). out->write( sy-dbcnt ). SELECT COUNT(*) FROM demo_cds_explicit_cardinality INTO @DATA(count). out->write( count ). out->write( sy-dbcnt ). out->display( ). ENDMETHOD. ENDCLASS. START-OF-SELECTION. demo=>main( ). |
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/021.gif)
추가2
... AS _assoc
효과
CDS View에서 ASSOCIATION 을 사용할여 연관을 정의할 때 사용되는 이름 _assoc 를 정의합니다. AS 를 사용하 명시적인 이름을 정의하지 않으면, _assoc 가 타겟 데이터소스의 이름으로 암묵적으로 설정됩니다. _assoc 이름은 이름에 대한 이름명명규칙을 지켜야 합니다.
메모
연결 이름의 첫 번쨰 문자로 밑줄(_)를 사용하는것을 권장합니다.
예시
간단한 연관의 예시입니다. 다음 CDS View는 Join에서 예시로 보여줬던 프로그램 DEMO_CDS_ASSOCIATION 에서 보여준 것처럼 DEMO_CDS_SCARR_SPFLI CDS View와 같은 결과를 제공합니다. 또한 spfli_scarr 연관은 연관 이름만 포함하는 경로를 지정하여 Select 목록 외부에서 사용할 수 있도록 게시됩니다. 또한 프로그램 DEMO_CDS_ASSOCIATION 는 연관이 어떻게 Open SQL에서 지정된 경로에 의해 접근할 수 있는지를 보여준다.
@AbapCatalog.sqlViewName: 'DEMO_CDS_ASSOC' @AccessControl.authorizationCheck: #NOT_REQUIRED define view demo_cds_association( _spfli_scarr, id, carrier, flight, departure, destination ) as select from spfli association [1..1] to scarr as _spfli_scarr on $projection.carrid = _spfli_scarr.carrid { _spfli_scarr, key spfli.carrid, key _spfli_scarr.carrname, key spfli.connid, spfli.cityfrom, spfli.cityto } |
REPORT demo_cds_association. CLASS demo DEFINITION. PUBLIC SECTION. CLASS-METHODS main. ENDCLASS. CLASS demo IMPLEMENTATION. METHOD main. SELECT * FROM demo_cds_association ORDER BY id, carrier, flight INTO TABLE @DATA(result1). SELECT id, \_spfli_scarr[ (1) INNER ]-carrname AS carrier, flight, departure, destination FROM demo_cds_association ORDER BY id, carrier, flight INTO TABLE @DATA(result2). SELECT * FROM demo_cds_scarr_spfli ORDER BY id, carrier, flight INTO TABLE @DATA(test). ASSERT result1 = result2. ASSERT result1 = test. cl_demo_output=>display( result1 ). ENDMETHOD. ENDCLASS. START-OF-SELECTION. demo=>main( ). |
예시
다음 CDS View sales_order_invoice_header 는 매출송장에 대한 정보를 리턴하고 다음 데이터베이스와 함께 동작합니다. ( snwd_so_inv_head, snwd_so, snwd_bpa, snwd_so_inv_item. )
두 개의 연관이 정의됩니다.
■ _buyer 는 현재 View와 타겟 데이터소스 snwd_bpa 의 Join을 의미합니다.
■ _invoice_items 는 현재 View와 타겟 데이터소스 snwd_so_inv_item 의 Join을 의미합니다.
ON 조건에서 사용되는 소스 데이터의 소스 필드는 Select 목록의 일부입니다.( node_key, buyer_guid ) 여기의 접두사 $projection 는 접두사 snwd_so_inv_head 또는 snwd_so_inv_head 을 대신해서 사용됩니다.
연관 _buyer 는 Select 목록에 리스트되지 않았고, 현재 Select 구분의 경로식에서만 사용될 수 있습니다. 이 연관은 카디널리티 [1..1]로 인해 Where 조건에서 지정할 수 있습니다. 연관 _invoice_items 는 현재 Select 구문의 경로식에서 접근하지 않았습니다. 하지만 이 연관은 Select 목록에서 리스트 되었습니다. 이것은 다른 CDS View의 경로식에 사용할 수 있음을 의미합니다. 이 연관은 카디널리티 [1..*] 에 의해 Where 조건에서 지정될 수 없습니다.
@AbapCatalog.sqlViewName: 'SALESO_INVHDR_VW' define view sales_order_invoice_header as select from snwd_so_inv_head inner join snwd_so on snwd_so_inv_head.so_guid = snwd_so.node_key association [1..1] to snwd_bpa as _buyer on $projection.buyer_guid = _buyer.node_key association [1..*] to snwd_so_inv_item as _invoice_items on $projection.node_key = _invoice_items.parent_key { key snwd_so_inv_head.node_key, //used in assoc _invoice_items snwd_so_inv_head.buyer_guid, //used in assoc _buyer snwd_so.so_id as sales_order_id, _buyer.bp_id as buyer_id, //from assoc _buyer snwd_so_inv_head.payment_status, @Semantics.currencyCode snwd_so_inv_head.currency_code, @Semantics.amount.currencyCode: 'currency_code' snwd_so_inv_head.gross_amount, _invoice_items //publish assoc _invoice_items } where _buyer.bp_role = '001'; //usage of assoc buyer |
이 CDS View는 ABAP 프로그램에서 간단한 Select 구문(Open SQL)으로 접근할 수 있습니다.
SELECT sales_order_id, buyer_id, payment_status
FROM sales_order_invoice_header
INTO CORRESPONDING FIELDS OF TABLE @itab.
실제 쿼리의 복잡성은 어플리케이션 프로그래머의 CDS View에 투명하게 표시됩니다. View에 접근될 때, snwd_so_inv_head 과 snwd_so_inv_item의 Join( 연관 _invoice_items 으로 정의됨 )은 생성되지 않습니다. join에 접근하기 위해 필요한 경로식에 사용되지 않았기 때문입니다.
위에서 언급한 CDS View sales_order_invoice_header 는 CDS View sales_order_invoice_items의 정의에서 데이터 소스로 사용됩니다. 이 데이터 소스는 게시된 연관 _invoice_items으로 접근하기 위해 사용됩니다. 이 View에서 연관의 요소에 접근됩니다. 결합의 결과라는 시작적인 암시는 없습니다. 이 snwd_so_inv_head 과 snwd_so_inv_item 사이의 결합(join)은 CDS View sales_order_invoice_items 가 활성화될 때 생성됩니다. CDS View sales_order_invoice_header 의 다른 연관인 _buyer 는 접근할 수 없습니다.
@AbapCatalog.sqlViewName: 'SALESO_INVITM_VW' define view sales_order_invoice_items as select from sales_order_invoice_header as header { header.sales_order_id, header._invoice_items.inv_item_pos as item_position, @Semantics.currencyCode header._invoice_items.currency_code, @Semantics.amount.currencyCode: 'currency_code' header._invoice_items.gross_amount } |
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/021.gif)
추가3
... WITH DEFAULT FILTER cond_exp
효과
경로식에 대한 기본 필터조건을 정의합니다.
■ 속성 attributes 에서 연관이 경로식을 사용할 때 필터 조건이 지정되지 않으면, DEFAULT FILTER 를 사용하여 지정된 조건 cond_exp 이 필터 조건으로 사용됩니다. 그리고 Join에 대한 확장 조건으로 적용됩니다. 속성으로 지정된 필터조건과 동일한 규칙이 기본 필터 조건에 적용됩니다.
■ 속성 attributes 에서 연관이 경로식을 사용할 때 필터 조건이 지정하면, 이 조건은 기본 필터조건 대신에 사용됩니다.
메모
구문 점검으로 [min..max]로 지정된 카디날리티를 평가할 때, 기본 필터 조건은 ON 조건과 함께 유지됩니다.
이 Association 은 INNER JOIN 과 OUTER JOIN 에 대한 이해도가 조금 필요한 내용입니다.
많이 사용되지는 않지만 SAP 에서 만들어져 있는 주요 CDS View를 보면 많이 사용되고 있는 내용이니 이해하고 있어야 합니다.
이 포스팅 내용 중 경로식에 대한 이야기가 많이 거론되었습니다. 다행히 다음 포스팅은 이 경로식에 대한 내용입니다.
조금 어렵지만 계속해서 읽어주세요.
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif)
데이터 집계 중 아래 내용을 알아보았습니다.
■ 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 (path_expr) (0) | 2022.11.30 |
---|---|
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 |
댓글