You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SAP UI5中通过submitChanges()提交Deep Entity?

SAP UI5 实现嵌套Items的Order深度实体单次提交

以下是适配你场景的具体实现步骤,确保单次提交包含嵌套Items的Order实体并触发后端事务一致性处理:

1. 配置OData模型支持批处理与双向绑定

首先确保OData V2模型启用批处理(批量提交的基础),同时设置双向绑定以自动跟踪所有数据变更:

// 在控制器/组件初始化时创建模型
const oODataModel = new sap.ui.model.odata.v2.ODataModel({
  serviceUrl: "/sap/opu/odata/sap/YOUR_ORDER_SERVICE/",
  useBatch: true, // 必须启用批处理,打包所有变更为单次请求
  defaultBindingMode: sap.ui.model.BindingMode.TwoWay // 自动捕获数据修改
});
this.getView().setModel(oODataModel);

2. 正确绑定Order与Items的上下文

  • Order表格绑定:将表格直接绑定到Order实体集,每行上下文对应单个Order实例,支持订单属性的直接编辑:
<Table id="orderTable" items="{/OrderSet}">
  <columns>
    <Column><Text text="订单ID"/></Column>
    <Column><Text text="订单日期"/></Column>
  </columns>
  <items>
    <ColumnListItem>
      <cells>
        <Text text="{OrderId}"/>
        <Input value="{OrderDate}"/> <!-- 双向绑定实现订单属性更新 -->
        <Button text="管理订单项" press=".onManageItems"/>
      </cells>
    </ColumnListItem>
  </items>
</Table>
  • Items弹窗绑定:点击"管理订单项"时,将当前Order的上下文传递给弹窗,弹窗内列表直接绑定到Order的Items导航属性(相对绑定无需硬编码路径):
// 控制器中打开弹窗的方法
onManageItems: function(oEvent) {
  const oOrderCtx = oEvent.getSource().getBindingContext();
  const oItemsDialog = this.getView().byId("itemsManagementDialog");
  oItemsDialog.setBindingContext(oOrderCtx); // 关联当前订单上下文
  oItemsDialog.open();
}

弹窗片段的Items列表绑定示例:

<!-- 弹窗内的Items维护列表 -->
<List id="itemsList" items="{Items}">
  <StandardListItem>
    <cells>
      <Input value="{ItemName}"/>
      <Input value="{Quantity}" type="Number"/>
      <Button icon="sap-icon://delete" press=".onDeleteItem"/>
    </cells>
  </StandardListItem>
</List>
<Button text="添加订单项" press=".onAddItem"/>

3. 实现Items的增删操作

  • 添加订单项:基于当前Order的上下文创建关联的Items实体条目,模型自动标记为待创建的变更:
onAddItem: function() {
  const oOrderCtx = this.getView().byId("itemsManagementDialog").getBindingContext();
  const oModel = this.getView().getModel();
  // 创建属于当前订单的新订单项
  oModel.createEntry(oOrderCtx.getPath() + "/Items", {
    properties: {
      ItemName: "",
      Quantity: 1
      // 根据实体结构补充默认属性
    }
  });
}
  • 删除订单项:基于当前Item的上下文标记删除操作:
onDeleteItem: function(oEvent) {
  const oItemCtx = oEvent.getSource().getBindingContext();
  const oModel = this.getView().getModel();
  oModel.deleteEntry(oItemCtx);
}

4. 单次提交所有变更

点击提交按钮时,直接调用模型的submitChanges方法,模型会自动收集所有Order更新、Items增删改的变更,生成包含深度实体结构的批请求发送给网关:

onSubmitAllChanges: function() {
  const oModel = this.getView().getModel();
  oModel.submitChanges({
    success: function(oResponse) {
      sap.m.MessageToast.show("所有变更已成功提交");
      oModel.refresh(); // 刷新数据同步后端状态
    },
    error: function(oError) {
      const sErrMsg = oError.responseText ? JSON.parse(oError.responseText).error.message.value : oError.message;
      sap.m.MessageBox.error(`提交失败:${sErrMsg}`);
    }
  });
}

关键注意事项

  • 确认OData服务元数据中,Order实体的Items导航属性已配置为可写(Gateway中需开启导航属性的CRUD权限)
  • 所有数据操作必须依赖模型的上下文跟踪,不要手动调用update/create/delete方法,否则会破坏批量提交的事务性
  • 网关端已配置深度实体事务,因此submitChanges发送的批请求会触发后端原子性处理:订单操作失败时,关联的Items变更自动回滚

内容的提问来源于stack exchange,提问作者Fahmi Eshaq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:53:19