我已经在本地程序包中创建了一个自定义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更新实体时,不会调用此验证。
答案 0 :(得分:1)
您通过注释@OData.publish: true
创建了OData服务。
这对于简单的服务很方便,但是便利性是在灵活性之间进行权衡的。
在您的情况下,我将在Gateway Builder(事务SEGW)中创建一个项目,并将CDS视图用作引用的数据源,这样您就可以利用CDS功能进行读取操作,并使用自定义逻辑。
看看this博客
答案 1 :(得分:0)
不可能。
@OData.publish:true
有其局限性,无法增强逻辑就是其中之一。
考虑下图,该图显示了创建OData服务的不同方法之间的区别:
在基于注释的OData服务发布期间,创建了以下对象:
<CDS_VIEW_NAME>_CDS
(R3TR IWSV
obj)的实际SAP Gateway服务对象<CDS_VIEW_NAME>_MDL
(R3TR IWMO
obj)的SAP Gateway模型<CDS_VIEW_NAME>_CDS_VAN
(R3TR IWVB
obj)的注释模型因此不会创建DPC / MPC_EXT类,如果需要重新定义OData方法,则必须创建SEGW项目并将CDS添加为数据源。