千家信息网

怎么用Restful ABAP Programming模型开Fiori应用

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇内容介绍了"怎么用Restful ABAP Programming模型开Fiori应用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况
千家信息网最后更新 2026年10月31日怎么用Restful ABAP Programming模型开Fiori应用

本篇内容介绍了"怎么用Restful ABAP Programming模型开Fiori应用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Jerry的通过CDS view + Smart Template 开发Fiori应用的blog合集。

ABAP在不断向前进化,如今我们有了新的编程模型:Restful ABAP Programming模型,简称为RAP模型。该模型定义了一套架构体系,应用开发人员能够凭借其来高效地进行应用的端到端开发,这种应用具有与生俱来的Restful特质,能充分利用HANA平台的强大计算能力,支持云环境和Fiori UX。

RAP模型的三大支柱:

  • Business Service

  • Core Data Service

  • Behavior Definition

下面请跟着Jerry一起,通过一个实际的例子,了解一下这种全新的通过Restful ABAP Programming模型进行Fiori应用开发的步骤吧。

Jerry还是沿用传统ABAP On-Premises编程培训教材里使用过的经典的SFLIGHT模型来作为底层数据库存储。

(1)首先创建一个数据库表ZTRAVEL_JERRY:(如果想复制这段源代码,请点击文末的"阅读原文"获得)

@EndUserText.label : 'Database table for travel data XXX'@AbapCatalog.enhancementCategory : #NOT_EXTENSIBLE@AbapCatalog.tableCategory : #TRANSPARENT@AbapCatalog.deliveryClass : #A@AbapCatalog.dataMaintenance : #LIMITEDdefine table ztravel_jerry {  key client      : abap.clnt not null;  key travel_id   : /dmo/travel_id not null;  agency_id       : /dmo/agency_id;  customer_id     : /dmo/customer_id;  begin_date      : /dmo/begin_date;  end_date        : /dmo/end_date;  @Semantics.amount.currencyCode : 'ztravel_jerry.currency_code'  booking_fee     : /dmo/booking_fee;  @Semantics.amount.currencyCode : 'ztravel_jerry.currency_code'  total_price     : /dmo/total_price;  currency_code   : /dmo/currency_code;  description     : /dmo/description;  created_by      : syuname;  created_at      : timestampl;  last_changed_by : syuname;  last_changed_at : timestampl;}

因为我们在ABAP Development Tools里无法用事务码SE16手动往这张表里插入数据,所以我创建一个ABAP类,用ABAP代码往这个表里插入三条数据。

按F9执行这个ABAP类,然后看到三条数据成功插入了:

(2) 我们最终的目的是创建一个支持对这张表进行增删改查的Fiori应用,而Restful ABAP Programming模型的三大支柱之一为Core Data Service,因此我们首先得有基于数据库表ZTRAVEL_JERRY的CDS view.

所以我首先创建一个CDS view:

@AbapCatalog.sqlViewName: 'ZVI_TRAVEL'@AbapCatalog.compiler.compareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'Travel data - XXX'define root view ZI_TRAVEL_JERRY as select from ztravel_jerry as Travel /* Associations */ association [0..1] to /DMO/I_Agency   as _Agency   on $projection.agency_id = _Agency.AgencyID association [0..1] to /DMO/I_Customer as _Customer on $projection.customer_id = _Customer.CustomerID association [0..1] to I_Currency      as _Currency on $projection.currency_code = _Currency.Currency {  key travel_id,     agency_id,     customer_id,     begin_date,     end_date,     @Semantics.amount.currencyCode: 'currency_code'     booking_fee,     @Semantics.amount.currencyCode: 'currency_code'     total_price,     @Semantics.currencyCode: true     currency_code,     description,/*-- Admin data --*/     @Semantics.user.createdBy: true     created_by,     @Semantics.systemDateTime.createdAt: true     created_at,     @Semantics.user.lastChangedBy: true     last_changed_by,     @Semantics.systemDateTime.lastChangedAt: true     last_changed_at,     /* Public associations */     _Agency,     _Customer,     _Currency}

然后创建一个projection view,将该view的字段有选择性地暴露出来。

