Ansicht
Dokumentation

ABENCDS_CLIENT_HANDLING - CDS CLIENT HANDLING

ABENCDS_CLIENT_HANDLING - CDS CLIENT HANDLING

rdisp/max_wprun_time - Maximum work process run time   CL_GUI_FRONTEND_SERVICES - Frontend Services  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

ABAP CDS - Mandantenbehandlung bei CDS-Views

Für eine CDS-View der ABAP CDS kann mit der CDS-Annotation @ClientHandling die Mandantenbehandlung gesteuert werden.

Bestimmung der Mandantenabhängigkeit

Die Annotation @ClientHandling.type bestimmt die Mandantenabhängigkeit der View. Für die Annotation können folgende Werte angegeben werden:

#INHERITED

Standardwert. Die Mandantenabhängigkeit der View wird durch die verwendeten Datenquellen bestimmt.

  • Wenn eine der in der View verwendeten Datenquellen mandantenabhängig ist, ist die View mandantenabhängig.
  • Wenn keine der in der View verwendeten Datenquellen mandantenabhängig ist, ist die View mandantenunabhängig.

#CLIENT_DEPENDENT

Die View ist mandantenabhängig. Voraussetzung ist, dass mindestens eine der in der View verwendeten Datenquellen mandantenabhängig ist, andernfalls kommt es zu einem Syntaxfehler.

#CLIENT_INDEPENDENT

Die View ist mandantenunabhängig. Voraussetzung ist, dass keine der in der View verwendeten Datenquellen mandantenabhängig ist, andernfalls kommt es zu einem Syntaxfehler.

Hinweise

  • CDS-Views für Anwendungsdaten sollten in aller Regel mandantenabhängig sein.
  • Anders als mit der Annotation @ClientDependent kann mit der Annotation @ClientHandling.type eine CDS-View nicht mandantenunabhängig gemacht werden, wenn sie mandantenabhängige Datenquellen enthält.
  • Wenn die Annotation @ClientHandling.type nicht angegeben ist, wird die Mandantenabhängigkeit implizit wie bei der Angabe mit dem Wert #INHERITED aus der Mandantenabhängigkeit der verwendeten Datenquellen abgeleitet.

Bestimmung der Mandantenbehandlung

Die Annotation @ClientHandling.algorithm bestimmt wie die implizite Mandantenbehandlung ausgeführt wird. Für die Annotation können folgende Werte angegeben werden:

#AUTOMATED

Standardwert für die Werte #INHERITED und #CLIENT_DEPENDENT der Annotation @ClientHandling.type. Kann nicht zusammen mit deren Wert #CLIENT_INDEPENDENT angegeben werden.

Mit dem Wert #AUTOMATED werden die Joins der CDS-View wie in der folgenden Tabelle gezeigt implizit erweitert. Bei äußeren Joins werden mandantenunabhängige Seiten über Cross Joins künstlich mandantenabhängig gemacht und dadurch NULL-Werte vermieden. Dies betrifft sowohl die mit JOIN direkt angegebenen Joins als auch die bei Verwendung von CDS-Pfadausdrücken ausgeprägten Joins.

Linke Seite Rechte Seite INNER JOIN LEFT OUTER JOIN RIGHT OUTER JOIN CROSS JOIN
mandantenabhängig mandantenabhängig Vergleich der Mandantenspalten in der ON-Bedingung Vergleich der Mandantenspalten in der ON-Bedingung Vergleich der Mandantenspalten in der ON-Bedingung Umwandlung des Cross Joins in einen inneren Join mit ON-Bedingung für die Mandantenspalten
mandantenunabhängig mandantenabhängig - Linke Seite wird durch einen Cross Join der mandantenunabhängigen Datenquelle mit der Datenbanktabelle T000 ersetzt und Vergleich der Mandantenspalten in der ON-Bedingung - -
mandantenabhängig mandantenunabhängig - - Rechte Seite wird durch einen Cross Join der mandantenunabhängigen Datenquelle mit der Datenbanktabelle T000 ersetzt und Vergleich der Mandantenspalten in der ON-Bedingung -
mandantenunabhängig mandantenunabhängig - - - -

#SESSION_VARIABLE

Kann nicht zusammen mit dem Wert #CLIENT_INDEPENDENT der Annotation @ClientHandling.type angegeben werden.

Mit dem Wert #SESSION_VARIABLE werden die Joins der CDS-View wie in der folgenden Tabelle gezeigt implizit erweitert. Dies betrifft sowohl die explizit mit JOIN direkt angegebenen Joins als auch die bei Verwendung von CDS-Pfadausdrücken ausgeprägten Joins.

