当前位置: 首页 > 编程日记 > 正文

Jerry眼中的SAP客户数据模型

本文Jerry将介绍八款SAP产品中的客户模型。希望您在阅读完本文之后,能对SAP客户模型设计的思路有一个最最粗浅的了解。

由于Jerry水平和精力所限,本文不会详细阐述这些产品里的客户模型设计细节,而是介绍了一种方法,如果您对这些模型设计感兴趣,可以按照该方法自行深入研究。

  • SAP CRM
  • SAP CRM Fiori
  • SAP Hybris Cloud for Customer
  • SAP S/4HANA On Premise
  • SAP S/4HANA On Cloud
  • SAP Hybris Enterprise Commerce Platform
  • SAP Hybris Revenue Cloud
  • SAP Hybris Engagement Center

除SAP S/4HANA On Cloud之外,其他七款产品在SAP成都研究院均存在对应的开发团队。如果您对这些产品有进一步的问题需要咨询,欢迎留言。

SAP CRM

可以按照客户的类型是Corporate或Individual来搜索。在SAP的很多产品里,这两种类型的客户共用同一个技术模型,通过模型上某个类型字段进行区分。本文只着重介绍Corporate Account。

1240

下图是SAP CRM里某个Corporate Account明细页面的抬头区域。

1240

客户明细页面的抬头区域下部由若干可以通过点击小三角符号来展开的区域组成。SAP的技术文档里称这些区域为Assignment Block。

1240

如何查看SAP CRM的客户模型呢?在上图客户页面按F2,会显示如下弹出窗口,显示该页面实现的BSP应用视图名称为BP_HEAD/BPHEADOverview。

1240

在BSP开发工具里打开该视图,能看到每一个Assignment Block的技术明细。

1240

假设我想深究下图名为Address的Assignment block实现明细,在上图中得知其BSP实现为BP_ADDR/CorpAccountAddresses。在开发工具里打开此视图,找到地址数据是来自模型节点BuilAddress。

1240

1240

这个BuilAdress节点是SAP CRM客户模型的子节点。SAP很多产品都有所谓Business Object(下文简称BO)的概念,这些模型从技术上来说是一棵树,由若干节点组成,节点与节点之间存在父子关系或者跳转关系。每个节点由若干字段组成,这些节点组成的模型,再加上节点上定义的一系列能够执行的动作(action)就构成了一个BO,实际上是sap对某一业务流程及参与实体的高度抽象的产物。

1240

CRM客户模型的底层数据库表:BUT000。用于区分Corporate还是Individual Account的字段名称: TYPE。

1240

通过模型单元测试工具,能够清楚地看到客户的地址信息是维护在节点BuilAddress里的。下图是CRM Business Object测试工具截图,左上显示了该模型的节点集合,左下显示了当前选中节点为BuilAddress,右边区域显示了这个节点所有字段的内容。

1240

SAP CRM Fiori

前一章节介绍里使用CRM Web Client UI打开了一个Corporate客户。这里用SAP CRM Fiori再次打开它。

1240

可以看出CRM Fiori和CRM UI显示的思路类似,都是把抬头类型的信息和各个维度的明细信息分开显示。同CRM相比,稍稍不同的是CRM Fiori的客户明细页面并不像CRM那样,各个维度的数据从上到下依次全部显示在一个页面上。因为要照顾到使用平板电脑或者手机访问系统的Fiori用户,所以CRM Fiori页面上只会显示某一维度的客户数据。不同维度的数据展示通过下拉菜单来切换。

1240

例如选中Marketing Attributes维度后,在Chrome开发者工具里能观察到一个HTTP请求,观察其路径发现CRM_BUPA_ODATA,这其实是OData服务的技术名称。

1240

在网关系统根据该服务名称搜索,能查到提供该OData服务的后台服务器。

1240

让我们再来重温我的公众号文章SAP Fiori应用的三种部署方式里提到的这张架构图。网关服务器就是下图红色方框的ABAP Frontend Server,而OData服务的实现位于后台服务器,如下图蓝色方框所示。

1240

SAP Hybris Cloud for Customer

工作中心视图Accounts和Individual Customers分别对应了SAP CRM里的Corporate Account和Individual Account。

1240

页面风格和SAP CRM稍有不同,但是思路一致:客户的抬头信息显示在页面左部,其他维度的信息显示在页面右部。每个维度的信息通过不同的标签页进行切换。

1240

使用我公众号文章Jerry和您聊聊Chrome开发者工具提到的技巧找到客户明细页面的UI模型地址:

