向基于CDS的OData服务的OData更新添加业务逻辑

向基于CDS的OData服务的OData更新添加业务逻辑,odata,abap,gateway,cds,Odata,Abap,Gateway,Cds,我在本地软件包中创建了自定义CD视图,如下所示: @AbapCatalog.sqlViewName: 'ZMD_C_PUR_REQ3' @AccessControl.authorizationCheck: #NOT_REQUIRED @EndUserText.label: 'Consumption View Purchase Requisition' @ObjectModel.semanticKey: 'banfn' @ObjectModel.transactionalProcessingD

我在本地软件包中创建了自定义CD视图,如下所示:

@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视图并在transaction/IWFND/MAINT_服务中公开生成的OData服务后,即使使用乐观锁定来处理并发更新,它也能按预期工作

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

我怎样才能做到这一点

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


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

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

看看博客吧,这是不可能的

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

考虑此图,该图显示了创建OData服务的不同方法之间的差异:

在OData服务基于注释的发布过程中,将创建以下对象:

  • 名为
    \u CDS
    R3TR-IWSV
    obj)的实际SAP网关服务对象
  • 名为
    \u MDL
    R3TR-IWMO
    obj)的SAP网关模型
  • 名为
    \u CDS\u VAN
    R3TR-IWVB
    obj)的注释模型

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

    演示如何在BOPF节点上定义验证。一般来说,它应该会起作用。我这样做了。谢谢