当前位置: 首页 > Web前端 > JavaScript

SAP Restful ABAP Programming 编程模型的 Action 实现和云端调试介绍

时间:2023-03-27 17:17:39 JavaScript

SAPRestfulABAP编程模型的Action实现和云端调试介绍给出了基本介绍。简单回顾一下上一篇文章的内容:在SAP云平台的ABAP编程环境中创建一个Z表,然后基于这个自定义数据库表创建CDS视图,基于视图创建ServiceDefinition,将视图暴露为一个服务,然后通过BehaviorDefinition实现对Z表的增删改查。在ServiceBinding中双击TravelProcessor或在右键菜单中选择OpenFioriElementsAppPreview,即可访问Fiori应用。稍有经验的SAP顾问都明白,只有增删改查功能的模型是不能满足客户实际需求的。在SAPCloudforCustomer中,开发顾问可以在CloudApplicationStudio中创建beforeSave、afterModify等脚本文件,实现业务逻辑。作者也介绍过它们相当于S/4HANABOPF框架中创建的判断。除了上述运行中只能在特定时间点触发的逻辑(beforeSave,afterModify)之外,Action机制提供了一种具有更高自由度的业务逻辑编写机制。反映到UI上,Action逻辑一般由UI按钮触发。验证更容易理解——自定义数据验证逻辑。本文依次介绍RAP的Action和Validation。为了介绍如何在RestfulABAP编程模式下开发Action,我们在上一篇创建的SFLIGHT表中增加了一个字段来表示航班预订状态,开发了一个Action。当它被调用时,修改这个状态。(1)在数据库表中增加一个OVERALL_STATUS字段:当然在对应的CDS视图上,这个字段也必须通过@UI相关的注解在UI上进行配置。通过注解lineItem和identification,该视野分别显示在搜索结果的表格控件和航班信息详情页的字段上。通过label指定显示在UI上的label,通过注解的dataAction将这个status字段绑定到一个名为acceptTravel的Action上。重新激活CDS视图后,我们可以在工具栏上看到CDS视图中标签维护的标签文本为AcceptTravel:因为没有实现,此时点击是没有效果的。(2)在BehaviorDefinition的声明部分,添加如下三行代码:action(features:instance)acceptTravelresult[1]$self;validationvalidateCustomeronsave{fieldcustomer_id;}validationvalidateDatesonsave{fieldbegin_date,end_date;上面的代码除了定义了一个Action之外,还声明了两个Validations,当特定的字段被更改和保存时触发验证逻辑,字段名用大括号维护。剩下的就是ABAP编程实现。在BehaviorDefinition的ABAP实现类中,声明如下ABAP类方法来实现BehaviorDefinition中的定义。先看Action的实现,位于ABAP方法SET_STATUS_COMPLETED:将入参travel_id指定的航班预订记录的status字段设置为A-Accepted。现在我选择ID为22的记录,点击AcceptTravel按钮:点击后,状态为成功设置为A:添加航班日期的检查:如果航班结束日期在开始日期之前,显然是不合理,需要播放错误信息。第87到91行将输入参数中包含的航班信息读取到内部表lt_travel_result中,然后第95行将结束日期与开始日期进行比较。如果后者早于前者,则进入从第97行开始的IF分支。向UI播放错误信息。报错信息还是和传统ABAP编程一样,通过ABAPMessage类定义:现在结束日期保持在开始日期之前,保存时看到预期的报错信息:至此,我们的SFLIGHT除了添加、删除、修改和检查模型,增加了Action和Validation的功能。应用开发完成后,我们就可以开始调试了。我选择了ID为103的记录,点击AcceptTravel按钮后,我希望通过Action将其状态设置为Accepted:不幸的是,我没有看到预期的状态变化,但是下面所有ABAP程序员的ABAP运行时错误提示你不想看到的界面。不过,大家注意到上图右下角的Debug超链接了吗?和SAPGUI一样,点击后可以立即打开调试器,可以观察到这个运行时错误发生的调用栈,具体导致错误的代码位置和相关变量的值。回到ABAPDevelopmentTool,我们先点击Show超链接,查看运行时错误详情:ShortText告诉我们,点击Accept按钮后,相关处理框架有意抛出CX_CSP_ACT_RESPONSE异常。抛出异常的位置在程序CL_CSP_ACT_CHECK_FEATS_ACTIONS中,暗示这个错误可能与Action执行前的检查(CHECK)有关。继续向下滑动鼠标,发现在框架代码中,由于没有从第353行的it_feature_result表中读取任何内容,sy-subrc不为0,导致第355行出现RAISESHORTDUMP分支。当前在SAPCloudPlatformABAP环境中登录的用户可以在ABAP开发工具的订阅源阅读器视图中查看。该功能相当于SAPGUI中的ST22事务码。现在我们知道了关于这个运行时错误的静态信息,下一步就是在调试器中观察它。重启Fiori应用,再次点击Accept按钮,出现运行错误后点击Debug超链接,会自动弹出ABAP调试器,导致运行错误的代码行高亮显示,左侧显示调用堆栈.把鼠标放在it_feature_result上,发现内表是空的,当然是不能从里面读取数据的。这个内表是当前ABAP类CL_CSP_ACT_CHECK_FEATS_ACTIONS的handle_rejected_instances方法的入参。需要弄清楚这个入参为什么为空。从抛出运行时异常的stackframe看一帧,就知道input内表是由291行的execute_feature_controllers生成的,这个方法会通过回调函数调用我们在BehaviorDefinition中实现的一个get_features方法。Li:这里我们找到了这个运行时错误的根本原因:因为作者出于测试目的注释掉了一段代码,当get_features被框架回调时,并没有返回框架期望的数据:当Jerryput将这段需要的代码重新启用,然后设置断点,点击接受按钮,可以清楚的看到框架的execute_feature_controllers是如何通过调用栈调用我们实现的get_features回调方法的。总结本文首先为一个支持增删改查四种基本操作的RAP应用添加了Action和Validation的实现。两者都是在云ABAP编程环境下编写业务逻辑的重要手段。其次,介绍了在云端ABAP编程环境下进行开发的必备技能,即代码的单步调试。