SAP Restful ABAP Programming 编程模型的 Action 实现和云端调试介绍
作者:互联网
笔者之前的文章如何使用 Restful ABAP Programming 编程模型开发一个支持增删改查的 Fiori 应用,已经对 SAP Restful ABAP Programming 编程模型(以下简称 RAP)进行了一个最基本的介绍。
我们简单回顾一下之前文章的内容:在SAP云平台ABAP编程环境里创建了一个Z表,然后基于这张自定义数据库表创建了CDS view,基于该view创建Service Definition,把view暴露成服务,然后通过Behavior Definition实现对Z表的增删改查。
双击Service Binding里的TravelProcessor或者右键菜单里选择Open Fiori Elements App Preview, 就可以访问Fiori应用。
稍稍有点经验的 SAP 顾问朋友们都明白,一个模型只有增删改查的功能是不能满足客户实际需求的。在SAP Cloud for Customer里,开发顾问可以在Cloud Application Studio里创建beforeSave和afterModify这些脚本文件并实现业务逻辑,笔者也曾经介绍过,它们相当于S/4HANA BOPF框架里创建的determination.
除了上述在运行时特定的时间点才能触发(beforeSave,afterModify)的逻辑外,Action机制则提供了自由度更高的业务逻辑编写机制。体现在UI上,Action逻辑一般通过UI按钮触发。
Validation比较容易理解——自定义的数据校验逻辑。
本文按照顺序介绍 RAP 的 Action和Validation.
为了介绍在Restful ABAP Programming模型下如何开发Action,我们在前一篇文章创建的SFLIGHT表增添一个表示航班预订状态的字段,并开发一个Action,当其被调用时,修改这个状态。
(1)在数据库表里增添一个OVERALL_STATUS字段:
当然在对应的CDS view上也要通过 @UI
相关的注解把这个字段配置到UI上。通过注解lineItem和identification分别把view的这个字段显示在搜索结果的table控件和航班信息明细页面的字段上。通过label指定UI上显示的标签,通过注解的dataAction把这个状态字段绑定到一个名为acceptTravel的Action上。
重新激活CDS view后,我们就能在工具栏上看到CDS view里通过label维护的标签文本为Accept Travel了:
因为缺乏实现,此时点击无效果。
(2) 在Behavior Definition的声明部分,添加如下三行代码:
action ( features: instance ) acceptTravel result [1] $self;
validation validateCustomer on save { field customer_id; }
validation validateDates on save { field begin_date, end_date;
上面的代码除了定义一个Action外,还声明了两个Validation,在特定字段发生变化并保存时触发校验逻辑,字段名称维护在大括号内。
剩下的就是ABAP编程实现了。在Behavior Definition的ABAP实现类里,声明下面这些ABAP类方法,来实现Behavior Definition里的定义。
首先看Action的实现,位于ABAP方法SET_STATUS_COMPLETED里:
将输入参数travel_id指定的航班预订记录的状态字段置为A - Accepted.
现在我选中ID为22这条记录,点击Accept Travel按钮:
点击之后,状态成功被置为A了:
再来加上对航班日期的校验:如果航班结束日期在起始日期之前,显然不合理,需要弹一条错误消息。
第87行到第91行把输入参数包含的航班信息读到内表lt_travel_result里,然后第95行把结束日期和起始日期做比较,如果后者早于前者,进入97行开始的IF分支,弹一个错误信息到UI.
错误信息仍然和传统的ABAP编程一样,通过ABAP Message类定义:
现在把结束日期维护成起始日期之前,保存的时候就看到了期望的错误消息:
至此,我们这个SFLIGHT模型除了增删改查之外,又增添了Action和Validation的功能。
应用开发完成后,我们就可以开始调试了。
我选中ID为103这条记录,点击Accept Travel按钮后,期望通过该Action将其状态设置为Accepted:
不幸的是,我没能看到期望中的状态变化,而是下面这个所有ABAP编程人员都不愿意看见的ABAP运行时错误提示界面。
不过,大家注意到了上图右下角的Debug超链接么?和SAPGUI一样,点击之后立即就能打开调试器,能够观察发生这个运行时错误的调用栈,引起错误的详细代码位置和相关变量的值。
回到ABAP Development Tool里,我们先点击Show超链接,就可以看到运行时错误明细:Short Text告诉我们,我们点击Accept按钮后,相关的处理框架有意地抛出一个CX_CSP_ACT_RESPONSE的异常。抛出异常的位置是在程序CL_CSP_ACT_CHECK_FEATS_ACTIONS里,这暗示我们,这个错可能和Action执行前的检查(CHECK)有关。
继续向下滑动鼠标,发现在框架代码内,因为从第353行内表it_feature_result里没有读出任何内容,因此sy-subrc不为0,导致进入第355行的RAISE SHORTDUMP分支。
在SAP Cloud Platform ABAP环境下当前登录用户发生的所有运行时错误,可以在ABAP Development Tool的Feed Reader视图下查看,这个功能相当于SAP GUI里的ST22事务码。
现在我们关于这个运行时错误的静态信息了解得差不多了,下一步在调试器里观察。
重新启动Fiori应用,再次点击Accept按钮,出现运行时错误后点击Debug超链接,ABAP调试器自动弹出,引起运行时错误的那一行代码被高亮,同时左边显示出调用栈。
把鼠标放在it_feature_result上,发现这个内表是空的,当然无法从里面读出数据了。这个内表是当前ABAP类CL_CSP_ACT_CHECK_FEATS_ACTIONS的方法handle_rejected_instances的输入参数,需要搞清楚为啥这个输入参数为空。
从抛出运行时异常的栈帧往外看一帧,就知道这个输入的内表是通过第291行的execute_feature_controllers生成的,这个方法会通过回调函数的方式,调用我们在Behavior Definition实现的一个get_features方法里:
这里我们就找到了引起这个运行时错误的根源:因为之前笔者出于测试目的,注释了一段代码,导致get_features被框架回调时,没有返回框架期望的数据:
当Jerry把这段需要的代码重新enable然后设置断点,点击Accept按钮,通过调用栈可以清晰看到框架的execute_feature_controllers是如何调用到我们实现的get_features回调方法的。
总结
本文首先在一个支持增删改查四种基础操作的 RAP 应用上,增添了 Action 和 Validation 实现,二者都是云端 ABAP 编程环境里进行业务逻辑编写的重要手段。其次介绍了云端 ABAP 编程环境中进行开发的必备技巧,即代码的单步调试。
标签:编程,Programming,点击,ABAP,Action,SAP,view 来源: https://www.cnblogs.com/sap-jerry/p/16347978.html