当前位置: 首页 > Web前端 > HTML5

SAPCRMFiori应用DeepCreate行为及实现分析

时间:2023-04-05 13:10:50 HTML5

OData的DeepCreate行为是什么?我们通过一个具体的例子来理解。下图是其中一个SAPCRMFiori应用程序的“我的机会”界面。我们单击+按钮创建一个新的机会实例。在Opportunitycreation页面,可以维护Opportunityheader区域的字段值。所谓表头区可以理解为OpportunityOData模型的根节点:维护好表头区的字段值后,向下滑动屏幕可以看到Product区。点击+按钮添加Product数据:下图中高亮区域为Product数据,从建模层面来看,这些字段值都是OpportunityOData模型的子节点,即字段值在产品子节点上。因此,所谓OData的DeepCreate操作,就是在一次HTTP请求中,OData消费者同时提供要创建的根节点和子节点的字段值,这样OData服务提供者就可以同时收到HTTP请求后创建根节点。节点和子节点的业务数据实例。在Chrome开发者工具的Network页面,我们观察到上述场景触发的OData请求,其HTTPPayload详情如下:{"Description":"deepcreate","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":"打开","StatusOrderNumber":"01"}],"产品":[{"HeaderGuid":"00000000-0000-0000-0000-000000000000","ProcessingMode":"A","ProductGuid":"00163EA7-1FFC-1EE1-A7E6-1543AD7395C1","ProductId":"AWEHFOIQF","ProductName":"blabla","数量":"1""TotalExpectedNetValue":"11","Unit":""}],"SalesTeam":[{"HeaderGuid":"00000000-0000-0000-0000-000000000000","PartnerFunctionCode":"00000004","PartnerNumber":"4221711","PartnerName":"","PartnerFunctionText":"Payer"}],"EmployeeResponsibleNumber":"4031140","PredecessorGUID":null}上图的产品,是一个导航igation属性,定义在SEGW事务代码中这个位置:SAPABAPOData服务端处理,当收到上述HTTP请求payload时,框架会调用ODataDPC_EXT类的CREATE_DEEP_ENTITY方法,其调用栈如图下图:框架解析出包含导航属性Products的lv_expand_string:首先使用io_data_provider读取header区域的数据:在读取到的header数据中,OData框架已经帮我们解析了navigation属性维护的products数据:最后是products指向的数据,通过入参it_product_i传入OneOrderAPICRM_ORDER_MAINTAIN:HTTPPost请求执行成功后,返回201Created状态码: