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を明確に指定しない場合でも、一緒です。
@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

ABAP News for Release 7.51 – ABAP CDS Client Handling的更多相关文章

  1. 如何使用ABAP代码反序列化JSON字符串成ABAP结构

    假设我有这个JSON字符串如下图所示: 我的任务是解析出上图黑色方框里的几个字段,比如ObjectID, ETag, BuyerID, DateTime, ID, Name等等,把它们的值存储到对应A ...

  2. 【ABAP系列】SAP 如何用ABAP实现自动发送外部邮件

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP 如何用ABAP实现自动发 ...

  3. ABAP开发顾问必备:SAP ABAP开发技术总结

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. ABAP程序执行效率和优化 ABAP Performance Examples

    一.             SQL Interface1.         Select ... Where vs. Select + Check用Select … Where语句效率比Select ...

  5. ABAP开发顾问必备:SAP ABAP开发技术总结[转载]

    转载自SAP师太技术博客,原文链接:http://www.cnblogs.com/jiangzhengjun/p/4260224.html 在原文上增加了链接,此文及此文的链接版权都归SAP师太所有. ...

  6. ABAP中的枚举对象

    枚举对象是枚举类型的数据对象.枚举对象只能包含类型为枚举类型的枚举值.ABAP从版本7.51开始支持它们. 这是一种常见的模式.在ABAP 7.51之前,人们通常用如下方式实现类似的功能: CLASS ...

  7. CDS测试框架介绍:如何为ABAP CDS Entities写测试

    动机 现在大家都知道单元测试对我们代码的好处.并且我们都承认它是开发过程中不可或缺的一部分.但是在把代码切换到数据库的模式下的时候,我们被粗暴地打回了软件测试的黑暗年代...我们现在面临着逻辑下推到A ...

  8. ABAP CDS-介绍(ABAP CDS视图)

    前言 文章翻译自Tushar Sharma的文章,转载请注明原作者和译者! 在SAP发展到SAP HANA版本之后,SAP内部的技术正在快速地变化,SAP开发业务应用程序的方式已经发生了范式转变(根本 ...

  9. HANA CDS与ABAP CDS

    如果你在网络或者SCN上面搜索CDS,即SAP的Core Data Services,你会很容易地找到类似“Core Data Services(CDS)是一个在SAP HANA中用于定义和消费富语义 ...

随机推荐

  1. LotusScript_导出数据库路径和名称

    对服务器有些数据库需要建立复本,新建拷贝,修改权限(ACL),或是修改数据库标识符(ID)需要找到这些数据库.这个方法是导出指定服务器上所有数据库的路径,数据库名,标识符等信息,导出后对Excel表格 ...

  2. python下载文件

    import urllib import urllib2 import requests url = "http://www.blog.pythonlibrary.org/wp-conten ...

  3. Struts2_Namespace

    namespace 决定了action的访问路径,默认为"",可以接收所有路径的action,当精确的index.action处理不了的时候,就会找到这个action;namesp ...

  4. Linux 使用第三方邮箱发邮件的设置

    mail命令在Ubuntu下是需要安装的,使用下条命令进行安装: sudo apt-get install heirloom-mailx 在CentOS 下安装则是: yum install mail ...

  5. Arduino入门教程--课前准备--Arduino驱动安装及1.0 IDE菜单介绍

    编译器版本:Arduino 1.0实验器件:ocrobot mango控制板(Arduino兼容)一块 Arduino控制板到手后,首先需要在电脑上把驱动装上,这样才可以进行各种实验. 第一步需要把A ...

  6. MySQL数据库实验四:嵌套查询

    实验四          嵌套查询 一.实验目的 掌握SELECT语句的嵌套使用,实现表的复杂查询,进一步理解SELECT语句的高级使用方法. 二.实验环境 三.实验示例 1.  查询与“刘晨”在同一 ...

  7. Uva 10806 来回最短路,不重复,MCMF

    题目链接:https://uva.onlinejudge.org/external/108/10806.pdf 题意:无向图,从1到n来回的最短路,不走重复路. 分析:可以考虑为1到n的流量为2时的最 ...

  8. DFS+BFS(POJ3083)

    题目链接:http://poj.org/problem?id=3083 解题报告:这个题目,搜最短路,没有什么问题.优先走左边,走右边,有很多说法,思路大概都相同,都是记录当前朝向,根据数学公式(i+ ...

  9. android获取传感器数据

    传感器获取数据的频率: https://blog.csdn.net/huangbiao86/article/details/6745933 SensorManager.SENSOR_DELAY_GAM ...

  10. override与重载的区别

    override与重载的区别override 与重载的区别,重载是方法的名称相同.参数或参数类型不同,进行多次重载以适应不同的需要 Override 是进行基类中函数的重写.