/BYD_COD/SalesOnDemand/Account/UI/COD_Account_TI.TI.uicomponent

在Cloud Application Studio里打开该UI模型,点击Data Model即可查看C4C客户模型的设计明细。

1240

这里可以看出C4C的客户模型仍然是一个BO,位于命名空间http://sap.com/xi/AP/FO/BusinessPartner/Global。

1240

该命名空间内部还包含一些其他BO,例如Customer和Employee。

1240

这几个模型有什么区别和联系?借用面向对象程序设计的思路来解释C4C里客户模型的设计:类似面向对象编程语言里的父类一样,Business Partner这个BO定义了一些最基本最通用的字段,如下图正中的虚线框所示:Generic Attribute,Addresses和Relationships。其他模型Customer,Employee和Supplier,则在这些通用字段基础上定义了一些新的字段。对于Customer模型,其区别于Business Partner模型之处就在于需要维护一些和销售相关的信息,比如销售数据,销售区域和销售线索。对于Employee,关注点则在于工作地址,工作部门,领导等信息。

借用面向对象编程语言的继承概念,C4C的Customer和Employee BO继承了Business Partner BO上定义的通用字段,同时本身又定义了新的字段,这些字段将其自身和其他BO从业务上区分开来。

1240

作为一款云解决方案,您可以通过一些非常简易的步骤,在短短几分钟之内通过OData Service或者Web Service,实现您的第三方应用和C4C客户模型的各种交互。例如您可以将C4C的客户数据暴露出来供第三方应用读取,或者通过第三方应用对C4C客户数据进行写操作。

1240

1240

SAP S/4HANA On Premise

在SAP R/3里,创建不同角色的业务伙伴需要使用不同的事务码:

1240

这些模型在SAP全球客户多年使用过程中,暴露出一些局限性和不足,例如一个Customer/Vendor只能维护一套地址信息;没有角色的概念,一个业务伙伴没法维护成既是Customer又是Vendor;没办法维护一些和时间相关的属性。

这些不足到了S/4HANA得到了妥善解决。在S/4HANA里,所有不同类型的业务伙伴使用统一的Business Partner模型。R/3的Customer和Vendor使用各自的模型和数据库表,到了S/4HANA,这些模型统一成Business Partner,通过BP Role来区分其角色,底层的数据库表也统一使用Business Partner的数据库表。

1240

客户数据的创建也统一使用事务码BP来完成。R/3那些五花八门的业务伙伴创建的事务码全部标注成Obsolete。一旦执行,会自动重定向到事务码BP去。

1240

为了确保大量源自R/3的基于Customer/Vendor旧模型的应用能够继续工作,S/4HANA引入了Customer Vendor Integration(CVI)的概念,简单地说即每次S/4HANA应用使用新的Business Partner对应的API进行写操作时,数据不仅仅存储到新的Business Partner模型的对应的数据库表里,同时仍然会存储一份到旧的数据模型表里,如下图所示:

1240

关于CVI的更多介绍,请参考博客:

  • Business Partner approach: Customer Vendor Integration to Business Partners (CVI)
  • Business Partner – Customer-Vendor Integration S/4 HANA

SAP S/4HANA on Cloud

和S/4HANA On Premise使用的客户模型相同,例如下图ID为1010的客户明细数据,

1240

通过OData服务MD_CUSTOMER_MASTER从ABAP服务器读取。

1240

切换标签页时,会触发该标签页对应的明细数据读取请求。

1240

每个标签页对应客户模型上的一个子节点。通过Chrome开发者工具查看请求结果字段即可了解到该子节点上建模了哪些字段。

1240

SAP Hybris Enterprise Commerce Platform

Hybris ECP backoffice里也存在Customer和Employee模型。因为是backoffice的使用场景,所以和前文介绍的SAP CRM和SAP C4C不同,这里的客户页面还包含一些其他维度的信息维护,比如密码策略和密码重置功能。

1240

Hybris的模型定义很有意思,定义在xml文件里。在Hybris文件夹\bin\platform\ext\core\resources下面有core-items.xml:

1240

该xml文件定义了Customer这个模型是另一个模型User的扩展,具体扩展的字段名称为customerID。

1240

在执行命令ant build后,会自动生成一个以Model结尾的.java文件,位于文件夹\bin\platform\bootstrap\gensrc\de\hybris\platform\core\model:

1240

查看CustomerModel.java,发现xml文件第1757行定义的code Customer出现在了Java文件的第40行,xml文件第1763行为Customer模型定义的新字段customerID, 出现在Java文件的第43行。