@EndUserText.label: 'Travel projection view - Processor'@AccessControl.authorizationCheck: #NOT_REQUIRED@UI: { headerInfo: { typeName: 'Travel', typeNamePlural: 'Travels', title: { type: #STANDARD, value: 'TravelID' } } }@Search.searchable: truedefine root view entity ZC_TRAVEL_JERRY as projection on ZI_TRAVEL_JERRY { @UI.facet: [ { id:              'Travel',                purpose:         #STANDARD,                type:            #IDENTIFICATION_REFERENCE,                label:           'Travel',                position:        10 } ] @UI: {     lineItem:       [ { position: 10, importance: #HIGH } ],     identification: [ { position: 10, label: 'Travel ID [1,...,99999999]' } ] } @Search.defaultSearchElement: true key travel_id          as TravelID, @UI: {     lineItem:       [ { position: 20, importance: #HIGH } ],     identification: [ { position: 20 } ],     selectionField: [ { position: 20 } ] } @Consumption.valueHelpDefinition: [{ entity : {name: '/DMO/I_Agency', element: 'AgencyID'  } }] @ObjectModel.text.element: ['AgencyName'] ----meaning? @Search.defaultSearchElement: true agency_id          as AgencyID, _Agency.Name       as AgencyName, @UI: {     lineItem:       [ { position: 30, importance: #HIGH } ],     identification: [ { position: 30 } ],     selectionField: [ { position: 30 } ] } @Consumption.valueHelpDefinition: [{ entity : {name: '/DMO/I_Customer', element: 'CustomerID'  } }] @ObjectModel.text.element: ['CustomerName'] @Search.defaultSearchElement: true customer_id        as CustomerID, @UI.hidden: true _Customer.LastName as CustomerName, @UI: {     lineItem:       [ { position: 40, importance: #MEDIUM } ],     identification: [ { position: 40 } ] } begin_date         as BeginDate, @UI: {     lineItem:       [ { position: 41, importance: #MEDIUM } ],     identification: [ { position: 41 } ] } end_date           as EndDate, @UI: {     lineItem:       [ { position: 50, importance: #MEDIUM } ],     identification: [ { position: 50, label: 'Total Price' } ] } @Semantics.amount.currencyCode: 'CurrencyCode' total_price        as TotalPrice, @Consumption.valueHelpDefinition: [{entity: {name: 'I_Currency', element: 'Currency' }}] currency_code      as CurrencyCode, @UI.identification: [ { position: 60, label: 'Remarks' } ] description as Description, @UI.hidden: true last_changed_at    as LastChangedAt }

大家可以注意到,这个projection view里包含了很多@UI注解,作用和Fiori Elements一样,作为元数据,告诉对应的渲染框架,运行时这些字段应该以什么样的方式渲染在Fiori UI上。

(3) 现在三大支柱之一的Core Data Service已经就位了,接下来我们基于前一步得到的projection view创建Business Service. 选中projection view,右键选择New Service Definition:

这个服务定义的第一条记录,就是通过ABAP expose关键字把projection view ZC_TRAVEL_JERRY暴露出来,模型名称为TravelProcessor:

@EndUserText.label: 'Service Defintion for ZC_Travel_JERRY'define service ZUI_C_TRAVEL_JERRY {  expose ZC_TRAVEL_JERRY as TravelProcessor;  expose /DMO/I_Customer as Passenger;  expose /DMO/I_Agency as TravelAgency;  expose /DMO/I_Airport as Airport;  expose I_Currency as Currency;  expose I_Country as Country;}

然后基于这个Service Definition创建一个Service Binding,可以简单把Service Binding理解成Service Definition的一个实例:

Service Binding创建完毕后,点击Activate激活:

之前Service Definition里用expose关键字暴露并指定成的模型TravelProcessor此时就可见了,双击:

双击后会自动打开一个链接,一个Fiori应用就呈现在我们眼前了。我们没有进行一行的JavaScript web编程,就得到了一个专业的支持高级搜索的Fiori应用,能查看底层数据库表ZTRAVEL_JERRY的内容。

(4) 至此我们已经了解了Restful ABAP Programming模型的前两大支柱,还剩下Behavior Definition. 既然RAP的口号是打造具有Restful特性的应用,但到目前为止我们还没有感受到RAP对Restful的支持,这有待Behavior Definition来完成。

选中之前创建的CDS view,创建一个新的Behavior Definition:

实现类型指定为Managed:

我们可以看到这个Behavior Definition的定义里,又多了一些新的ABAP关键字。这个Behavior Definition负责定义底层模型的Transaction Behavior,即代码第18到20行的create,update,delete.

当然增删改查的功能光定义不行,还得创建其对应的实现。上图Definition中已经指定了实现这些行为的ABAP类名称为ZCL_BP_I_TRAVEL_M_JERRY. 为此,右键选择New Behavior Implementation:

创建这个特殊的ABAP实现类:

这个实现类里面也不需要开发人员手动编写代码来完成对底层数据库表的增删改查操作--既然能称之为一个编程模型,那么这些通用的功能都通过框架类CL_ABAP_BEHAVIOR_HANDLER统一完成了,应用开发人员只需要定义一个对该类的声明即可。

把这一步创建好的Behavior Definition模型和其实现全部激活,然后回到我们之前浏览器里打开的Fiori应用,刷新,会发现多了Create和Delete两个按钮,这意味着该应用对创建和删除的支持也已经自动可用了。

"怎么用Restful ABAP Programming模型开Fiori应用"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

模型 应用 数据 开发 数据库 支持 底层 支柱 编程 三大 人员 代码 关键 关键字 内容 应用开发 选择 接下来 功能 字段 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 深圳市人人互联网科技有限公司 山东特亿宝互联网科技有限公司 互联网科技工作委员会副主任毛军 科技平台互联网 互联网医疗科技 互联网与新科技 小马过河互联网科技 互联网金融科技公司干啥的 互联网科技项目计划书材料类 苏州五指互联网络科技有限 互联网科技革命什么开始 南通创西澳互联网科技有限公司 广州千川互联网科技有限公司 云南省自由互联网科技有限公司 陕西云淼互联网科技公司 福建互联网展示科技馆设计 吉林省码上互联网科技电话 互联网科技接地气 艺电能源互联网科技有限公司招聘 美国五大互联网科技公司市值多少 互联网科技ppt模板 互联网 新科技 大白互联网科技 科技赋能互联网健康 湖南一路畅行互联网科技 区块链结合互联网科技 科技互联网的核心竞争力 广州有谷有贝互联网科技有限公司 广东鹅鹅鹅互联网科技有限公司 北京互联网科技类企业分布
0