我刚开始在博客上为abap7.50发布重要的ABAP新闻,有人问我cd新闻。好的,云淘,那么,一个关于新CDS表函数的博客(但是,嘿,我还有真正的工作要做)。
abapcds是SAP通用核心数据服务(CDS)概念的ABAP具体实现。abapcds是开放的,这意味着您可以在SAP支持的所有数据库平台上使用它。是的,ABAP 7.50的所有数据库都支持带有参数的CDS视图,ABAP 7.40和SP08引入了这些视图。
尽管开放性有其优点,但仅在HANA平台上工作的开发人员可能会错过ABAP CDS中的一些代码下推功能。缺少的功能之一是在用cd构建的数据模型中使用数据库函数。到目前为止,只有CDS视图可用。ABAP7.50ABAPCDS还支持CDS表函数作为CDS实体。必须解决两个问题:
两个问题,一个答案:ABAP管理数据库程序(AMDP),由ABAP 7.40、SP05引入。AMDP是一个基于类的框架,用于在asabap中作为AMDP过程管理和调用存储过程。目前,AMDP仅由HANA平台支持。在ABAP7.50之前,AMDP只知道没有返回值的数据库过程。在ABAP7.50中,AMDP还支持带有表格式返回值的数据库函数。这些AMDP函数的主要目的是实现CDS表函数。它们在ABAP中不能作为函数方法调用,而AMDP过程可以作为ABAP方法调用。
为了创建CDS表函数,您有两件事要做:
这两个步骤仅在ADT(Eclipse)中是可能的。
CDS DDL中的定义是直截了当的,例如:
@ClientDependent:truedefine table function DEMO\u CDS\u GET\u SCARR\u SPFLI\u INPCL with parameters@环境.systemField:#客户clnt:abap.clnt, 卡里德:苏卡尔返回{客户:SU mandt; carrname:sèu carrname; connid:s\u conn\u id; cityfrom:s_from_cit; cityto:sïtoïcity;}通过方法CL\u DEMO\u AMDP\u FUNCTIONS\u INPCL=>GET\u SCARR\u SPFLI\u FOR\u CDS实现;
CDS table函数有输入参数并返回一个表格结果集,大数据培训哪好,其结构如returns后面定义的那样。您可以看到,注解@ClientDependent可以用于打开opensql的自动客户端处理。您还会看到一个新的参数注释@环境.systemField,也可用于视图,由opensql通过将sy mandt的值隐式传递给该参数来处理。这样的CDS表函数是abapcds世界中成熟的CDS实体,可以像CDS视图一样使用:它是ABAP字典中的全局结构化数据类型,可以在opensql的SELECT和CDS视图中用作数据源。在implemented by method后面,您可以看到AMDP类和函数必须在其中实现的方法。
激活CDS table函数后,您可以继续在AMDP类中实现函数AMDP方法,这是一个带有marker接口的类,如果\u AMDP \u marker \u HDB。CDS表函数的AMDP方法必须是静态AMDP类的静态函数方法,声明如下:
class-METHODS get \u scarr \u spfli \u for \u CDS
for table function demo \u CDS \u get \u scarr \u spfli \u inpcl.
声明直接链接到CDS表函数。参数接口隐式派生自表函数的定义!实现看起来像您预期的那样:
方法get \u scarr \u spfli \u for \u cd BY DATABASE FUNCTION for HDB LANGUAGE SQLSCRIPT OPTIONS READ-ONLY USING scarr spfli.RETURN SELECTsc命令作为客户副总裁姓名, sp.connid公司, sp.cityfrom公司, 市政府从SCAR AS sc INNER连接spfli AS sp ONsc命令= 特殊要求以及sc.卡里德= 卡里德在哪里特殊要求=:clnt以及卡里德=:carrid ORDER BYsc命令, 副总裁姓名, sp.connid公司;ENDMETHOD.
没有什么新东西,只是通过数据库功能,只读是必须的。HANA数据库函数的实现是在本机SQLScript中完成的。也就是说,你得照顾客户。自动客户端处理仅在opensql端完成。当然,一个真正的CDS表函数要比一个简单的连接做更多特定于HANA的事情(例如包装一个HANA函数),如这里的简单示例所示!你也可以在opensql或CDS视图中编写join代码。
说到opensql,最后但并非最不重要,我们的CDS表格函数作为ABAP程序中SELECT的数据源的用法:
SELECT*FROM demo_CDS_get_scarr_spfli_inpcl(carrid=@carrid)INTO table@data(result)##db#feature_mode[amdp_table_function]。
与使用参数访问CDS视图没有区别。但您必须关闭带有pragma的语法警告,以表明您确实在做什么,即仅为HANA编码。
请注意,我们不需要显式地传递客户端。这是因为相应的参数被注释为隐式传递相应的系统字段。由于CDS table函数被注释为依赖于客户机,因此opensql的SELECT的结果集不包含客户机列,就像CDS视图那样。此外,结果集中不属于当前客户机的所有行都将被隐式删除。这就是为什么依赖于客户机的表函数的返回列表必须有一个客户机列的原因,为了提高性能,本机实现应该只提供当前客户机的行。但由于它是本地的,它必须照顾自己。困惑?那是开放和本地人相遇的时候。在ABAP中,通常DBI为您执行此处理。但这在这里是不可能的。
更多信息请看
哇!太快了!
7.50版本的ABAPDocu也不错。尤其是要对所有的变化有一个全面的了解。7.50版的变化-ABAP关键字文档
Peter
事实上,建站快速,昨晚我成功地将文档推送到了帮助门户。从RTC开始就应该有了,但是遇到了一些关于URL的命名约定问题…
现在你可以看到文档了,我不能停止写博客吗?
不。我们只是渴望更多的细节,解释和例子
好吧,
事实上,我已经迫不及待地等待您即将发布的帖子,并已经阅读了更改文档(简短)。
有许多令人兴奋的新功能在那里……
你好霍斯特,
我有一些关于表函数的问题:将是非常可观的如果你能帮忙:
1。授权概念如何与表函数一起工作?我们可以为他们创建DCL角色吗?
2. 我们可以使用通过表函数创建的视图的注释来创建ODATA服务或分析查询吗?
3. 与独立的AMDP功能相比,使用这些表函数有什么优势?我们可以使用AMDP访问数据函数,而不必输入CD。表函数提供了什么额外的功能??
真的很期待这些答案……
1,不,你必须把它们的用法包装在一个界面视图中
2,什么叫云服务器,你可以在任何地方写任何注解,这取决于分析它们的框架,如果它们支持表函数的直接用法。请参考相应的文档
3,将它们合并到您的数据模型(DDL!)
感谢您的及时回复Horst…
嗨Horst,
是比AMDP程序更快的表功能。如果我在两者中有相同的逻辑…在哪种情况下我应该使用表函数,在哪种情况下我应该使用AMDP程序?
谢谢,
Ramesh
每个ABAP CDS表格功能都由AMDP程序实现。因此,如果两者的逻辑相同,则执行时间相同。
如果要将表函数用作其他CDS实体中的数据源,则使用表函数。如果您想通过meth()从ABAP给他们打电话,您可以使用正常的AMDP程序。
Horst
谢谢Horst
嗨Horst,
谢谢您的文章。这是非常有帮助和信息。
我试图实现一个表函数,但得到一个问题。希望您能回答这个问题。