-
Notifications
You must be signed in to change notification settings - Fork 286
/
zdemo_abap_cds_ve_assoc.ddls.asddls
144 lines (130 loc) · 9.93 KB
/
zdemo_abap_cds_ve_assoc.ddls.asddls
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
// ABAP CDS cheat sheet example: Associations
//
//////////////////////////------ NOTES ------//////////////////////////////////
// - CDS view entity that selects from a demo CDS view entity and demonstrates
// associations. A selection of use cases of associations is covered. For
// more information and examples, see the ABAP Keyword Documentation.
// - As a prerequisite, run the class zcl_demo_abap_cds_ve to populate the
// database tables of the example. Otherwise, no data is displayed.
// - For further notes on associations, see the commented out information further
// down.
// - To see how the joins are realized on the database, you can right-click anywhere
// in the source code and choose 'Show SQL Create Statement'. The example
// includes associations where only left outer joins are performed.
//
//////////////////////------ DATA PREVIEW ------///////////////////////////////
// - Choose F8 in ADT to open the data preview and check out the data displayed
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'CDS view entity: Associations 1'
define view entity zdemo_abap_cds_ve_assoc
// In this example, the data source, from which data is read, is another CDS view entity.
// This source CDS view entity selects all fields from the demo database table zdemo_abap_flsch.
// It also contains exposed associations that are used here.
as select from zdemo_abap_cds_ve_assoc_e as _flsch
// 1) One use case of assocations, which is not covered here, can be the use in the FROM clause.
// - That is, you can use an association as data source by specifying a path expression.
// - For example, the CDS view entity zdemo_abap_cds_ve_assoc_e exposes an association
// _carr_exp. Therefore, a FROM clause as follows is possible:
// ... as select from zdemo_abap_cds_ve_assoc_e._carr_exp as _flsch ...
// 2) Adding fields of an association target to the element list (of the same CDS view entity)
// - In this case, since data is requested, a join is carried out.
// - The data preview (choose F8) shows the values for the added fields.
// - In this example, the association is used, but not exposed. Therefore, it cannot be used
// in path expressions in other CDS entities as shown in 3).
association [1..1] to zdemo_abap_carr as _carr1 on _flsch.Carrid = _carr1.carrid
association [1..1] to zdemo_abap_carr as _carr2 on _flsch.Carrid = _carr2.carrid
association [1..*] to zdemo_abap_fli as _fli on _flsch.Carrid = _fli.carrid
// 3) Exposing associations
// - In this example, no fields of the association target are added to the element list.
// But the assocation is exposed in the element list. Therefore, it can be used
// in path expressions in other CDS entities.
// - In this case, since data is not requested, a join is not carried out. It is up to
// to the consumer (e.g. an ABAP SQL statement or other CDS view entities) to request
// fields (one field, multiple fields, all fields ...). Only then, a join is performed.
// - The data preview (choose F8) does not show any data of the association target.
// - Compare the ON condition to the ones above. For demonstration purposes, the carrid
// field is specified with an alias name in the element list. To refer to this name,
// the prefix $projection. is required. As above, you can also use the original name.
association [1..1] to zdemo_abap_carr as _carr3 on $projection.carrier = _carr3.carrid
{
// Including fields from the data source
// The prefix _flsch. is actually not necessary here in the example. It's intentionally included to emphasize the data source.
key _flsch.Carrid as carrier,
key _flsch.Connid as connection_id,
_flsch.Cityfrom,
_flsch.Cityto,
// Regarding 2) Adding fields of an association target to the element list
// - Two fields are added in the element list.
// - You can make a right-click and choose 'Show SQL Create Statement' to check how the join is performed.
// - Because a left outer join is performed, the coalesce function is included for a field.
// If there are null values, the specified character literal is inserted.
// - Only these two fields are respected from the association target.
_carr1.carrname as carrier_name,
coalesce(_carr1.url, 'NULL') as carr_url,
// Regarding 3) Exposing associations
// - The association is exposed in the element list (but no fields of the association target).
// - As demonstrated in the executable class of this cheat sheet, an ABAP SQL statement
// can request data of the association target.
// - The data preview does not include any fields from the association target. Likewise,
// the 'SQL Create Statement' does not show any join with this assocation.
_carr3,
// 4) Using associations that are exposed in external views
// - The CDS view entity that is used as data source in the SELECT list exposes
// associations.
// - Such an association is used in a path expression here to include a field from the
// association target in the element list. In this case, this CDS view entity is
// a consumer of the association. A join is performed, as can be seen in the
// 'SQL Create Statement' view.
_flsch._carr_exp.currcode as curr_exposed,
// 5) Attributes of path expression
// - Attributes are specified in angle brackets after each CDS association to define
// further properties. These can be the cardinality, join type that is implemented when used,
// and filter conditions
// Speciying filter conditions and the join type
// - Only if a join type is specified explicitly, the addition WHERE must be specified
// - The example specifies the join type. Therefore, WHERE is required. Here in the example,
// the specification can also be the one commented out below because it implicitly has
// the same effect. Here, a left outer join is performed by default.
// - The operand specified on the left side of the condition must be a field of the association target.
_carr2[left outer where $projection.carrier = 'LH'].url as fcond_url,
//_carr2[$projection.carrier = 'LH'].url as fcond_url
// Specifying the cardinality of the current CDS association
// - The values 1: (current CDS association is declared as unique) and *: (non-unique) are possible.
// - You can use 1: to prevent a syntax warning in case of a path specified with filter conditions, for example.
// - In the example, an association is specified with to many (there can be multiple flights for a flight route).
// Without the cardinality specification 1:, a warning would be displayed ("The association _fli can modify
// the cardinality of the results set").
// - Similar to the example above, the first line commented out below is also possible in this example.
// The second line commented out results in a syntax warning because it does not specify the
// cardinality 1:.
_fli[1:$projection.connection_id = connid].fldate as fcond_fldate
//_fli[1:left outer where $projection.connection_id = connid].fldate as fcond_fldate
//_fli[$projection.connection_id = connid].fldate as fcond_fldate
}
////////////////////////// --------- Notes on associations --------- /////////////////////////////////////////
// - They offer an advanced modelling capability for CDS data models. They define relationships between
// CDS entities (association source and target). On the database, associations are internally transformed into joins.
// - Compared to regular joins, associations differ in the following respects:
// - Joins are only performed on demand, i.e. when data is requested from the assocation by a consumer, e.g.
// using another CDS view entity or an ABAP SQL statement. In the regular joins (e.g. inner, outer joins), the
// join is always performed. When a CDS association is instantiated as join on the database, the association
// source represents the left side and the association target represents the right side of the join.
// - In the SELECT list, specifying the data source as a prefix is mandatory for all fields of the association.
// For joins, it is mandatory only for for non-unique names.
// - Unlike regular joins, associations can be reused in different positions and basically replace very complex
// join expressions.
// - Use of associations:
// - Including fields from the association target in the current view
// - Exposing associations so that they can be used in other CDS entities or in ABAP SQL
// - Associations can be used in path expressions (a sequence of associations) at different operand positions.
// - Associations can be specified with additional semantic information, such as cardinality.
// - Specifying the (optional) cardinality is a means of documenting the semantics of the data model.
// - Cardinality is specified in square brackets [ ]. Minimum and maximum can be specified, for example
// one to one [1..1], one to many [1..*]. The default is [0..1]. Specifying the minimum value is optional (the
// default value is 0), i.e. [0..1] is [1], [0..*] is [*]. The minimum cannot be *, the maximum not 0.
// - Maximum values greater than 1 can lead to syntax errors or warnings. Generally, a non-matching cardinality
// usually produces a warning.
// - If the cardinality is not specified, it is to one by default [x..1].
// - Compositions and to-parent associations are special kinds of CDS associations. See the ABAP Keyword Documentation.