Specifies a CDS path expression in a SELECT statement of a
CDS view. A path expression is a string of
associations separated by periods
(.) whose names are specified using _assoc1,
_assoc2, and so on. The name of the CDS view source
in which the first association is defined can be specified in front of this association. The first association of a path expression must be either:
Defined in the current CDS view
Published as an element of the SELECT list in a data source of the current view.
All further associations must be published in the target data source of the directly prefixed association in the path expression. No associations can be used in a path expression that are defined in an
abstract CDS entity.
attributes
can be used to specify attributes in angle brackets after every association. These attributes define the following further properties of this section of the path expression:
Declaration of monovalency
Type of the join expression defined when used
Specified filter conditions
If the data source target of a specified
association is a CDS entity with
input parameters, parameters must be used after the name _assoc to pass actual parameters to them. No parameters can be specified for an association published as an
element of a SELECT list.
Use of Path Expressions
Path expressions can be used as follows in the CDS DDL in ABAP CDS:
Path expressions with associations of any target data sources can
publish their last associations as
elements of SELECT lists for use in other CDS views or in ABAP SQL.
Path expressions with associations whose target data source is not an abstract CDS entity can be used as follows:
To specify the target data source of the last association as the data source data_source after FROM. The path expression represents an inner join
(INNER JOIN) by default.
To specify an appended element .element of the target data source of the last association as an
element of a SELECT list. The path expression represents a right outer join
(LEFT OUTER JOIN) by default.
To specify an appended element .element of the target data source
of the last association as an operand of WHERE
or HAVING conditions,
and WHEN conditions. The path expression represents a right outer join
(LEFT OUTER JOIN) by default.
When a non-aggregated element of a SELECT list is specified with
aggregate expressions and in a WHERE
condition or HAVING condition, the result of the path expression must be monovalent. This means that the cardinality of all associations used is either "to 1" or the path expression can contain only
filter conditions that are declared as monovalent using the addition 1:.
The following is evaluated when a CDS view is accessed using a path expression:
The joins defined by the associations, from left to right.
All other conditions of the CDS views in question.
The path expression addresses the full result of this evaluation or a single element appended using .element.
Notes
The most simple path expression is the name of a single association.
When joins in path expressions are defined by associations, note that their left side is always the CDS view that
publishes the association in its
SELECT list. This applies particularly to associations that are published in data sources of CDS views and passed.
CDS DDL path expressions can also be used in conditions in the ABAP
CDS DCL of ABAP CDS.
An association whose target data source does not publish an association cannot be followed by any
further associations in a path expression. More specifically, no further associations can be made into a path expression after associations whose target data sources are database tables or classic views.
When the associations of the path expressions of a view are defined as joins, they are mapped to as few join expressions as possible. The
ABAP annotationAbapCatalog.compiler.compareFilter is used as support here. The value true guarantees that associations with semantically identical
filter conditions do not produce differing join expressions.
Path expressions with associations whose target data source is an
abstract CDS entity cannot be used anywhere where they could produce instances of join expressions.
Example
The following CDS view contains the simple path expression _scarr[inner].carrname
in the SELECT list, whereby the attribute INNER is specified that controls the type of join. The program
DEMO_FROM_JOIN_TO_ASSOCIATION demonstrates that this view returns the same result as a directly programmed inner join in ABAP CDS or in ABAP SQL.
@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 }
Example
This example shows three CDS views, sales_order, business_partner,
and invoice. The CDS view invoice uses its own association and associations from the other two views in path expressions:
The association sales_order of the CDS view business_partner
is specified as a data source after FROM. A filter condition guarantees that only certain orders can be used as data sources.
The separate association invoice_header is used in a path expression as an operand in the WHERE condition.
The association note_header of the CDS view sales_order
is addressed using the alternative name bpa in business_partner
and defined as an element of the SELECT list. This means this association can also be used in CDS views that use invoice as a data source.
@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';