今天是2020年2月2日鼠年大年初九,这是Jerry鼠年的第9篇文章,也是汪子熙公众号总共第208篇原创文章。

这几天大家在家一日游的感觉如何?

工作中Jerry的同事曾经问过我一个问题,Fiori界面上这个Adapt UI的按钮,为什么有的系统上有,有的系统上没有?Fiori Key User正是通过点击该按钮,进入Fiori UI的Adaptation模式,从而实现在屏幕上新增扩展字段的目的。

比较下面两个不同系统的截图:


为什么这个Adapt UI按钮,如此神出鬼没,有的系统上有显示,有的没有?

自己动手,丰衣足食。假设你的身边找不到Fiori专家,如何通过自己在系统里调试的方法找到问题的答案呢?

Jerry之前的文章 Jerry的Fiori原创文章合集 ,搜集了很多案例,讲述了如何通过单步调试,去分析和处理Fiori开发工作中的一些常见问题。

现在我们再次通过单步调试的方式来分析这个Adapt UI按钮动态显示与否的逻辑。

首先根据Jerry这篇博客介绍的SAP UI5控件在浏览器端的渲染逻辑的知识,找出是一个ID为sap.ushell.plugins.rta的插件,负责管理该Adapt UI按钮。我个人把rta理解成Run Time Adaptation.

https://blogs.sap.com/?p=133359

这个插件从哪里来呢?在Chrome开发者工具里对sap.ushell.config和sap-ushell-config这组关键字进行全文搜索,找到了下面的代码片段:

由此可见,rta这个插件实例,存储在sap-ushell-config这个全局对象的bootstrapPlugins属性里。

在Adapt UI按钮能够显示的系统上调试,发现全局对象sap-ushell-config的值,来自oServerSideConfig这个JSON对象,而后者的值,是从SAP Fiori Launchpad的html页面里一个硬编码的字符串反序列化而成:

把FioriLaunchpad.html里这个硬编码的字符串拷贝下来:

decode之后,发现其层级结构同我们之前在Chrome开发者工具里观察到的sap-ushell-config全局对象完全一致,说明我们找对地方了。

下一步就是要弄清楚FioriLaunchpad.html里这个硬编码的字符串到底来自何方。标准开发人员一个字符一个字符敲进去的?SAP软件没有这么傻。

SE80打开Fiori Launchpad Shell对应的BSP应用:
/ui2/ushell, 发现字符串的值来自变量:

${SERVER-SIDE-CONFIG}

因此SE80里我们找到的这个FioriLaunchpad.html只是起到一个模板文件的作用,里面第76行出现的${SERVER-SIDE-CONFIG}, 也只是一个占位符,会被运行时该变量的实际值替换,最后就成了我们在Chrome开发者工具里观察到的那个长长的字符串。

那么变量${SERVER-SIDE-CONFIG}的值从哪里来?在BSP应用里查找,发现get_server_side_config_json方法返回的值,注入到该变量里。

所以现在的问题转化为,通过单步调试get_server_side_config_json方法,弄清楚里面的逻辑:

当我单步调试进入该方法时,发现上图第18行lr_data->mt_plugin这个内表里,已经包含了需要返回并注入到变量${SERVER-SIDE-CONFIG}里的当前系统上所有可用的Fiori Launchpad插件实例了,本文关注的sap.rta.plugin也赫然在列。

那么为什么本文开头提到的另一个系统里,没有显示Adapt UI按钮呢?

问题就出在下图第22行的CHECK语句。第18行的mt_plugin内表,存储了当前系统所有可用的Fiori Launchpad插件,每个插件都对应一个catalog ID.

第21行的内表it_catalogs, 存放的是当前登录用户通过分配的PFCG角色所拥有的catalog ID集合。

上图这段代码的语义是,遍历当前系统所有可用的Fiori Launchpad插件,如果其对应的catalog ID,没有出现在登录用户所拥有的catalog ID集合里,那么该插件对于该登录用户来说就是无效的(invalid), 应该将其从Fiori Launchpad上隐藏。

从上图的调试窗口,我得知Run Time Adaptation这个插件对应的catalog ID为/UIF/SAP_RTA_PLUGIN, 然后我到ABAP后台SU01去检查,发现在看不到Adapt UI按钮的那个系统里,我的用户果然没有分配这个catalog. 于是将其分配上去:

问题得以解决,现在Fiori UI里,这个久违的Adapt UI又回来了。

