将业务逻辑添加到基于CDS的OData服务的OData更新中

时间:2019-03-15 08:54:47

标签: odata sap abap gateway cds

我已经在本地程序包中创建了一个自定义CDS视图,如下所示:

@AbapCatalog.sqlViewName: 'ZMD_C_PUR_REQ3'
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Consumption View Purchase Requisition'

@ObjectModel.semanticKey: 'banfn'

@ObjectModel.transactionalProcessingDelegated: true

@ObjectModel.createEnabled: true
@ObjectModel.deleteEnabled: true
@ObjectModel.updateEnabled: true

@ObjectModel.entityChangeStateId: 'last_change'

@OData.publish: true
define view ZMD_C_PUR_REQ_03 as select from ZMD_I_PURCHASE_REQUISTION {
    key banfn,
    status,
    @Semantics.systemDateTime.lastChangedAt: true
    last_change
}

激活此CDS视图并在事务/ IWFND / MAINT_SERVICE中公开生成的OData服务后,即使可以乐观地锁定并发更新,它也能按预期工作。

此外,我的要求是添加其他业务逻辑,以便针对给定的规则集验证更新请求的有效负载。也就是说,如果更新的数据违反了规则,则更新请求将被拒绝,并应通知客户端(例如,通过HTTP 500)。

我该如何完成?

我找不到任何生成的类,例如* DPC_EXT,可以在其中丰富业务逻辑。

我也确实在注册更新的BOPF业务对象上创建了一个验证。但是,通过OData更新实体时,不会调用此验证。

2 个答案:

答案 0 :(得分:1)

您通过注释@OData.publish: true创建了OData服务。 这对于简单的服务很方便,但是便利性是在灵活性之间进行权衡的。 在您的情况下,我将在Gateway Builder(事务SEGW)中创建一个项目,并将CDS视图用作引用的数据源,这样您就可以利用CDS功能进行读取操作,并使用自定义逻辑。

看看this博客

答案 1 :(得分:0)

不可能。

@OData.publish:true有其局限性,无法增强逻辑就是其中之一。

考虑下图,该图显示了创建OData服务的不同方法之间的区别:

enter image description here

在基于注释的OData服务发布期间,创建了以下对象:

  1. 名为<CDS_VIEW_NAME>_CDSR3TR IWSV obj)的实际SAP Gateway服务对象
  2. 名为<CDS_VIEW_NAME>_MDLR3TR IWMO obj)的SAP Gateway模型
  3. 名为<CDS_VIEW_NAME>_CDS_VANR3TR IWVB obj)的注释模型

因此不会创建DPC / MPC_EXT类,如果需要重新定义OData方法,则必须创建SEGW项目并将CDS添加为数据源。