Ansicht
Dokumentation

ABAPSELECT_CLIENT - SELECT CLIENT

ABAPSELECT_CLIENT - SELECT CLIENT

TXBHW - Original Tax Base Amount in Local Currency   CL_GUI_FRONTEND_SERVICES - Frontend Services  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

SELECT, USING CLIENT, CLIENTS

Kurzreferenz



... ${ USING ${ CLIENT clnt $}
          $| ${ CLIENTS IN @client_range_tab $}
          $| ${ CLIENTS IN T000 $}
          $| ${ ALL CLIENTS $} $} ...


Varianten:

1. ... USING CLIENT clnt

2. ... USING $[ALL$] CLIENTS $[IN$] ...

Wirkung

Der optionale Zusatz USING in der FROM-Klausel einer Query schaltet die implizite Mandantenbehandlung vom aktuellen Mandanten auf andere Mandanten um.

  • Die Variante USING CLIENT ersetzt in der Mandantenbehandlung den aktuellen Mandanten durch den angegebenen Mandanten,
  • Die Variante USING $[ALL$] CLIENTS $[IN$] selektiert statt des aktuellen Mandanten die Daten beliebig vieler anderer Mandanten.

Der Zusatz USING muss bei der Angabe einer einzelnen Datenquelle direkt hinter data_source und bei Angabe eines Join-Ausdrucks hinter dem letzten Zusatz ON der Join-Bedingung stehen. Die Mandantenbehandlung kann genau einmal pro Query umgestellt werden und wirkt auf alle dort angegebenen mandantenabhängigen Datenquellen. Dazu gehören:

  • Join-Ausdrücke, der Zusatz USING kann nicht für einzelne Datenquellen angegeben werden.
  • Bedingungen sql_cond, der Zusatz USING kann dort nicht in Subqueries angegeben werden.

In hinter WITH definierten Subqueries und in mit UNION, INTERSECT oder EXCEPT verknüpften Queries kann die Mandantenbehandlung dagegen umgestellt werden. Bei statischer Angabe der Datenquelle darf der Zusatz nur angegeben werden, wenn mindestens eine mandantenabhängige Datenquelle verwendet wird, ansonsten kommt es zu einem Syntaxfehler.

Der Zusatz USING kann nicht beim Zugriff auf eine CDS-Entität verwendet werden, die mit einer CDS -Rolle verknüpft ist und für die eine CDS-Zugriffskontrolle durchgeführt wird:

  • Wenn der Zusatz USING statisch erkennbar für einen Zugriff auf eine CDS-Entität verwendet wird, die ohne die Annotation AccessControl.authorizationCheck:#NOT_ALLOWED definiert ist und nicht der Zusatz WITH PRIVILEGED ACCESS in der FROM-Klausel verwendet wird, kommt es zu einem Fehler von der Syntaxprüfung.
  • Wenn der Zusatz USING CLIENT für einen Zugriff auf eine CDS-Entität verwendet wird, die mit einer CDS-Rolle verknüpft ist und für die eine CDS-Zugriffskontrolle durchgeführt wird, kommt es zu einer Ausnahme.

Der Zusatz USING ist beim Zugriff auf nicht erlaubt, da die Mandantenbehandlung für implizit erfolgt und nicht manipuliert werden kann. Für mehr Details, siehe ABAP CDS - Mandantenbehandlung bei CDS-View-Entitäten.

Hinweise

  • Bei dynamischer Angabe der Datenquelle hinter FROM kann der Zusatz USING bei SELECT immer angegeben werden. Es kommt zu keiner Ausnahme, wenn keine mandantenabhängige Tabelle oder eine solche View verwendet wird, sondern der Zusatz wird ignoriert.
  • Da jeder Mandant eine in sich abgeschlossene Einheit darstellt, sollte die implizite Mandantenbehandlung in Anwendungsprogrammen nie umgestellt werden.
  • Wenn auf Daten eines anderen Mandanten zugegriffen werden muss, ist USING dem obsoleten Zusatz CLIENT SPECIFIED vorzuziehen, da alle notwendigen Bedingungen implizit gesetzt werden und auch der Zugriff auf mandantenabhängige CDS-Entitäten einfacher ist.
  • Die CDS-Zugriffskontrolle funktioniert nicht für mandantenübergreifende Zugriffe. Aus diesem Grund kann der Zusatz USING nur beim Zugriff auf CDS-Entitäten verwendet werden, für welche die Zugriffskontrolle mit der Annotation AccessControl.authorizationCheck:#NOT_ALLOWED oder mit dem Zusatz WITH PRIVILEGED ACCESS in der FROM-Klausel abgeschaltet ist.
  • Der Zusatz WITH PRIVILEGED ACCESS wirkt nur für die in der FROM-Klausel angegebene CDS-Entität. Wenn in der aktuellen Query über einen Pfadausdruck auf eine CDS-Entität zugegriffen wird, für welche die CDS-Zugriffskontrolle eingeschaltet ist, kann der Zusatz USING nicht verwendet werden.
  • Alternativ zu USING kann außerhalb des strikten Modus ab Release noch der Zusatz CLIENT SPECIFIED angegeben werden. Dieser in Queries vollständig obsolete Zusatz schaltet die implizite Mandantenbehandlung ganz ab.