这就是一个实际的“自己动手,丰衣足食”的例子——我通过单步调试,没有求助Fiori专家,也解决了工作中遇到的实际问题。

更多阅读

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

  • SAP Fiori应用的三种部署方式

  • Jerry的Fiori原创文章合集

  • SAP成都C4C小李探花:浅谈Fiori Design Guidelines

  • SAP Fiori + Vue = ?

  • Fiori Fundamentals和SAP UI5 Web Components

  • 30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用

  • SAP Fiori应用索引大全

  • 介绍一种Fiori标准应用的增强方式

  • 揭开SAP Fiori编程模型规范里注解的神秘面纱 - @ObjectModel.readOnly工作原理解析

  • 为什么SAP GUI里的传统事务码能通过Fiori Launchpad启动并运行在浏览器里

  • 一步步把SAP GUI的事务码配置到SAP Fiori Launchpad里

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

SAP Fiori里的Adapt UI按钮,神出鬼没的奥秘相关推荐

  1. SAP Fiori里Contact Support的按钮渲染逻辑

    I was once confused about why I could see "Contact Support" button in error popup window i ...

  2. SAP S/4HANA系统Fiori UI上Adapt UI按钮显示与否的控制逻辑

    I use the same user to log on the same system, however some times the Adapt UI button is available b ...

  3. SAP Fiori Lead应用中Accept按钮显示隐藏的逻辑

    SAP Fiori应用里有的细节,有时候有点让人疑惑. 比如有的Lead明细页面打开之后, footerbar区域只有Edit和Followup两个按钮: 而有的Lead页面, 同样位置的区域,有Ac ...

  4. SAP Fiori里两种锁机制(lock)的实现

    其实标题有点不够准确,ETAG 从严格意义上讲并不是用来锁住一个资源,而是用来避免同一个资源同时被更新造成的彼此覆盖的问题(mid-air collisions). 方法1: ETAG 机制 SAP ...

  5. SAP Fiori里的List是如何做到懒加载Lazy load的

    今天一同事问我这个问题:S/4HANA Fiori应用里的列表,一旦Scroll到底部就会自动向后台发起新的请求把更多的数据读取到前台显示. 以Product Master这个应用为例,我点击搜索之后 ...

  6. SAP Fiori里的manifest.json

    Created by Wang, Jerry, last modified on Nov 13, 2015

  7. SAP Fiori Launchpad shell.handleGoHome() - home按钮的实现

    Created by Wang, Jerry, last modified on Oct 19, 2015

  8. 为什么有的S4系统看不到Adapt UI按钮

    要获取更多Jerry的原创文章,请关注公众号"汪子熙":

  9. S/4HANA Adapt UI按钮的实现逻辑

    要获取更多Jerry的原创文章,请关注公众号"汪子熙":

最新文章

  1. Python案例:使用正则表达式的爬虫
  2. ISME:长期进化实验揭示脱硫弧菌的硝酸盐耐受机制
  3. Unity3D+VR的实现
  4. Tomcat和Jetty对WebSocket的支持
  5. IE6.0、IE7.0 、FireFox 在样式中的不同写法.doc
  6. WTM重磅更新,LayuiAdmin免费用 and more
  7. Windows XP SP3 最终发布日期公布
  8. 并查集——最小连接路径和Kruskal(hdu1301)
  9. 使用fail2ban防止暴力破解ssh及vsftpd密码
  10. python黑白图片上色_百度AI攻略:黑白图像上色
  11. Java多线程优化方法及使用方式
  12. k8s学习: 部署动态 pvc(nfs-subdir-external-provisioner)
  13. (原创)TCP-IP学习笔记之UDP(用户数据报协议)
  14. 外观模式又叫门面模式?
  15. Mac PyCharm下numpy安装
  16. 博途仿真PLC与第三方客户端通信
  17. sap和erp的区别:
  18. 用socket搭建web服务器(TCP协议)
  19. 记一次搭建Postfix邮件服务器(上篇)_星语惜馨_新浪博客
  20. FlyBanner轮播图 和 XBanner轮播图

热门文章

  1. eclipse不能调试运行Android程序问题的解决办法
  2. 机房系统(七)——【报表】
  3. Java Service Wrapper
  4. EditPlus注册码在线生成,强大
  5. notepad++每行首尾添加内容
  6. 俄罗斯为何把微积分下放到中学讲授?
  7. vue v-for 不能自能渲染问题
  8. sonar 设置模板(Template)
  9. R开发(part1)--R语言知识体系结构
  10. Psych101(part6)--Day6