首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ABAP CDS视图-使用类方法

ABAP CDS视图-使用类方法
EN

Stack Overflow用户
提问于 2020-10-08 13:46:02
回答 2查看 3.4K关注 0票数 2

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

做这件事最简单的方法是什么?

我会很高兴看到一个有代码的例子。

EN

回答 2

Stack Overflow用户

发布于 2020-10-09 04:42:12

注意:只有当CDS视图被处理注解的东西使用时,您的abap逻辑才会被执行,例如,作为Odata服务公开,而不是在事务SE16N或Eclipse中的预览中。实际上有两种方法。第一个选项:

代码语言:javascript
复制
@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类:

代码语言:javascript
复制
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.

在eclipse中查看:

在odata中查看:

代码语言:javascript
复制
  ...,{
                "__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类,它继承了这个标准类,并在这些重新定义的方法中执行您的自定义逻辑。就我个人而言,我会选择第二种选择。我还没有试过,但我有一种感觉,性能会更好。:)

如需更多信息,请访问:https://blogs.sap.com/2020/05/11/abap-code-exits-in-cds-views/

票数 3
EN

Stack Overflow用户

发布于 2020-10-12 15:44:12

虽然从OData的角度来看,@Oguz answer是值得知道的,但也有一个纯CDS解决方案,它可以在每个从CDS视图中选择的组件中工作,独立于它们是否支持注释。

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

代码语言:javascript
复制
@AbapCatalog.sqlViewName: 'MYCDSVIEW'
define view MY_CDS_VIEW as select from MY_TABLE_FUNCTION {    
    A,
    B
}

然后定义一个表函数。表函数类似于CDS视图,只是它们的执行逻辑是在ABAP中实现的,而不是SQL脚本:

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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.

当你做这样的事情时,花一些额外的时间来测试客户端的处理。这种方法的组合通常会减少ABAPers从SELECT语句和常规CDS视图中知道的自动客户端添加。您可能需要在所涉及的CDS视图上使用像@ClientHandling: { type: #CLIENT_DEPENDENT }这样的注释,并让表函数显式地提供客户端列或MANDT列。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64256483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档