Linke Seite Rechte Seite INNER JOIN LEFT OUTER JOIN RIGHT OUTER JOIN CROSS JOIN
mandantenabhängig mandantenabhängig Vergleich der Mandantenspalten in der ON-Bedingung Vergleich der Mandantenspalten in der ON-Bedingung Vergleich der Mandantenspalten in der ON-Bedingung Umwandlung des Cross Joins in einen inneren Join mit ON-Bedingung für die Mandantenspalten
mandantenunabhängig mandantenabhängig - Vergleich der Mandantenspalte mit dem Wert der Sitzungsvariable $session.client in der ON-Bedingung - -
mandantenabhängig mandantenunabhängig - - Vergleich der Mandantenspalte mit dem Wert der Sitzungsvariable $session.client in der ON-Bedingung -
mandantenunabhängig mandantenunabhängig - - - -

Weiterhin wird die View beim Zugriff auf mandantenabhängige Datenbanktabellen implizit um WHERE-Klauseln mit Vergleichen der Mandantenspalten mit der Sitzungsvariable $session.client erweitert. Wenn ausschließlich auf mandantenabhängige CDS-Entitäten zugegriffen wird, findet aber keine solche Erweiterung statt.

Wenn die Sitzungsvariable $session.client in der View ausgewertet wird, kann innerhalb eines Zugriffs nicht auf die Daten unterschiedlicher Mandanten zugegriffen werden. Dies ist der Fall,

  • wenn eine mandantenabhängige Datenbanktabelle Datenquelle der View oder einer als Datenquelle verwendeten CDS-View ist und es daher eine implizite WHERE-Klausel für die Sitzungsvariable gibt,
  • wenn bei einem äußeren Join mandantenabhängige und mandantenunabhängige Seiten verknüpft werden und es daher eine implizite ON-Bedingung für die Sitzungsvariable gibt.

Der Zusatz CLIENT SPECIFIED der Anweisung SELECT ist dann nicht erlaubt. Der Zusatz USING CLIENT ist dagegen erlaubt und es wird implizit der dort angegebene Mandant verwendet.

#NONE

Standardwert für den Wert #CLIENT_INDEPENDENT der Annotation @ClientHandling.type. Kann nicht zusammen mit deren Werten INHERITED und #CLIENT_DEPENDENT angegeben werden. Es findet keine implizite Mandantenbehandlung statt.

Hinweise

  • Die Werte #AUTOMATED und #SESSION_VARIABLE erzeugen bei Verwendung einer mandantenabhängigen CDS-View das gleiche Resultat. Sie beeinflussen die interne Implementierung der Mandantenbehandlung, aber nicht die Definition der View und mit Ausnahme von CLIENT SPECIFIED nicht ihre Verwendung. Der Wert #SESSION_VARIABLE kann sich durch die zusätzliche Einschränkung auf einen Mandanten günstig auf die Performance auswirken.
  • Wenn eine View mit dem Wert #INHERITED der Annotation @ClientHandling.type mandantenunabhängig ist, findet keine implizite Mandantenbehandlung statt und die Werte #AUTOMATED und #SESSION_VARIABLE haben keine Wirkung.
  • Wenn keine Annotation @ClientHandling.type angegeben ist, kann die Annotation @ClientHandling.algorithm mit den Werten #AUTOMATED oder #SESSION_VARIABLE für den Standardwert #INHERITED angegeben werden.
  • Wenn eine Annotation @ClientHandling.type aber keine Annotation @ClientHandling.algorithm angegeben ist, wird implizit der Wert #AUTOMATED bei #INHERITED und #CLIENT_DEPENDENT bzw. #NONE bei #CLIENT_INDEPENDENT gesetzt.
  • Wenn keine der Annotationen angegeben ist, gelten die Standardwerte #INHERITED für @ClientHandling.type und #AUTOMATED für @ClientHandling.algorithm.
  • Der Wert #NONE kann nur für explizit als mandantenunabhängig deklarierte Views angegeben werden. Eine Angabe bei mit #CLIENT_DEPENDENT explizit als mandantenabhängig deklarierten Views würde eine selbstprogrammierte Mandantenbehandlung erfordern, die derzeit noch nicht unterstützt wird.
  • Bei Angabe des Werts #SESSION_VARIABLE ist der Zusatz CLIENT SPECIFIED der Anweisung SELECT nur dann verboten, wenn auf eine View zugegriffen wird, in der die Sitzungsvariable $session.client tatsächlich verwendet wird. Insbesondere bedeutet die Angabe einer mandantenabhängigen View in einer Assoziation nicht unbedingt die Verwendung der Sitzungsvariablen. Die Sitzungsvariable wird nur verwendet, wenn die Assoziation in der View als äußerer Join mit impliziter ON-Bedingung für die Sitzungsvariable ausgeprägt wird.

Eigenschaften mandantenabhängiger CDS-Views

