如何在详情页绑定实体对象

How to bind an entity object on a Detail page

我正在使用 SAP UI5 开发主细节 Fiori 应用程序。由于详细信息包含超过 40 列,因此我为 master 和 detail 分别制作了 OData 服务。

在主页中,数据正确。现在我的任务是,在任何 table 行上,当用户单击详细信息时,将打开下一页,其中包含基于 主 table 的两个键值的详细信息。

我在详细页面的变量中得到两个键,如下所示,并且工作正常:

var spayid = jQuery.sap.getUriParameters().get("payid");
var spaydt = jQuery.sap.getUriParameters().get("paydt");

接下来,我创建了两个过滤器,如下所示,它们也可以正常工作。

var filter1 = new Filter({
  path: "Laufi",
  operator: FilterOperator.EQ,
  value1: spayid
});
var filter2 = new Filter({
  path: "Laufd",
  operator: FilterOperator.EQ,
  value1: spaydt
});

现在我正在调用 OData 服务,它也工作正常:

var oODataModel = new ODataModel("proxy/http/FIORI-DEV.abc.com:8000/sap/opu/odata/sap/ZASA_FI_pay_D_SRV?sap-client=100", {
  json: true,
  useBatch: false
});
this.getView().setModel(oODataModel);

我现在不知道如何过滤数据。上面应该包含什么,以便它根据我的过滤器 filer1filter2 过滤数据?我已尝试关注,但它不起作用。

  filters : [ filter1, filter2 ],
  json: true,
  useBatch: false

我对ABAP很在行,但对SAPUI5不是专家。我在学习阶段。

首先,我想在 OData 服务上传递参数,以便只获取所需的数据。意味着我的 OData 调用应该是这样的:

new ODataModel("proxy/http/FIORI-DEV.abc.com:8000/sap/opu/odata/sap/ZASA_FI_PAYMENT_D_SRV/PdetailSet(Laufi= spayid, Laufd = spaydt)?sap-client=100");

但这似乎不太可能。

第二个选项是我将在 OData 服务中获取全部详细信息,然后在绑定到 table 期间我将应用过滤器。

sap.ui.model.Filter class 的目的通常是将过滤器应用于 UI 上的列表。例如,如果您有一个项目列表,并且您希望将该列表限制为满足特定条件的项目子集。

但是你在这里看到的似乎是一个 classic 主从场景,你有一个项目列表,然后当用户选择一个项目时显示关于那个 一个的更多信息项。

这种情况的通常解决方案是将完整模型分配给详细视图,然后在视图上使用 element binding(也称为“上下文绑定”)来告诉它要哪个项目显示。

当项目的来源是对已经具有元素绑定的元素的点击时,您实际上可以从点击事件中检索正确的绑定路径,并将其应用于您的详细信息视图。

From one of the official demos:

onItemSelected: function(oEvent) {
    var oSelectedItem = oEvent.getSource();
    var oContext = oSelectedItem.getBindingContext("products");
    var sPath = oContext.getPath();
    var oProductDetailPanel = this.byId("productDetailsPanel");
    oProductDetailPanel.bindElement({ path: sPath, model: "products" });
}

当你没有任何方便的方法从中获取元素路径时,你必须自己构造一个:

var detailPanel = this.getView().byId("idOfDetailPanel");
detailPanel.bindElement("PdetailSet(Laufi = " + spayid +", Laufd = " + spaydt + ")");

后一个代码片段当然假定 oData 服务实际上支持使用由 laufilaufd 组成的密钥进行访问。这是由:

决定的
  • SAP Gateway Service Builder(事务SEGW)中实体类型关键字段的定义
  • 该 oData 服务的数据提供者 class 方法 get_entity 的 ABAP 实现。