SAP CRM Fiori 应用的 Deep Create 行为和实现分析

简介: 什么是 OData 的 Deep Create 行为?我们通过一个具体的例子来了解。

什么是 OData 的 Deep Create 行为?我们通过一个具体的例子来了解。

下图是 SAP CRM Fiori 应用之一的 My Opportunities 界面。

我们点击 + 按钮,可以创建新的 Opportunity 实例。

在 Opportunity 创建页面里,可以维护 Opportunity 抬头区域的字段值。所谓抬头区域,可以理解成 Opportunity OData 模型的根节点:

抬头区域的字段值维护完毕之后,往下滑动屏幕,看到 Product 区域。点击 + 按钮,添加 Product 数据:


下图高亮区域就是 Product 数据,而从建模的层面来说,这些字段值,都是 Opportunity OData 模型的子节点,即 Product 子节点上的字段值。



因此,所谓 OData 的 Deep Create 操作,就是 OData 消费者在一个 HTTP 请求里,同时提供了待创建的根节点和子节点字段值,这样 OData 服务提供者在接收到这个 HTTP 请求后,能够同时创建包含根节点和子节点的业务数据实例。

我们在 Chrome 开发者工具的 Network 页面里,观察到上述场景所触发的 OData 请求,其 HTTP Payload 明细如下:


{"Description":"deep create","ProcessType":"OPPT","StartDate":"2022-8-28T00:00:00","ClosingDate":"2022-8-28T00:00:00","ExpectedSalesVolume":"0","SalesStageCode":"1","UserStatusCode":"E0001","UserStatusText":"Open","PriorityCode":"","PriorityText":"","ProspectName":"4221711","ProspectNumber":"4221711","MainContactName":"","ChanceOfSuccess":"0","ForecastRelevance":true,"CurrencyCode":"","Guid":"00000000-0000-0000-0000-000000000000","Statuses":[{"HeaderGuid":"00000000-0000-0000-0000-000000000000","StatusProfile":"CRMOPPOR","UserStatusCode":"E0001","UserStatusText":"Open","StatusOrderNumber":"01"}],"Products":[{"HeaderGuid":"00000000-0000-0000-0000-000000000000","ProcessingMode":"A","ProductGuid":"00163EA7-1FFC-1EE1-A7E6-1543AD7395C1","ProductId":"AWEHFOIQF","ProductName":"blabla","Quantity":"1","TotalExpectedNetValue":"11","Unit":""}],"SalesTeam":[{"HeaderGuid":"00000000-0000-0000-0000-000000000000","PartnerFunctionCode":"00000004","PartnerNumber":"4221711","PartnerName":"","PartnerFunctionText":"Payer"}],"EmployeeResponsibleNumber":"4031140","PredecessorGUID":null}

上图的 Products,是一个 navigation property,定义在 SEGW 事物码里这个位置:



SAP ABAP OData 服务器端的处理,当接收到上述的 HTTP 请求 payload 之后,框架会调用 OData DPC_EXT 类的 CREATE_DEEP_ENTITY 方法,其调用栈如下图所示:



框架解析出的 lv_expand_string, 包含了 navigation property Products:



首先使用 io_data_provider, 读取 header 区域的数据:


读取出来的 header 数据里,OData 框架已经帮我们解析好了通过 navigation property 维护的 products 数据:


最后 products 指向的数据,通过输入参数 it_product_i, 传入 One Order API CRM_ORDER_MAINTAIN:



该 HTTP Post 请求成功执行后,返回 201 Created 状态码:

相关文章
|
27天前
|
人工智能 搜索推荐 Serverless
使用金庸的著作,来测试阿里通义千问最新开放的长文档处理功能
使用金庸的著作,来测试阿里通义千问最新开放的长文档处理功能
66 7
使用金庸的著作,来测试阿里通义千问最新开放的长文档处理功能
|
23天前
|
存储
使用 ABAP 代码打印出 SAP CRM 系统里所有维护了 Sales Area 的 business partner id
使用 ABAP 代码打印出 SAP CRM 系统里所有维护了 Sales Area 的 business partner id
21 0
|
27天前
|
数据库
SAP CRM产品主数据无法根据产品描述字段进行搜索的原因
SAP CRM产品主数据无法根据产品描述字段进行搜索的原因
17 5
|
27天前
|
Web App开发 开发者 存储
介绍一个 webp 格式转 png 格式的软件:XNConvert
介绍一个 webp 格式转 png 格式的软件:XNConvert
27 6
介绍一个 webp 格式转 png 格式的软件:XNConvert
|
2月前
|
前端开发 搜索推荐 开发者
SAP UI5 sap.m.Column 控件的 minScreenWidth 属性介绍
SAP UI5 sap.m.Column 控件的 minScreenWidth 属性介绍
29 0
|
2月前
|
JavaScript 前端开发 开发者
SAP UI5 控件 sap.m.ListBase 的 inset 属性的作用介绍
SAP UI5 控件 sap.m.ListBase 的 inset 属性的作用介绍
17 0
|
2月前
|
Web App开发 数据采集 前端开发
纯技术讨论:如何让 SAP UI5 应用无法被别人在浏览器里调试 - 这种做法不推荐试读版
纯技术讨论:如何让 SAP UI5 应用无法被别人在浏览器里调试 - 这种做法不推荐试读版
15 0
|
2月前
|
XML 存储 数据格式
SAP UI5 控件 customData 属性的应用介绍
SAP UI5 控件 customData 属性的应用介绍
33 0
|
2月前
|
前端开发 JavaScript API
SAP UI5 sap.ui.require.toUrl 的作用介绍
SAP UI5 sap.ui.require.toUrl 的作用介绍
31 0
|
2月前
|
搜索推荐
如何让 SAP UI5 Smart Table 支持多项选择(Multiple-Selection)试读版
如何让 SAP UI5 Smart Table 支持多项选择(Multiple-Selection)试读版
19 0