1240

而User模型的实现文件UserModel.java和CustomeModel.java位于同一个文件夹。打开UserModel.java, 发现它又是扩展自模型PrincipalModel。

1240

这个扩展关系也是在core-items.xml里定义的。

1240

同理,User模型较之Principal模型,新定义的字段如下图attributes标签里所示:

1240

按照同样的逻辑再从Principal往上追溯,可以得到完整的类型继承链:

Customer->User->Principal->GenericItems->LocalizableItem->ExtensibleItem->Item。

由此得知Hybris的类型系统,对于Customer和User这些业务模型的关系描述采用的是继承的思路,而ABAP Dictionary里的类型模型则采用的是组合的思路。若干业务上相关的字段被放到一个结构体里,若干结构体再组合(include)成一个规模更大的结构体,最终形成一个给外界消费的结构体。

1240

SAP Hybris Revenue Cloud

SAP Revenue Cloud是SAP最近发布的一款云解决方案。该方案能动态地规划、创新和调整系统,从云端自动管理和配置定价,报价,计费和订购等流程,从而超越报价到收款流程,通过变革实现盈利。

点击Customer tile查看客户主数据:

1240

客户明细页面是典型的Master Detail风格。

1240

从Chrome开发者工具里发现明细页面加载时,会有一个请求向后台读取40个客户的抬头信息:客户ID,客户类型和客户名称,显示在左边的Master List区域内。

1240

选中Master List里某个客户,会触发另一个HTTP请求向后台读取选中客户的明细:分别是客户地址,客户联系人和客户市场信息。这三类明细分别是Revenue Cloud客户模型的三个子节点,通过expand指令读取。

1240

在Chrome开发者工具里展开节点即可查看该节点的字段。例如地址节点包含的字段如下:

1240

这些数据请求由部署在SCP上基于Java实现的Revenue Cloud微服务负责响应并返回给UI5前台。

SAP Hybris Engagement Center

SAP Hybris Engagement Center是SAP新一代全渠道呼叫中心SaaS产品。在坐席和客户的交互场景里,坐席需要在最短的时间内搜索出系统里存在的客户或完成新客户的创建工作。

1240

实际上Engagement Center里的Corporate客户模型上的字段一个屏幕就能够全部显示出来,如下图所示:

1240

客户明细页面渲染之前,所需要的数据通过如下HTTP请求读取:

1240

通过expand指令在一个请求里将客户模型的抬头信息及地址信息一并取回。观察HTTP请求的响应结构,得知Engagement Center的客户模型里,地址信息维护在子节点Addresses上。

1240

从响应结构也能看出地址和客户角色都支持维护多个记录,这个观察结果也和UI上提供的功能一致。

1240

这篇文章简要介绍了SAP几款产品中客户模型的建模情况。通过SAP不同产品里客户数据模型的比较,我们了解到这些模型的复杂程度随使用场景的不同而有所区别。您也可以按照本文介绍的使用Chrome开发者工具这一方法,自行研究您感兴趣的SAP产品里的模型设计。甚至,您可以用同样的方法看看Salesforce的客户模型是怎样设计的。

感谢阅读。

1240

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

1240

1240

转载于:https://www.cnblogs.com/sap-jerry/p/8969509.html

相关文章:

【spring】spring JDBC开发 、 将创建表生成sql语句的方法

将navicate中已存在表的创建转化成sql语句的方法 1、右击表&#xff0c;选择对象信息 2、点击DDL jar包引入 1、spring-starter-jdbc 代码实现&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…

PL/SQL ——分页编程

通过PL/SQL编程&#xff0c;编写分页存储过程。代码如下所示&#xff1a; 1 --PL/SQL开发编写分页代码 2 --创建包 3 create or replace package Page as 4 type test_cursor is ref cursor 5 end Page; 6 --创建存储过程 7 create or replace procedure Page( 8 (tablenam…

My view towards Machine Learning

Introduction:[to be continued]转载于:https://www.cnblogs.com/JVKing/articles/2290780.html

两个表的更新、表的复制

update 表1 set from 表1&#xff0c;表2 where 条件 表的复制数据 1.select * into newtable from table 2.insert into table select table2 select identity(int,1,1),* into newtable from .. 这条语句有时挺管用的转载于:https://www.cnblogs.com/leshang/archive/2…

Java数据结构简述

