我有一个带有导航集的 odata。例如,订单实体集和项目实体集。 Items实体集是Order的导航集(子集)。这是一对多的关系。每个订单可能有 0 件或多件商品。
我的 sap ui5 页面允许人们更新现有订单并将商品添加到订单中,然后按屏幕上的“提交”按钮将更改提交到网关 sap 后端。
订单实体集绑定到表控件,项目实体集绑定到片段中的对话框。订单表有行,每行都有一个名为“管理项目”的按钮。如果您按订单 #1 的管理商品按钮,将打开包含现有商品的对话框 + 您可以向订单 #1 添加其他商品。最后,用户必须关闭项目对话框并按提交更改。提交更改应该将所有订单及其嵌入(嵌套)在每个订单中的项目提交给网关,并让网关处理深层实体结构。
我希望能够通过单个 oModel.submitChanges() 调用一次性提交订单及其项目,并且网关将作为深层实体处理我的请求。
我已经有了后端代码,我已经有了网关,测试数据等。我只需要知道如何从 sap ui5 提交带有深层实体的更改。
网关将处理深层实体 CRUD,从某种意义上说,只有在订单交易不失败的情况下,才会插入、更新、删除项目。如果订单交易失败,商品插入/更新/删除将会回滚。订单和商品密切相关,这就是为什么我不想将订单的更改与商品分开提交。相反,我想将 SubmitChanges 作为深层实体,将项目嵌套在订单中,然后一起提交。
有人可以帮助如何从 sap ui5 提交深层实体更改吗?
正确的方法是在后端实现 CREATE_DEEP 方法。这样,您只需一次请求即可发送完整的深层实体。
发送的对象例如:
{
"OrderId" : "123",
"Kunnr" : "001234566",
"Items": [
"Matnr" : "123",
"Qnt" : 1
]
}
在前端,您只需调用 Order 实体上的 create 方法,一切都将由框架和网关处理。
当然,您需要在 OData 服务上定义订单和项目实体之间的正确关联。
这将为您发送的每个订单(及其各自的商品)创建一个请求。
如果您需要一次发送多个订单,我会创建一个新实体以将所有订单聚合到一个中:
{
"id" : "12",
"Orders": [{
"OrderId" : "123",
"Kunnr" : "001234566",
"Items": [
"Matnr" : "123",
"Qnt" : 1
]
}, {
"OrderId" : "987",
"Kunnr" : "001234566",
"Items": [
"Matnr" : "987",
"Qnt" : 3
]
}]
这还将调用后端的 CREATE_DEEP 方法,您可以在其中一次处理所有信息并仅返回一个结果。
P.S.:如果您使用第一种方法,您也可以一次发送多个请求(使用批量),但您必须单独处理每个请求的结果。这取决于您是否想要“全有或全无”或“如果可以插入并仅对 nok 重复”