Open SQLは自動的クライアント処理をサポートしています。 Open SQLでクライアント依存のデータソースにアクセスする時、デフォルトでは現在のクライアントのデータだけが考慮されます。
クライアント依存のデータソースとは何でしょうか?
- 最初の列が組み込みディクショナリタイプCLNTのクライアント列である場合、ABAPディクショナリで定義されたデータベーステーブルまたはクラシックビューはクライアント依存です。
- CDSエンティティ(CDSビューおよびCDSテーブル関数)のクライアント依存関係およびクライアント処理は、注釈によって定義されます。 リリース7.51では、そのための新しいアノテーション@CLientHandlingが導入されています。 以前のアノテーション@ClientDependentは廃止されました。
CDS ビュー
CDSビューでは、クライアントの依存関係とクライアント処理が内部的に行われる方法を定義するためにアノテーション@CLientHandlingを使用します。 そのためには、次の2つのサブアノテーションを指定できます:
@ClientHandling.type: #INHERITED | #CLIENT_DEPENDENT | #CLIENT_INDEPENDENT
- #INHERITED(デフォルト)を使用すると、ビューのクライアント依存性は使用されるデータソースによって決まります。 ビューで使用されているデータソースの1つがクライアント依存の場合、ビューはクライアント依存です。 ビューで使用されているデータソースがクライアントに依存していない場合、ビューはクライアントに依存しません。
- が#CLIENT_DEPENDENTの場合、ビューはクライアントに依存します。 少なくとも1つのデータソースはクライアントに依存する必要があります。
- #CLIENT_INDEPENDENTを指定すると、ビューはクライアントに依存しません。 どのデータソースもクライアントに依存することはできません。
@ClientHandling.algorithm #AUTOMATED | #SESSION_VARIABLE | #NONE
- #AUTOMATED(クライアント依存ビューのデフォルト)が指定されている場合、ビューのON conditions およびその他の条件は、基礎となるデータソースのクライアント列の条件によって暗黙的に拡張されます。左側の外部結合の左側のクライアント非依存データソースが右側のクライアント依存データソースと結合されている場合、左側はすべて独立したデータベーステーブルT000を持つクライアント非依存データソースのクロス結合に置き換えられます。クライアントこれにより、左側のクライアントが人為的に依存するようになり、NULL値が回避されます。
- #SESSION_VARIABLEが指定されている場合は、上記の拡張機能に加えて、暗黙のWHERE条件が追加され、セッション変数$ session.clientに現在格納されているクライアントが選択されます。 Open SQLアクセス中、このセッション変数には現在のクライアント、またはUSING CLIENTオプションで設定されたクライアントが含まれます。結果は#AUTOMATEDと同じですが、パフォーマンスは向上します。
- #NONEは、クライアントに依存しないビューに対してのみ可能であり、それがデフォルトです。
@ClientHandling.type:#INHERITED
@ClientHandling.algorithm:#AUTOMATED
クライアント固有のCDSビューにはクライアントカラムがありません。 Open SQLのSELECTを使用してクライアント固有のCDSビューにアクセスすると、現在のクライアントまたは追加のUSING CLIENTで指定されたクライアントのデータが暗黙的に読み取られます。
以下は、単純なクライアント依存の投影ビューの例です。
@AbapCatalog.sqlViewName: 'DEMO_CDS_PRJCTN0'
@AccessControl.authorizationCheck: #NOT_REQUIRED
@ClientHandling.type: #CLIENT_DEPENDENT
@ClientHandling.algorithm: #AUTOMATED
define view demo_cds_spfli_client_0
as select from
spfli
{
key spfli.carrid,
key spfli.connid,
spfli.cityfrom,
spfli.cityto
}
このクライアント依存CDSビューの構造は、クライアント列を構成しません。 そのビューのOpen SQL SELECTは現在のクライアントからデータを読み取りますが、結果セットにクライアントフィールドは含まれません。
CDSテーブル関数
@ClientHandling.type: #CLIENT_DEPENDENT
クライアントの依存関係をOn(デフォルト)
@ClientHandling.type: #CLIENT_INDEPENDENT
クライアントの依存関係をOff
- クライアント依存テーブル関数の場合、要素リストには最初の要素として明示的なクライアントフィールドが必要です。このフィールドは、関連するAMDP関数実装の戻り値の列ですが、CDSエンティティの構造化データ型の構成要素ではありません。 Open SQLのSELECTを使用してクライアント固有のCDSテーブル関数にアクセスすると、現在のクライアントまたは追加のUSING CLIENTで指定されたクライアントに属する結果セットからそれらの行だけが選択されます。 AMDP関数のネイティブSQLScript実装は、必要なすべてのデータが利用可能になるようにする必要があります。
- クライアント非依存テーブル機能では、組み込みディクショナリタイプCLNTの明示的なクライアント項目を持つ必要はありません。最初の要素の型がCLNTの場合、クライアントフィールドとしては機能しません。代わりに、関連するAMDP関数実装の戻り値の通常の列であり、CDSエンティティの構造化データ型の通常の構成要素でもあります。クライアントに依存しないCDSテーブル関数がOpen SQL SELECTを使ってアクセスされるとき、タイプCLNTのカラムは特別な意味を持たず、他の要素のように扱われます。
以下は、クライアント依存のCDSテーブルの関数の例です。
lientHandling.type: #CLIENT_DEPENDENT
define table function DEMO_CDS_GET_SCARR_SPFLI_INPCL
with parameters
@Environment.systemField: #CLIENT
clnt :abap.clnt,
carrid :s_carr_id
returns
{
client :s_mandt;
carrname :s_carrname;
connid :s_conn_id;
cityfrom :s_from_cit;
cityto :s_to_city;
}
implemented by method
CL_DEMO_AMDP_FUNCTIONS_INPCL=>GET_SCARR_SPFLI_FOR_CDS;
アノテーション@ Environment.systemField:#CLIENTを持つタイプCLNTの入力パラメータCLNTがあります。 現在のクライアントは、Open SQL SELECTで暗黙的にこのパラメータに渡されます。 関連するAMDPクラスCL_DEMO_AMDP_FUNCTIONS_INPCLのAMDPメソッドGET_SCARR_SPFLI_FOR_CDSの実装では、この入力パラメータを使用して結果セットを現在のクライアントに制限できます。
@ClientDependent : true | false
CDSビューの場合、trueの場合
@ClientHandling.type:#INHERITED
@ClientHandling.algorithm:#AUTOMATED
falseの場合
@ClientHandling.type:#CLIENT_INDEPENDENT
@ClientHandling.algorithm:#NONE
CDSテーブル関数の場合、trueとfalseの値は次のように
@ClientHandling.type: #CLIENT_DEPENDENT | #CLIENT_INDEPENDENT
サブアノテーション付きの新しいアノテーション@CLientHandlingは、それが置き換えられる@ClientDependentと比較してより多くの可能性を提供するので導入されました。 CDSビューについてのみ、小さな違いがあります。@ClientDependent:falseを使用して、クライアント依存のデータソースを含むクライアント非依存のビューを定義できます。 しかし、これは通常そんなに良い考えではありません。 特にCDSエンティティーの代わりにCDSデータベースビューにアクセスすると、予期しない動作が発生する可能性があります。 したがって、新しい注釈の制限はクリーンアップと見なすことができます。
原文は:
ABAP News for Release 7.51 – ABAP CDS Client Handling