1、数组 概念&#xff1a;一个存储元素的线性集合。 数组声明和创建&#xff1a; dataType[] arrayRefVar new dataType[arraySize]; 二维数组&#xff08;多维数组&#xff09;声明和创建&#xff1a; dataType[][] arrayName new dataType[arraylenght1][arraylenght2]; PS…

CORS漏洞利用检测和利用方式

CORS全称Cross-Origin Resource Sharing, 跨域资源共享&#xff0c;是HTML5的一个新特性&#xff0c;已被所有浏览器支持&#xff0c;不同于古老的jsonp只能get请求。 检测方式&#xff1a; 1.curl访问网站   curl https://www.huasec.com -H "Origin: https://test.com…

【spring】具名参数

具名参数 配置xml文件 1、配置dataSource&#xff08;数据源&#xff09; 代码实现&#xff1a; <context:property-placeholderlocation"DB.properties"></context:property-placeholder><bean id"dataSource"class"com.alibaba.d…

利用委托和泛型实现树的常用操作

在日常开发中&#xff0c;经常遇到对树的操作&#xff0c;我们可以利用泛型和委托对这些树进行操作&#xff0c;这样就不需要每有一个树就要实现相应的功能了。 源码在http://files.cnblogs.com/haiconc/LangTest.zip 首先&#xff0c;使用类泛型声明&#xff1a; public class…

Scott的ASP.net MVC框架系列文章之四:处理表单数据(2)

前几周我发表了一系列文章介绍我们正在研究的ASP.NET MVC框架。ASP.NET MVC框架为你提供了一种新的开发Web应用程序的途径&#xff0c;这种途径可以让应用程序变得更加层次清晰&#xff0c;而且更加有利于对代码进行单元测试和支持TDD&#xff08;测试驱动开发&#xff09;开发…

eclipse工作空间配置导出

由于工作与学习的需求&#xff0c;需要使用不同的工作空间。而eclipse的新建工作空间其他以前的配置都没有继承过来&#xff0c;那么就得重新配置一遍。 经过学习其他前辈们的经验与自己的摸索总结一下3种方法&#xff1a; 方法一&#xff1a;使用eclipse的导出功能。 工作目录…

探讨UnsupportedOperationException的原因及解决方案

