大家好,
在这个博客中,我们将通过一个例子来详细了解新的编程模型RAP,我建议在开始编写RAP之前也先学习一下这个理论,以了解RAP的基本知识。我要特别感谢SAP的同事Kailash Satapathy和Gaurav Kumar帮助我写这个博客。
前提条件:
概念核心数据服务(CDS)和注释。
让我们开始
RESTful ABAP编程模型(RAP):选择RESTful ABAP编程模型(RAP)一词是为了反映其面向"无状态"REST体系结构的方向。
我们将从ABAP多年来的演变开始:–
ABAP编程模型的演变
我们启动了我们的ABAP世界通过使用报表和模块池程序的经典ABAP编程,然后我们转向使用FPM的BSP/Webdynpro(用于UI协调),然后慢慢地从ERP风格的开发转向S/4 HANA模型开发,其中我们的主要编程包括CD、BOPF、,GW和Fiori.
SAP Fiori的ABAP编程模型(当前最佳实践):–
此开发模型通常由CDS视图组成,BOPF和GW,其中CDS与BOPF和GW紧密耦合(使用RDS映射或@OData.发布注).
注:此模型的问题是流没有很好的定义
未来方向-新的编程模型(ABAP Restful编程模型)
Restful ABAP编程模型详细说明:–
ABAP Restful编程模型定义了在SAP云平台ABAP环境中高效端到端开发本质上SAP HANA优化的OData服务(如Fiori应用程序)的体系结构。它支持所有类型的Fiori应用程序以及A2X服务的开发。它基于一些技术和框架,例如用于定义语义丰富的数据模型的核心数据服务(CDS)和用于创建OData服务(绑定到OData协议)的服务模型基础设施,以及用于自定义逻辑和基于SAPUI5的用户界面的基于ABAP的应用程序服务,如图所示下面
理解概念
业务对象(BO)是一个通用术语,用于表示企业应用程序开发中的真实工件,如产品、旅行或销售订单。一般来说,一个业务对象包含多个节点,如项目和公共事务操作,如创建、更新和删除数据,以及附加的特定于应用程序的操作,如SalesOrder业务对象中的批准,一种行为对应的运行时实现。
详见图。
1.1业务对象的结构
从结构上看,返利啦,业务对象由一棵节点树(SalesOrder、Items、ScheduleLines)组成,节点通过一种特殊的关联(compositions)进行链接。构图是定义整体-部分关系的特殊关联。复合零件仅与其父实体(整体)一起存在。
此复合树的每个节点都是用CDS实体建模的元素。根实体特别重要:在CDS数据定义的源代码中使用关键字root考虑到了这一点。根实体作为业务对象的表示,定义了业务对象结构中的顶层节点
1.2业务对象的行为
业务对象的每个实体都可以提供标准的CUD操作create()、update()和delete()。此外,每个实体还可以提供具有专用输入和输出结构的特定操作,这些结构称为操作。提供的CUD操作、动作以及一些与行为相关的属性,例如父实体和子实体之间的锁依赖关系,都在行为定义工件中定义。
行为定义总是指CDS数据模型。如下图所示,行为定义直接依赖于CDS根实体。一个行为定义正好指一个根实体,一个CDS根实体最多有一个行为定义(0..1关系),它也处理所有包含的子实体
1.3业务对象的运行时实现
业务对象运行时主要由两部分组成:第一部分是交互阶段,其中使用者调用业务对象操作来更改数据并读取实例(无论是否进行事务性更改)。业务对象运行时将更改保存在其内部事务缓冲区中,该缓冲区表示实例数据的状态。业务对象始终需要此事务缓冲区。在执行所有更改之后,可以持久化数据。这是通过保存序列来实现的。
业务对象运行时详细说明
交互阶段有不同的步骤,我们将其分离为修改、读取和锁定。Save sequence phase将有finalize、保存前检查、调整编号和保存等步骤。
实现可分为非托管、托管和带保存管理。
当前支持的实现为非托管。使用save实现进行管理和管理将在未来的版本中出现。
ABAP开发平台可以扮演服务提供者和服务使用者的角色,例如SAP Fiori UI客户端。
在ABAP RESTful编程模型的上下文中,业务服务是RESTful服务,消费者可以调用它。它是通过公开数据模型和行为模型来定义的。它由服务定义和服务绑定组成,如下图所示:–
服务定义是要公开的数据模型和相关行为的投影,而服务绑定实现特定的协议和要为使用者提供的服务类型。这种分离允许数据模型和服务定义集成到各种协议中,而无需任何重新实现。
2.1服务定义
服务定义表示通常从基于CDS的底层数据模型派生的服务模型。
示例:-
定义服务定义名称
{
公开cds_entity_1[作为别名_1];
EXPOSE cds_entity_2[作为别名_2];
EXPOSE…
EXPOSE cds_entity_m[作为别名_m];
}
2.2服务绑定
业务服务绑定(缩写:服务绑定)是一个ABAP存储库对象,用于将服务定义绑定到OData等客户机-服务器通信协议。
数据模型、服务定义和服务绑定之间的关系
让我们用CRUD示例学习RAP。
这里我们将以销售订单积垢为例。
为测试目的,我已经创建了销售订单头表–ZSSK\U VBAK和销售订单项目表–ZSSK\U VBAP
ZSSK\U VBAK
ZSSK\U VBAP
我们在这里有3个步骤要实现。
这里我们将使用组合和与子节点的关联为业务对象创建CDS视图。
销售订单头CDS视图的代码片段:–
@AbapCatalog.sqlview名称:'ZSSKSOHDR'
@AbapCatalog.compiler.compareFilter比较过滤器:正确
@AbapCatalog.preserveKey:正确
@访问控制.授权检查:#不需要
@EndUserText.label文件:'销售订单表头'
@UI:{
表头信息:{
类型名称:'销售订单',
类型名称复数:'销售订单',
标题:{类型:#标准,value:'vbeln'}
}
}
@ObjectModel.semanticKey对象模型:['vbeln']
@ObjectModel.representativeKey:'vbeln'
将根视图Zssk\u SoHeader定义为select from Zssk\u vbak as SoHeader
将Zssk\u SoItem的组成[0..*]定义为
{
@用户界面.facet:[
{
id:'通用数据',trustdata大数据,
类型:#集合,
位置:10,
label:'销售订单表头'
},
{
type:#FIELDGROUP|参考,
position:10,大数据如何处理,
targetQualifier:'GeneralData1',
parentId:'GeneralData',
isSummary:true,
isPartOfPreview:true
},
{
type:#FIELDGROUP|参考,
position:20,
targetQualifier:'GeneralData2',
parentId:'GeneralData',
isSummary:true,
isPartOfPreview:true
},
{
id:'SOItem',
目的:#标准,
类型:#行项目|参考,
标签:'Sales Order Item',
位置:10,
目标元素:'SOItem'
}
]
@UI:{
行项目:[{位置:10,重要性:#高}],
选择字段:[{位置:10}],
字段组:[{限定符:'GeneralData1',位置:10,重要性:#高}]
}
键SOHeader.vbeln文件,
@UI:{
行项:[{position:20,importance:#HIGH}],
选择字段:[{position:20}],
字段组:[{限定符:'GeneralData2',position:10,importance:#HIGH}]
}
SOHeader.erdat公司,
@UI:{
行项目:[{位置:30,重要性:#高}],
字段组:[{限定符:'GeneralData2',位置:20,重要性:#高}]
}
SOHeader.ernam公司,
@UI:{
行项:[{位置:40,重要性:#高}],
字段组:[{限定符:'GeneralData1',位置:20,重要性:#高}]
}
SOHeader.vkorg文件,大数据分析,
@UI:{
行项目:[{位置:50,重要性:#高}],
字段组:[{限定符:'GeneralData1',位置:30,重要性:#高}]
}
SOHeader.vtweg文件,
@UI:{
行项:[{位置:60,重要性:#高}],
字段组:[{限定符:'GeneralData1',位置:40,重要性:#高}]
}
SOHeader.spart公司,
//UI中的动作集收藏夹
@UI.lineItem:[{键入:#对于#操作,dataAction:'set\u favorite',label:'set favorite},
{位置:15,物联,重要性:#高}]
@EndUserText.label文件:"最爱"
SOHeader.favorite公司,
SOHeader.lastchangedby最后更改者,
SOHeader.lastchangedat,
/*关联*/
项目
}
销售订单项目CDS视图代码截取器:-
@AbapCatalog.sqlview名称:'ZSSKSOITM'
@AbapCatalog.compiler.compareFilter比较过滤器:正确
@AbapCatalog.preserveKey:正确
@访问控制.授权检查:#检查
@EndUserText.label文件:'销售订单项目'
@ObjectModel.representativeKey:["vbeln","posnr"]
将视图Zssk\u SoItem定义为select from Zssk\u vbap as SoItem
与父Zssk\u SoHeader的关联为\u SoHeader on(
$投影.vbeln= _SOHeader.vbeln文件
)
{
@用户界面.facet:[
{类型:#集合,位置:10,id:'SoItem',标签:'Sal