微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ABAP CDS视图-使用类方法

如何解决ABAP CDS视图-使用类方法

我想从现有CDS视图中的类调用一个方法获取某些数据,该数据只能由该方法调用。所以我想从CDS视图中调用方法

最简单的方法是什么?

我很高兴看到带有代码的示例。

解决方法

注意:仅当CDS视图由处理注释的对象使用时(即作为Odata服务公开,而不是在事务SE16N或Eclipse中的预览中使用),才会执行abap逻辑。 实际上有两种方法。 第一种选择:

@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'

您的精讲课:

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.

在日食中查看: enter image description here 在odata中查看:

  ...,{
                "__metadata": {
                    "id": "lalala')","uri": "blablabla')","type": "YCDS_WITH_ABAP_CDS.YCDS_WITH_ABAPType"
                },"carrid": "AA","connid": "0017","fldate": "/Date(1535068800000)/","seatsocc_f": 20,"text": "hello from abap!"
   },...

第二个选项:

第二种方法是使用您的自定义类更改服务的DPC类,该类将继承此标准类并在这些重新定义的方法中进行自定义逻辑。 就个人而言,我会选择第二种选择。我没有尝试过,但是我感觉性能会更好。 :)

enter image description here

有关更多信息,请检查:https://blogs.sap.com/2020/05/11/abap-code-exits-in-cds-views/

,

从OData角度来看,@ Oguz答案值得一提,但还有一个纯CDS解决方案可用于从CDS视图选择的每个组件中,而与它们是否支持注释无关。

首先,您将CDS视图指定为SELECT FROM <table function>

@AbapCatalog.sqlViewName: 'MYCDSVIEW'
define view MY_CDS_VIEW as select from MY_TABLE_FUNCTION {    
    A,B
}

然后定义一个表函数。表函数类似于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.

当您执行此类操作时,请花费一些额外的时间来测试客户端的处理情况。这种方式的组合通常会降低ABAP使用者从SELECT语句和常规CDS视图中了解到的自动客户端添加。有可能您需要在所涉及的CDS视图上使用诸如@ClientHandling: { type: #CLIENT_DEPENDENT }之类的注释,并使表函数显式提供CLIENT或MANDT列。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。