[原文链接]{https://blog.csdn.net/liu_005/article/details/74091805} 转载于:https://www.cnblogs.com/Wbin01/p/11222483.html

成长轨迹44 【ACM算法之路 百炼poj.grids.cn】【字符串处理】【2799、2976、2975、2742】...

一次ac的就不说啥了。。 2799:浮点数格式 View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <ctype.h> 4 #include <cmath> 5 6 char flo[10050][55]; 7 int poi[10050]; 8 9 int main()10 {11 int num;12 scanf("%d…

【转载】xmind的使用安装方法

原文链接&#xff1a;https://blog.csdn.net/qq_16093323/article/details/80967867

BCB Access violateion at Address 0000 0003. Read of address 0000 0003

来自网页&#xff1a;&#xff08;我的电脑做不到&#xff09; 运行一个程序&#xff0c;莫名出现一个对话框:access violation at address 0000.. read of address000试了几次问题依旧&#xff0c;网上搜了下解决办法&#xff1a;原文&#xff1a;baidu&#xff0b;google&…

与 Scott Guthrie 一道感受技术激情 1月13日于北京

可能很多朋友已经知道了这个消息&#xff0c;我觉得还是写一下&#xff0c;别让这个机会白白溜走。Scott Guthrie是谁&#xff0c;我就不介绍了&#xff0c;简单说&#xff1a;ASP.NET之父&#xff0c;Silverlight 的主要创始人&#xff0c;还管着太多微软的开发技术和工具&…

【web】将一个jar包更改成war包

可以看到&#xff0c;向tomcat中发布工程刚创建的工程不在可添加的范围内&#xff0c;所以可以看出该工程是一个jar包 1、在pom文件中添加一行代码 代码实现&#xff1a; <artifactId>jar.to.war</artifactId> 2、更新maven工程 此时发现main文件夹下出现了一个w…

牛腩44 整合登陆页 RequiredFieldValidator 和 ValidationSummary 以及 asp.net 自带的MD5 加密...

在我们后台登陆的时候,有 用户名,密码和验证码3个必选项,所以我们托3个验证控件过来 例如这里,如果没有填写用户名,当点提交的时候,显示 红色的 * 号,并且弹出一个 alert 效果如下 这个是怎么做到的呢? 用户名后面的 * 号和弹出的 alert 分别用到 RequiredFieldValida…

HDU-1268 找新朋友 (素数筛选)

找新朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2518 Accepted Submission(s): 1183Problem Description新年快到了&#xff0c;“猪头帮协会”准备搞一个聚会&#xff0c;已经知道现有会员N人&#x…

硬盘无法访问文件系统损坏,里面的资料怎样恢复

文件系统损坏说明这个盘的文件系统结构损坏了。在平时如果数据不重要&#xff0c;那么可以直接格式化就能用了。但是有的时候里面的数据很重要&#xff0c;那么就必须先恢复出数据再格式化。具体恢复方法可以看正文了解&#xff08;不格式化的恢复方法&#xff09; 工具/软件&a…

【spring】第二个springmvc helloworld 以及 spring模糊路径

第二个helloword 配置文件&#xff1a; 1、添加pom文件 &#xff08;1&#xff09;配置parent 代码实现&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version…

jquery倒计时插件可自定义多个倒计时间

jquery倒计时插件设置多个自定义倒计时时间&#xff0c;任意设置天、小时、分钟、秒倒计时间功能。 查看演示>> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">…

怎样用cocos2d-x做一个基于地图块的游戏(Part One)

怎样用cocos2d-X做一个基于地图块的游戏 &#xff08;Part One&#xff09; 在这个分为上下两部分的教程中&#xff0c;我们将介绍如何使用Cocos2D-X和地图编辑器做一款基于地图块的游戏。在这个简单的地图块游戏里&#xff0c;一个精灵将在沙漠里搜寻它可口的西瓜&#xff01;…

【Code Complete】《Code Complete 》

良好编程实践的百科全书&#xff0c;完善编码聚焦于个人技能——所有的内容都来说明我们称之为“编写巧妙的代码”&#xff08;write clean code&#xff0c;clean可以翻译多种意思&#xff0c;只能意会了&#xff0c;有些英语翻译成汉语会很痛苦的&#xff09;。这本书就是那种…

redux示例

? 献上大概只有自己看得懂的学习笔记 结合使用实例理解更容易哦&#xff5e;import React from react; import ReactDom from react-dom; import {createStore} from redux; //解构一个createStore 创建状态对象//默认状态 state const defaultState{arr:[qq,bmw7], };//创建r…

18常用web开发 浮动层、提示层代码下载

1、jQuery顶部固定层页面滚动淡出淡进菜单显示 查看演示>> 2、jQuery鼠标滚动条到页面底部浮动层滑动弹出信息 查看演示>> 3、网页向导Jquery插件wlGuide功能操作步骤引导 查看演示>> 4、jQuery文字段落鼠标悬停图片突出显示和预览 查看演示>> 5、jque…

Android Handler的使用(二)

Handler的使用(二) 一、 Handler与线程的关系 Handler在默认情况下&#xff0c;实际上它和调用它的Activity是处于同一个线程的。 例如在Handler的使用&#xff08;一&#xff09;的示例1中&#xff0c;虽然声明了线程对象&#xff0c;但是在实际调用当中它并没有调用线…

【windows】cmd中的help无法使用的解决方法

今天使用黑框时遇到了一个问题&#xff0c;我在检查tomcat端口是否被占用时发现 黑框中竟然无法识别 netstat&#xff0c;随后试了一下help也无法识别。查了论坛后大名大佬给出的解决方案。 一、首先确定C:\WINDOWS\system32目录下有help.exe这个文件。 二、依次打开右键单击…

对微软Web Deploy的一次艰难调试

2011年初开始做一个项目&#xff0c;开始体验使用微软网站发布工具来发布网站。在服务器端安装发布服务后&#xff0c;可以在Visual Studio界面中右键点击Web项目&#xff0c;再点发布&#xff0c;第一次填好发布设置&#xff0c;以后就可以实现一键发布&#xff0c;虽然还有不…

vue总结 08状态管理vuex

状态管理 类 Flux 状态管理的官方实现 由于状态零散地分布在许多组件和组件之间的交互中&#xff0c;大型应用复杂度也经常逐渐增长。为了解决这个问题&#xff0c;Vue 提供 vuex&#xff1a;我们有受到 Elm 启发的状态管理库。vuex 甚至集成到 vue-devtools&#xff0c;无需配…

java8 lambda 表达式详解

lambada 表达式实质上是一个匿名方法&#xff0c;但该方法并非独立执行&#xff0c;而是用于实现由函数式接口定义的唯一抽象方法使用 lambda 表达式时&#xff0c;会创建实现了函数式接口的一个匿名类实例可以将 lambda 表达式视为一个对象&#xff0c;可以将其作为参数传递1.…