Variante 1

... USING CLIENT clnt


Wirkung

Der Zusatz USING CLIENT stellt die implizite Mandantenbehandlung von für die aktuelle Query so um, dass statt der aktuellen Mandantenkennung die in clnt vorhandene Mandantenkennung verwendet wird. An allen Stellen, an denen bei der impliziten Mandantenbehandlung bei SELECT-Anweisungen implizit der aktuelle Mandant verwendet wird, wird der in clnt angegebene Mandant verwendet. Es wird eine implizite Bedingung für diesen Mandanten erzeugt und in Joins werden die Mandantenspalten beteiligter mandantenabhängiger Datenquellen auf Gleichheit verglichen. Wenn statisch erkennbar ist, dass die Datenquellen data_source nicht mandantenabhängig sind, kann der Zusatz USING CLIENT nicht angegeben werden.

Für clnt muss ein Datenobjekt vom Typ c der Länge 3 angegeben werden, das eine Mandantenkennung enthält. Es kann ein Literal oder eine Hostvariable angegeben werden. Ein Angabe des Systemfelds sy-mandt hätte keine Wirkung und es darf nicht direkt für clnt angegeben werden.

Bei einem Zugriff auf CDS-Entitäten wird die Sitzungsvariable (CDS-View-Entität, ) client während der Ausführung der aktuellen SELECT-Anweisung auf die in clnt angegebene Mandantenkennung gesetzt. Dabei gibt es folgende Einschränkungen:

  • Bei einem Zugriff auf CDS-Views wird die Sitzungsvariable client nur dann auf einen anderen Wert als der aktuelle Mandant gesetzt, wenn sie bei der Auswertung der View auf der Datenbank benötigt wird. Bei einem Zugriff auf CDS-Tabellenfunktionen wird die Sitzungsvariable immer auf den mit USING angegebenen Wert gesetzt.
  • Wenn ein Zugriff mehrere Queries umfasst, die auf mandantenabhängige CDS-Views zugreifen, bei denen die Art der Mandantenbehandlung mit der Annotation @ClientHandling.algorithm:#SESSION_VARIABLE definiert ist, muss die Sitzungsvariable client in jeder dieser Queries auf den gleichen Wert gesetzt werden. Es kommt zum Laufzeitfehler SAPSQL_DIFFERENT_CLIENT_VALUES, wenn in einer dieser Queries mit USING CLIENT eine abweichende Mandantenkennung angegeben wird. Diese Situation kann in der Anweisung WITH oder bei der Verwendung von UNION, INTERSECT oder EXCEPT auftreten.

Auf der SAP-HANA-Datenbank setzt USING CLIENT entsprechend die ABAP-spezifische Sitzungsvariable CDS_CLIENT.

Hinweise

  • Bei Verwendung des Zusatzes USING CLIENT arbeitet die Anweisung SELECT so, als sei der aktuelle Benutzer mit der in clnt angegebenen Mandantenkennung angemeldet.
  • Wenn in clnt eine Mandantenkennung angegeben ist, für die es keinen Mandanten gibt, wird die Anweisung SELECT mit dieser Kennung ausgeführt und die Ergebnismenge ist entsprechend leer.
  • Bei Verwendung des Zusatzes USING CLIENT wird die Syntaxprüfung in einem strikten Modus ausgeführt, welche die Anweisung strenger behandelt als die normale Syntaxprüfung.

Beispiel

Auslesen aller Kunden im Mandanten "800" aus einer mandantenabhängigen DDIC-Datenbanktabelle.

Variante 2

... USING $[ALL$] CLIENTS $[IN$] ...


Alternativen:

1. ... USING CLIENTS IN @client_range_tab

2. ... USING CLIENTS IN T000

3. ... USING ALL CLIENTS

Wirkung

Die Zusätze USING $[ALL$] CLIENTS $[IN$] stellen die implizite Mandantenbehandlung von für die aktuelle Query so um, dass diese nicht nur die Daten des aktuellen Mandanten liest, sondern die Daten aller über den Zusatz angegebenen Mandanten. Die Zusätze ändern die implizite WHERE-Bedingung für die Mandantenspalte, die beim Zugriff an die Datenbank übergeben wird. Sie beeinflussen nicht die Gleichheitsbedingung für die Mandantenspalten von mandantenabhängigen Datenquellen bei Joins.