Die Mandantenabhängigkeit einer CDS-View wirkt sich bei einem Zugriff über wie folgt auf die CDS-Entität und die zugehörige CDS-Datenbank-View aus:

  • Die View-Felder der CDS-Entität einer mandantenabhängigen CDS-View umfassen keine Mandantenspalte. Auch eine explizit in der SELECT-Liste aufgeführte Mandantenspalte einer mandantenabhängigen CDS-View ist keine Komponente des durch die CDS-Entität repräsentierten strukturierten Datentyps und wird implizit aus der Ergebnismenge einer SELECT-Anweisung entfernt.

  • Bei einem Zugriff auf eine mandantenabhängige CDS-Entität mit SELECT werden implizit die Daten des aktuellen oder des im Zusatz USING CLIENT angegebenen Mandanten gelesen. Wenn der Zusatz CLIENT SPECIFIED angegeben ist, wird die Ergebnismenge um eine Spalte erweitert, welche für jede Zeile mit der zugehörigen Mandantenkennung gefüllt wird. Um diese Spalte in der SELECT-Anweisung verwenden zu können, muss ihr hinter dem Zusatz CLIENT SPECIFIED ein Name zugeordnet werden. Ohne die Definition des Namens ist keine Adressierung in einer Klausel und keine Inline-Deklaration hinter INTO möglich. Bei INTO CORRESPONDING wird ebenfalls der definierte Name verwendet. Wenn kein Name definiert ist, wird die Mandantenspalte nicht transportiert.

  • Die View-Felder einer CDS-Datenbank-View einer mandantenabhängigen CDS-View umfassen immer eine Mandantenspalte. Dies ist unabhängig davon, ob die Mandantenspalte in der SELECT-Liste angegeben ist oder nicht.

  • Der Name der Mandantenspalte einer CDS-Datenbank-View mit eingeschalteter Mandantenbehandlung wird nach folgender Hierarchie festgelegt: Wenn die Mandantenspalte in der SELECT-Liste angegeben ist, wird deren Name bzw. deren alternativer Elementnamen verwendet. Wenn die Mandantenspalte nicht in der SELECT-Liste angegeben ist, wird MANDT verwendet. Wenn MANDT bereits in der SELECT-Liste als (alternativer) Elementname vergeben ist, wird CLIENT verwendet. Wenn sowohl MANDT als auch CLIENT nicht möglich sind, kommt es zu einem Syntaxfehler.

Hinweise

  • Mit Native SQL oder in einer AMDP-Methode kann nur auf die CDS-Datenbank-View zugegriffen werden. Beim Zugriff auf mandantenabhängige Views muss dabei wie üblich die Mandantenkennung spezifiziert werden und es sollte nur auf Daten des aktuellen Mandanten zugegriffen werden.
  • Bei einem Native-SQL-Zugriff oder einem AMDP-Zugriff auf die CDS-Datenbank-View einer mandantenabhängigen CDS-View, deren Mandantenbehandlung durch die Annotation @ClientHandling.algorithm:#SESSION_VARIABLE bestimmt wird, ist zu beachten:
  • In der View wird in der Regel implizit die Sitzungsvariable $session.client verwendet. Diese ist nur auf einer SAP-HANA-Datenbank, die als Standarddatenbank eines AS ABAP dient, unter dem Namen CDS_CLIENT garantiert vorhanden. Auf anderen Plattformen sind das Vorhandensein und der Inhalt der Sitzungsvariable außerhalb eines -Zugriffs nicht garantiert und es kann zu unerwartetem Verhalten oder Programmabbrüchen kommen.

  • Es darf keine eigene WHERE-Bedingung verwendet werden, die einen anderen Mandanten selektiert als die Sitzungsvariable und es muss dafür gesorgt werden, dass die datenbankspezifische Ausprägung der Sitzungsvariable $session.client während eines Native-SQL-Zugriffs oder eines oder AMDP-Zugriffs den gewünschten Wert hat. Sie enthält außerhalb eines -Zugriffs standardmäßig den aktuellen Mandanten.

Der letzte Punkt ist insbesondere bei der Mandantenbehandlung in allgemeinen AMDP-Prozedurimplementierungen auf der SAP-HANA-Datenbank zu beachten, die in ABAP wie normale Methoden aufgerufen werden. Der Wert der entsprechenden HANA-Sitzungsvariable CDS_CLIENT muss bei einem Zugriff auf eine solche CDS-Datenbank-View mit dem Zusatz AMDP OPTIONS CDS SESSION CLIENT bei der Deklaration der AMDP-Methode explizit gesetzt werden, ansonsten kommt es zu einem Syntaxfehler. Bei einer AMDP-Funktionsimplementierung, die als CDS-Tabellenfunktion in verwendet wird, ist die HANA-Sitzungsvariable CDS_CLIENT dagegen mit dem dort festgelegten Inhalt gefüllt.

CDS-Views, Mandantenbehandlung






ROGBILLS - Synchronize billing plans   rdisp/max_wprun_time - Maximum work process run time  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 27751 Date: 20240523 Time: 152237     sap01-206 ( 322 ms )