1

我在本地包中创建了一个自定义 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 更新实体时,不会调用此验证。

4

2 回答 2

1

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

看看这个博客

于 2019-03-22T10:39:49.563 回答
0

这不可能。

@OData.publish:true有其局限性和不可能增强逻辑就是其中之一。

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

在此处输入图像描述

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

  1. <CDS_VIEW_NAME>_CDS名为( R3TR IWSVobj)的实际 SAP 网关服务对象
  2. <CDS_VIEW_NAME>_MDL名为( R3TR IWMOobj)的 SAP 网关模型
  3. <CDS_VIEW_NAME>_CDS_VAN一个名为( R3TR IWVBobj)的注释模型

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

于 2020-06-29T09:10:29.257 回答