Sapui5 ABAP CDS视图-使用类方法
我想从现有CDS视图中的类中调用一个方法来获取某些数据,这些数据只能由该方法调用。所以我想从CDS视图调用一个方法 最简单的方法是什么Sapui5 ABAP CDS视图-使用类方法,sapui5,abap,sap-fiori,cds,Sapui5,Abap,Sap Fiori,Cds,我想从现有CDS视图中的类中调用一个方法来获取某些数据,这些数据只能由该方法调用。所以我想从CDS视图调用一个方法 最简单的方法是什么 我很乐意看到一个代码示例。注意:只有当CDS视图被处理注释的东西使用时,才会执行abap逻辑,即作为Odata服务公开,而不是在事务SE16N或Eclipse中的预览中。 实际上有两种方法。 第一种选择: @AbapCatalog.sqlViewName: 'ZV_TEST_ABAP' @AbapCatalog.compiler.compareFilter: t
我很乐意看到一个代码示例。注意:只有当CDS视图被处理注释的东西使用时,才会执行abap逻辑,即作为Odata服务公开,而不是在事务SE16N或Eclipse中的预览中。 实际上有两种方法。 第一种选择:
@AbapCatalog.sqlViewName: 'ZV_TEST_ABAP'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'ABAP code in cds'
@OData.publish: true
define view YCDS_WITH_ABAP as select from sflight
{
//sflight
key carrid,
key connid,
key fldate,
seatsocc_f,
@ObjectModel.readOnly: true
@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy: 'ABAP:YCL_CDS_FUNCTION' //ycl_cds_function
cast( '' as abap.char(255)) as text
}where connid = '0017'
您的abap课程:
CLASS ycl_cds_function DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES: if_sadl_exit_calc_element_read.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS ycl_cds_function IMPLEMENTATION.
METHOD if_sadl_exit_calc_element_read~calculate.
DATA:
lt_calculated_data TYPE STANDARD TABLE OF ZV_TEST_ABAP .
" it_original_data -> data that comes from cds
" lt_calculated_data -> data that you will manipulate
MOVE-CORRESPONDING it_original_data TO lt_calculated_data.
" do your extra logic and append/update your cds view data
LOOP AT lt_calculated_data ASSIGNING FIELD-SYMBOL(<fs_data>).
<fs_data>-text = 'hello from abap!'.
ENDLOOP.
MOVE-CORRESPONDING lt_calculated_data TO ct_calculated_data.
ENDMETHOD.
METHOD if_sadl_exit_calc_element_read~get_calculation_info.
ENDMETHOD.
ENDCLASS.
第二种选择:
第二种方法是用自定义类更改服务的DPC类,自定义类继承这个标准类,并在那些重新定义的方法中执行自定义逻辑。
就我个人而言,我会选择第二种选择。我还没有试过,但我觉得性能会更好。:)
有关更多信息,请查看:虽然从OData的角度来看@Oguz answer是值得了解的,但也有一个纯CDS解决方案,它适用于从CDS视图中选择的每个组件,与它们是否支持注释无关 首先,将CD视图指定为从中选择: 然后定义一个表函数。表函数类似于CDS视图,只是它们的执行逻辑是在ABAP中实现的,而不是在SQL脚本中实现的:
define table function MY_TABLE_FUNCTION
returns
{
A : some_type;
B : some_type;
}
implemented by method
cl_my_table_function=>provide_data_for_tf_test;
最后,提供实现表函数的ABAP类:
CLASS cl_my_table_function DEFINITION
PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_amdp_marker_hdb.
CLASS-METHODS provide_data FOR TABLE FUNCTION MY_TABLE_FUNCTION.
ENDCLASS.
CLASS cl_my_table_function IMPLEMENTATION.
METHOD provide_data
BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT
USING some_table.
RETURN
SELECT A, B
FROM some_table;
ENDMETHOD.
ENDCLASS.
当您执行类似操作时,请留出一些额外的时间来测试客户端处理。这种方式的组合通常会降低用户从SELECT语句和常规CDS视图中了解到的自动客户端添加。在涉及的CDS视图上,您可能需要像
@ClientHandling:{type:#CLIENT_DEPENDENT}
这样的注释,并让table函数显式地提供CLIENT或MANDT列。了解table函数是AMDP,它基本上是HANA SQL脚本。不是ABAP。虚拟元素或自定义实体是一种选择。
define table function MY_TABLE_FUNCTION
returns
{
A : some_type;
B : some_type;
}
implemented by method
cl_my_table_function=>provide_data_for_tf_test;
CLASS cl_my_table_function DEFINITION
PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_amdp_marker_hdb.
CLASS-METHODS provide_data FOR TABLE FUNCTION MY_TABLE_FUNCTION.
ENDCLASS.
CLASS cl_my_table_function IMPLEMENTATION.
METHOD provide_data
BY DATABASE FUNCTION FOR HDB LANGUAGE SQLSCRIPT
USING some_table.
RETURN
SELECT A, B
FROM some_table;
ENDMETHOD.
ENDCLASS.