Jerry答网友提问:SAP CRM WebClient UI里的EXT,STRUCT等含义
2020年,Jerry会做一个新的尝试,选择部分朋友向我提出的问题,在公众号,知识星球或者微信圈子这些平台上公开回答,这样或许能帮助到更多的朋友。
具体说明参见我前一篇文章:2020年关于SAP知识问答的一个新的尝试
网友的提问:
Jerry的解答:
以上截图是CRM系统里BSP_WD_CPMWB这个事务码进入之后,任意打开一个上下文节点(Context Node)看到的信息:
STRUCT的含义?
在Jerry之前的文章 Jerry的WebClient UI 42篇原创文章合集 提到这样一张图:
在UI层的CRM BSP component的MVC设计里,Model,即Context node,绑定的是Business Object Layer的模型,因此Context node Attributes文件夹下面,以STRUCT开头的字段,意味着这个字段是绑定到BOL模型节点里的一个字段的,二者存在一一对应关系,如下图箭头所示。而下图蓝色字段LOCKED, 前面没有STRUCT前缀,说明这个字段并非来自BOL模型节点,而是开发者直接创建的,这种字段一般用于应用逻辑里存储临时状态,或是代表当前应用的某个标志位,没有对应的底层存储,在SAP很多产品里也称这种字段为transient field或者calculated field.
展开某个字段,看到的GET, GET_M, GET_I, GET_V, GET_P, GET_A是什么意思?
要回答这个问题,得从CRM WebClient UI页面的渲染方式说起。
如上图这种视图源代码,使用的标签页不是HTML支持的原生标签,浏览器是无法识别和解析的,因此需要有一个中间层,或者说转换器,将这些SAP封装过的标签转换成浏览器支持的原生HTML标签。
按照这个转换器所处位置的不同,分为服务器端渲染和浏览器端渲染两种方式。SAP CRM WebClient UI基于SAP BSP技术——Business Server Page,光听名字就知道是在服务器端渲染了。而SAP UI5,是典型的浏览器端渲染,我们在其XML视图里书写的那些标签同样无法直接被浏览器使用,需要每个标签对应的渲染器,在浏览器端用JavaScript代码生成对应原生的HTML标签。
回到CRM WebClient UI,对于Attributes里的这些STRUCT字段们,我们在渲染出的最终页面里,有的是一般的输入字段,有的是超链接,有的是下拉框,有的不可编辑,SAP开发的转换器怎么知道要将每个字段渲染成什么样呢?
奥妙就在这些GET方法里。这里有一个小小的设计模式的思路在内,即SAP CRM WebClient UI的框架代码,负责服务器端渲染80%的工作量,即把整个页面的框架搭出来,包括一个页面有多少字段,字段之间的相对位置等。剩下20%的工作量,比如每个字段的类型,外观等属性,这些信息框架不可能知道,也不应该知道,这些应该由应用程序提供接口(也可以理解成回调),在接口里实现这些属性,然后由框架调用这些接口。我们可以把这个模式看成是设计模式里的一种——模板模式(Template Design Pattern).
看具体的例子。
双击进入CONFIG这个字段的GET_P方法里。P的意思是Property,属性。UI框架在渲染CONFIG这个字段时,会调用GET_P_CONFIG这个接口,询问应用:你想把CONFIG这个字段渲染成什么类型(下图第4行的fieldtype)?
应用程序通过第五行的field_type_checkbox回答框架:我想把CONFIG字段渲染成checkbox, 拜托了。
UI框架拿到这个信息后,就可以做对应的渲染工作了。
如果想研究UI拿到这个字段类型后如何渲染的细节,在GET_P方法里打断点,然后打开一个页面,单步调试记录:
GET_I: 如果应用逻辑里需要根据某种条件动态决定该字段是否可编辑,将逻辑写在这个接口里。
纯粹的GET_P方法:这里面奥妙很多,尤其是这个CONVERT_TO_STRING方法,将底层数据库表里对应的字段根据BOL模型里的字段类型渲染成最终对用户友好易读的字符串。比如底层数据库表里存储的是不含任何时区的时间戳(timestamp), 那么这个方法会根据用户设置里的时区,自动转换成该时区的本地时间。
GET_V: 如果想实现自定义的F4 Value Help,在此实现。
GET_A: 如果某字段的启用与否,依赖于某个Business Switch的开与关,在此实现。在SFW开头的系列事务码里查看和操作Business Switch和Function.
EXT开头的字段,代表通过CRM增强工具Application Extension Tool(AET)创建的增强字段。
希望本文能解答这位朋友提出的问题,感谢阅读。
相关阅读
- Jerry的WebClient UI 42篇原创文章合集
- 也可以了解Jerry提到的UI5的客户端渲染方式,看Jerry这篇文章:Jerry的UI5框架代码自学教程
要获取更多Jerry的原创文章,请关注公众号"汪子熙":
Jerry答网友提问:SAP CRM WebClient UI里的EXT,STRUCT等含义相关推荐
- SAP CRM WebClient UI里如何找到Assignment block和settype的映射关系
SAP CRM WebClient UI 产品主数据里的assignment block,要么对应一个settype,要么对应一个relationship. 如何根据assignment block, ...
- SAP CRM WebClient UI里的文件是如何上传到ABAP Netweaver后台的
使用Chrome开发者工具调试CRM WebClient UI里附件上传的功能: 从本地选择一个文件,断点触发: 前端取得用户选中上传的文件名: Jerry.txt 点Attach按钮后,触发ABAP ...
- 如何在SAP CRM WebClient UI里创建HANA Live Report
1. 使用业务角色ANALYTICSPRO登录WebClient UI: 2. 点击新建按钮: 为新建的报表分配一个HANA Live Query: 指定Query的参数: 上图WebClient U ...
- 如何在 SAP CRM WebClient UI 里在 Context node 上下文里访问其他 Context Node 的数据
今天一个朋友在微信上咨询我一个问题: 抽象一下,这个问题就是:如何在 Context Node A 的上下文,比如 GET 方法里,读取到 Context Node B 的数据? 以 Product ...
- SAP CRM webclient ui里直接编写原生的JavaScript
- SAP CRM WebClient UI交互式报表的Gross Value工作原理
SAP CRM WebClient UI交互式报表(Interactive Report)的Gross Value工作原理 the selection fields passed to backend ...
- SAP CRM WebClient UI搜索结果界面的扩展字段显示
SAP CRM WebClient UI搜索结果界面的扩展字段显示原理. 要获取更多Jerry的原创文章,请关注公众号"汪子熙":
- SAP CRM WebClient UI和CRM Fiori Account里显示Opportunity逻辑
我们知道SAP CRM WebClient UI的Account页面下有一个assignment block名叫opportunities,在SAP CRM Fiori UI里也有一个opportun ...
- 在SAP CRM WebClient UI中用javascript触发ABAP event
环境:SAP CRM WebClient UI 需求:在WebClient UI里不通过用户手动点击,而是使用JavaScript代码自动触发ABAP后台的代码. 解决方案: 1. 定义一个hidde ...
最新文章
- os与sys类使用小节
- oracle 会话实例,返璞归真:Oracle实例级别和会话级别的参数设置辨析
- 常见三种字符编码的区别:ASCII、Unicode、UTF-8
- Android----使用代码 建立gprs 闹钟 连接
- 《windows核心编程》–Windows内存体结构(二)
- 最新 MySQL数据库安装详解(简洁快速)
- CUDA——线程配置
- Spark提交代码的两种方式
- python curl 获取返回值_php curl_exec()函数 CURL获取返回值的方法
- Web 应用程序渗透测试清单
- python编程就业_python编程语言就业做什么工作的?python就业方向
- 短时傅里叶变换STFT(matlab)
- 2021年与 Linux 有关的几件大事
- 减轻压力保护脊椎,上学路上更轻松,Deuter多特护脊减负双肩背包体验
- win10插入耳机没声音解决办法
- 【软考软件评测师】2019综合知识历年真题
- ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to
- AutoCad二次开发:ObjectARX
- 基于JAVA+SpringMVC+Mybatis+MYSQL的书笺小筑二手书交易系统
- css控制中文字体间距
热门文章
- Visual basic 6读写ini文件
- python元编程之使用动态属性实现定制类--特殊方法__setattr__,__getattribute__篇
- Shell按行读取文件的3种方法
- Android内存解析(二)— 详解内存,内部存储和外部存储
- Java-马士兵设计模式学习笔记-观察者模式-读取properties文件改成单例模式
- Office文件的奥秘——.NET平台下不借助Office实现Word、Powerpoint等文件的解析(一)...
- HD2 电容屏不灵怎么办?
- C++ dlopen mini HOWTO 一篇非常好的介绍C++ dlopen linux/mac os x 编程的资料
- Office编程在dot Net环境中总结(Word生成表格报表篇)
- JAVA面试题(part6)--局部内部类