SAPFiori注解是SAPFioriABAPProgrammingModel的重要概念之一。SAPFiori的ABAP编程模型可用于SAPNetWeaverASforABAP7.51创新包SP00或更高版本。对底层数据库没有要求,推荐使用SAPHANA。开发人员需要具有以下PFCG角色:SAP_BC_DWB_ABAPDEVELOPERSAP_BC_DWB_WBDISPLAY/IWFND/RT_DEVELOPER(用于SAPGateway服务开发)。架构如下:作为SAP客户,在某些情况下,您可能希望扩展SAP或SAP合作伙伴交付的On-Premise应用程序的用户界面(UI)。字段可扩展性(FioriExtensibility)是指客户希望在给定的业务应用上下文中提供额外的字段,这由实际使用的UI表示。在SAP交付时,应用程序未预见到这些字段。在这种情况下,可以选择使用ABAP平台的可扩展基础架构,以便将自定义字段添加到原始应用程序。此基础架构首先需要确保将新数据元素添加到持久性(数据库表)和其间所有涉及的层(ABAP字典、CDS、SAP网关服务)。基础设施还需要再次暴露给应用程序UI的服务元数据,以供其他消费者使用。此基础架构可用于不同的场景:关键用户可扩展性:只有可配置的扩展才有意义,因为它们用于业务高级用户(关键用户)适应上下文。自定义代码可扩展性-您希望通过自定义代码以编程方式实现您自己的扩展,从而最大限度地提高此基础设施的现场可扩展性。如果为SAP应用程序启用了可扩展性,则关键用户可扩展性允许关键用户创建自定义字段。关键用户有业务视角,不需要关心技术细节。因此,关键用户最终能够创建和更改自定义字段及其属性(名称、标签、类型或在屏幕上的位置)。如果SAP应用程序启用了可扩展性,则最好使用关键用户工具来创建自定义字段,即使作为开发人员也是如此,因为关键用户工具隐藏了SAP应用程序的技术细节。另一方面,SAP建议在以下情况下使用扩展视图直接创建自定义字段:SAP应用程序未启用扩展性关键用户工具功能不足。例如,想在自定义字段中进行计算。我们必须记住,自定义代码可扩展性需要在整个开发周期中添加代码以实现扩展。这反过来又需要对最初作为CDS视图交付并作为OData服务发布以供进一步使用的数据模型进行扩展。在SAP官网的ABAPProgrammingModelforFiori帮助文档中,定义了很多注解:对于这些注解,我们可以从字面意思和SAP帮助文档中掌握它们的用法和作用。以@ObjectModel.readOnly为例,应用该注解的CDS视图字段在相应的FioriUI上以只读方式呈现:无法通过编程方式修改。当你使用这些注解的时候,你有没有想过它们是如何工作的?以@ObjectModel.readOnly为例,现在请跟随笔者一起探究其前后端实现原理。在Chrome开发者工具的UI5面板中,找到PostingDate控件对应的属性,发现该字段editable属性值为false,这也是无法在UI中编辑的原因。由于后台模型是CDS视图,前台UI显然是基于FioriElements的。我想知道发布日期控件的可编辑属性何时设置为false。在SmartField.setEditable函数中设置断点,重新打开FioriUI,点击Edit进入编辑模式,断点触发。从调用栈可以看出,当有代码调用SmartField.setEditable时,传入参数为false。那么这个false是怎么算出来的呢?顺着当前的调用栈走到外层,找到一个重要的函数:AnnotationHelper.canUpdateProperty。从函数名可以猜到,这个函数负责计算一个控件的属性是否允许更新(Update)。作品的上下文就是注解(Annotation)。这个方法实现体的语义也很清楚。如果后台模型字段sap:updatable设置为false,canUpdateProperty函数调用返回false,导致SmartField.setEditable使用参数false渲染FioriUI。我们打开OData服务的元数据,发现postingdate字段对应的sap:updatable确实是false。至此,FioriUI的工作原理分析完毕。我们再来看看背景。我只在我的CDS视图中将@ObjectModel.readOnly添加到true而不是sap:updatable。显然,两者之间存在一定的关系。839行的IF判断,如果OBJECTMODEL.READONLY为真,则read_only属性为X。而read_only属性为真,会导致在发布日期字段的属性集合表中新增一条read_onlyX的记录:最后,在SADL框架的属性检测逻辑中,一旦发现字段属性集内表中有read_only值为X的属性,则将lv_creatable和lv_updatable设置为false。SADL框架计算出的两个boolean变量为false,最后将sap:creatable和sap:updatable设置为false。@ObjectModel.readOnly属性的前后端工作原理之谜至此揭晓,但这只是SAPFiori编程模型众多注解的冰山一角。总结本文首先概述了SAPFiori的ABAP编程模型的定义,然后以该编程模型中的一个重要注解@ObjectModel.readOnly为例,介绍CDS注解与ABAP后台协同的技术细节。
