ABAP Keyword Documentation → ABAP - Dictionary → ABAP CDS in ABAP Dictionary → ABAP CDS - Data Definitions → ABAP CDS - Views
ABAP CDS - Client Handling in CDS Views
For a CDS view in ABAP CDS, the CDS annotation @ClientHandling can be used to specify client handling.
Other versions:
7.31 | 7.40 | 7.54
Determining Client Dependency
The annotation @ClientHandling.type determines the client dependency of the view. The following values can be specified for the annotation:
#INHERITED
Default value. The client dependency of the view is determined by the data sources used.
- If one of the data sources used in the view is client-specific, the view is client-specific.
- If none of the data sources used in the view is client-specific, the view is a cross-client view.
#CLIENT_DEPENDENT
The view is client-specific. A prerequisite for this is that at least on of the data sources used in the view is client-specific. If not, a syntax error occurs.
#CLIENT_INDEPENDENT
The view is a cross-client view. A prerequisite for this is that none of the data sources used in the view is client-specific. If not, a syntax error occurs.
Notes
- CDS views for application data should usually be client-specific.
- The annotation @ClientHandling.type replaces the annotation @ClientDependent and should be used instead of this annotation.
- Unlike the annotation @ClientDependent, the annotation @ClientHandling.type cannot be used to make a CDS view into a cross-client view if it contains client-specific data sources.
- If the annotation @ClientHandling.type is not specified, client dependency is derived implicitly from the client dependency of the data sources uses, as when specified with the value #INHERITED.
Determining Client Handling
The annotation @ClientHandling.algorithm determines how implicit client handling is performed. The following values can be specified for the annotation:
#AUTOMATED
Default value for the values #INHERITED and #CLIENT_DEPENDENT of the annotation @ClientHandling.type. Cannot be used together with its value #CLIENT_INDEPENDENT.
The value #AUTOMATED expands the joins of the CDS view implicitly as shown in the following table. In the case of outer joins, cross-client sides are made into client-specific sides artificially using cross joins, which avoids NULL values. This applies to joins specified directly using JOIN and to instances of joins created when using SQL path expressions.
Left Side | Right Side | INNER JOIN | LEFT OUTER JOIN | RIGHT OUTER JOIN | CROSS JOIN |
---|---|---|---|---|---|
Client-specific | Client-specific | Compares the client columns in the ON condition | Compares the client columns in the ON condition | Compares the client columns in the ON condition | Transforms the cross join to an inner join using an ON condition for the client columns |
Cross-client | Client-specific | - | The left side is replaced by a cross join of the cross-client data source with the database tableT000 and a comparison of the client columns in the ON condition. | - | - |
Client-specific | Cross-client | - | - | The right side is replaced by a cross join of the cross-client data source with the database tableT000 and the client columns are compared in the ON condition. | - |
Cross-client | Cross-client | - | - | - | - |
#SESSION_VARIABLE
Cannot be used together with the value #CLIENT_INDEPENDENT of the annotation @ClientHandling.type.
The value #SESSION_VARIABLE expands the joins of the CDS view implicitly as shown in the following table. This applies to joins specified explicitly and directly using JOIN and to instances of joins created when using SQL path expressions.
Left Side | Right Side | INNER JOIN | LEFT OUTER JOIN | RIGHT OUTER JOIN | CROSS JOIN |
---|---|---|---|---|---|
Client-specific | Client-specific | Compares the client columns in the ON condition | Compares the client columns in the ON condition | Compares the client columns in the ON condition | Transforms the cross join to an inner join using an ON condition for the client columns |
Cross-client | Client-specific | - | Compares the client column with the value of thesession variable $session.client in the ON condition | - | - |
Client-specific | Cross-client | - | - | Compares the client column with the value of thesession variable $session.client in the ON condition | - |
Cross-client | Cross-client | - | - | - | - |
In addition, when client-specific data tables are accessed, WHERE clauses with comparisons of the client columns with the session variable $session.client are added to the view implicitly. If only client-specific CDS entities are accessed, however, no clauses are added.
If the session variable $session.client is evaluated in the view, it is not possible to access the data of different clients in a single read. This applies in the following cases:
- When a client-specific database table is a data source of the view or is a CDS view used as a data source and hence an implicit WHERE clause exists for the session variable.
- When client-specific and cross-client sides are joined in an outer join and there is an implicit ON condition for the session variable.
The addition USING
of the statement SELECT
for switching
implicit client handling is permitted and
the client specified here is used implicitly. The obsolete addition CLIENT SPECIFIED
is then not allowed.
#NONE
Default value for the value #CLIENT_INDEPENDENT of the annotation @ClientHandling.type. Cannot be used together with its values INHERITED and #CLIENT_DEPENDENT. No implicit client handling takes place.
Notes
- The values #AUTOMATED and #SESSION_VARIABLE
produce the same result when a client-specific CDS view is used. They modify the way client handling
is implemented internally, but do not modify the definition of the view or, with the exception of the
obsolete addition
CLIENT SPECIFIED
, its use. The value #SESSION_VARIABLE can improve performance by concentrating on a single client.
- If a view with the value #INHERITED of the annotation @ClientHandling.type is a cross-client view, no implicit client handling takes place and the values #AUTOMATED and #SESSION_VARIABLE are ignored.
- If no annotation @ClientHandling.type is specified, the annotation @ClientHandling.algorithm can be specified with the values #AUTOMATED or #SESSION_VARIABLE for the default value #INHERITED.
- If an annotation @ClientHandling.type is specified but an annotation @ClientHandling.algorithm is not specified, the value #AUTOMATED is set in #INHERITED and #CLIENT_DEPENDENT implicitly and the value #NONE is set in #CLIENT_INDEPENDENT, also implicitly.
- If none of the annotations is specified, the default values #INHERITED for @ClientHandling.type and #AUTOMATED for @ClientHandling.algorithm apply.
- The value #NONE can only be specified for views declared explicitly as cross-client views. If specified for views declared explicitly as client-specific views using #CLIENT_DEPENDENT, self-programmed client handling would be required and this is not currently supported.
- If the value #SESSION_VARIABLE is specified, the obsolete addition
CLIENT SPECIFIED
of the statementSELECT
is forbidden in cases where the session variable $session.client is actually in use in the view in question. More specifically, specifying a client-specific view in a CDS association does not necessarily mean that the session variable is used. The session variable is used only if the CDS association in the view is created with an implicit ON condition for the session variable.
Properties of Client-Specific CDS Views
In ABAP SQL reads, the client dependency of a CDS view has the following consequences for the CDS entity and the associated CDS database view:
- The view fields of the CDS entity of a client-specific CDS view do not cover a client column. A
client column of a client-specific CDS view specified explicitly in the
SELECT list is also not a component of the structured data type represented
by the CDS entity and is removed implicitly from the results set of a
SELECT
statement.
- If
SELECT
is used to access a client-specific CDS entity, the data of the current client or the client specified in the additionUSING
is read implicitly. If the obsolete addition CLIENT SPECIFIED is specified, the column is added to the results set and is filled with the associated client ID for each row. Before this column can be used in theSELECT
statement, a name must be assigned to it after the additionCLIENT SPECIFIED
. If the name is not defined, no addressing is possible in a clause and no inline declarations can be made using@DATA(...)
afterINTO
. The defined name is also used in the case ofINTO CORRESPONDING
. If no name is defined, the client column is not transported.
- The view fields of a CDS database view of a client-specific CDS view always cover a client column. This applies regardless of whether the client column is specified in the SELECT list.
- If an obsolete access is made on the CDS
database view using
SELECT
, the view is handled in accordance with regular implicit client handling, which itself can be defined using the additionUSING
.
- The name of the client column of a CDS database view with activated client handling is defined in accordance with the following hierarchy: If the client column is specified in the SELECT list, its name or its alternative name is used. If the client column is not specified in the SELECT list, MANDT is used. If MANDT is already used as an (alternative) element name in the SELECT list, CLIENT is used. If neither MANDT or CLIENT is possible, a syntax error occurs.
Notes
- Only the CDS database view can be accessed using Native SQL or in an AMDP method. When client-specific views are accessed, the client ID must be specified as usual and only data in the current client should be accessed.
- The following must be noted when the CDS database view of a client-specific CDS view whose client handling is defined using the annotation @ClientHandling.algorithm:#SESSION_VARIABLE is accessed using Native SQL or AMDP:
- The session variable $session.client is usually used implicitly in the view. This is guaranteed only on SAP HANA databases used as standard AS ABAP databases under the name CDS_CLIENT. On other platforms, the existence and content of the session variable are not guaranteed outside of an ABAP SQL access, and this can produced unexpected behavior or programs may crash.
- No separate WHERE condition can be used that selects a client other than the session variable and the database-specific variant of the session variable $session.client must have the required value in Native SQL or AMDP reads. Outside an ABAP SQL access, it contains the current client by default.
AMDP OPTIONS CDS SESSION CLIENT
in the declaration of the AMDP method. If not, a syntax error occurs. In an
AMDP function implementation that is used as a
CDS table function in ABAP SQL, however, the HANA session variable CDS_CLIENT is filled with the content defined there.