Die Zusätze USING $[ALL$] CLIENTS $[IN$] setzen bei einem Zugriff auf CDS-Entitäten nicht die Sitzungsvariable client. Sie können nicht beim Zugriff auf folgende CDS-Entitäten verwendet werden:

  • CDS-Views, welche die Sitzungsvariable client verwenden.

Die Zusätze USING $[ALL$] CLIENTS $[IN$] dürfen nicht zusammen mit folgenden Pfadausdrücken angegeben werden:

Hinweise

  • Die Zusätze USING $[ALL$] CLIENTS $[IN$] ersetzten den obsoleten Zusatz CLIENT SPECIFIED in allen Fällen, in denen dieser die implizite Mandantenbehandlung abschaltet, um auf mehr als einen Mandanten zugreifen zu können. Im Gegensatz zu CLIENT SPECIFIED bleibt bei USING $[ALL$] CLIENTS $[IN$] die Mandantenbehandlung in Joins erhalten.
  • Bei Verwendung des Zusatzes USING CLIENTS wird die Syntaxprüfung im strikten Modus ab Release ausgeführt.

Alternative 1

... USING CLIENTS IN @client_range_tab


Wirkung

Dieser Zusatz stellt die implizite Mandantenbehandlung von für die aktuelle Query so um, dass statt des aktuellen Mandanten implizit die Daten aller Mandanten selektiert werden, deren Mandantenkennungen den Bedingungen in einer Ranges-Tabelle client_range_tab genügen. Wenn die Ranges-Tabelle leer ist, werden die Daten aller Mandanten selektiert.

Für client_range_tab kann eine interne Tabelle als Hostvariable oder als Hostausdruck angegeben werden, deren Zeilenstruktur der einer Ranges-Tabelle entspricht, wobei die Spalten low und high vom Typ c der Länge 3 sein müssen.

Hinweise

  • Die Bedingungen der Ranges-Tabelle werden in implizite WHERE-Bedingungen umgesetzt und an das Datenbanksystem übergeben.
  • Bei Joins werden weiterhin die Mandantenspalten der beteiligten mandantenabhängigen Datenquellen implizit auf Gleichheit überprüft.

Beispiel

Selektion der Daten aller Mandanten, deren Mandantenkennungen den Bedingungen einer in einem Hostausdruck mit dem Wertoperator VALUE konstruierten Ranges-Tabelle genügen.

Alternative 2

... USING CLIENTS IN T000


Wirkung

Dieser Zusatz stellt die implizite Mandantenbehandlung von für die aktuelle Query so um, dass statt des aktuellen Mandanten implizit die Daten aller Mandanten selektiert werden, deren Mandantenkennungen in der Spalte MANDT der Systemtabelle T000 enthalten sind.

Hinweise

  • Die DDIC-Datenbanktabelle T000 enthält die möglichen Mandantenkennungen eines AS ABAP. Mandantenspalten von Anwendungstabellen sollte keine anderen Mandantenkennungen enthalten, als in T000 vorgegeben. Dies wird von aber nicht überprüft.
  • Die implizite Überprüfung des Inhalts der DDIC-Datenbanktabelle T000 wird intern dadurch verwirklicht, dass eine WHERE-Bedingung mit entsprechender Subquery an das Datenbanksystem übergeben wird.
  • Bei Joins werden weiterhin die Mandantenspalten der beteiligten mandantenabhängigen Datenquellen implizit auf Gleichheit überprüft.

Beispiel

Siehe unten.

Alternative 3

... USING ALL CLIENTS


Wirkung

Dieser Zusatz stellt die implizite Mandantenbehandlung von für die aktuelle Query so um, dass statt der Daten des aktuellen Mandanten alle Daten unabhängig vom Inhalt der Mandantenspalte selektiert werden.

Hinweise

  • Bei dem Zusatz USING ALL CLIENTS wird keine implizite WHERE-Bedingung für die Mandantenspalte an das Datenbanksystem übergeben.
  • Bei Joins werden weiterhin die Mandantenspalten der beteiligten mandantenabhängigen Datenquellen implizit auf Gleichheit überprüft.
  • Der Zusatz USING ALL CLIENTS ersetzt die Angabe des Zusatzes CLIENT SPECIFIED ohne Angabe einer WHERE-Bedingung für die Mandantenspalte.

Beispiel

Das Beispiel überprüft für die Tabelle SFLIGHT, ob eine Selektion aller Daten ohne Bedingung für die Mandantenspalte das gleiche Ergebnis hat, wie eine Selektion der Mandanten aus der Systemtabelle T000.






PERFORM Short Reference   rdisp/max_wprun_time - Maximum work process run time  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 23316 Date: 20240523 Time: 140259     sap01-206 ( 305 ms )