ABAP oDATA 服务:如何在一次调用中提供嵌套数据?

ABAP oDATA Service: How to provide nested data in one call?

我想编写自定义 Fiori,使用 oData 服务从我的 SAP 系统中调用数据。

使用 SEGW 事务,我已经为 return 基于 VBAK table 的平面结构设置了服务。利用这些知识,我可以为每种对象类型开发一个 EntitySet,并在需要时调用它们。但是,我会把我的数据库调用减少到一个语句。应立即提供所有相关数据。

现在,我问自己:如何在一次调用中提供嵌套数据?比方说,对于 VBAK 中的每个条目,我想要一个相关 VBAP 条目的嵌套数组。

我的问题是:

如果我用 ABAP 编写结构,它可能看起来像这样:

TYPES: BEGIN OF vbakvbap,
  vbap TYPE vbap OCCURS 0.
  INCLUDE TYPE vbak.
TYPES: END OF vbakvbap.

DATA: lt_vbakvbap TYPE TABLE OF vbakvbap.

我对 ABAP 知之甚少,对 SEGW 知之甚少,欢迎指点。

SAP NetWeaver Gateway 充当 Odata 请求和基础数据之间的接口(很明显)。从概念上减少数据库请求是有意义的,但您需要优化使用网关项目创建的 "Data Provider Class"(DPC)。虽然您可以改进 ABAP(以及相关的数据库性能)- DPC 中的请求将受到整体 Odata 设计范例的限制。

在 SAP NW Gateway 项目中,无法将复杂类型定义为实体集本身 - 请参阅 help file 您应该看看是否存在一些 SAP DDIC 视图可以满足您的需求(参见 WB2_V_VBAK_VBAP2 作为示例)并围绕这些逻辑地为您的实体集建模,即展平您的数据需求。

如何设置数据模型 请注意,您在 SEGW 中的数据模型是一个逻辑模型,它不必实际存在于数据库中,DPC class 是 ABAP,它负责填充实体集。

如何重新实现方法 从技术上讲,您重新定义了 DPC class 的方法,这可以直接从 SEGW 项目访问,方法是展开运行时工件文件夹并扩展 *_DPC_EXT class(右键单击并说去Workbench)。您需要具备一些合理的 ABAP 知识,并实施可能需要的任何 Odata 过滤。

其他评论 为了最大限度地减少数据库访问,您可能还需要考虑在 DPC class 中实施一些缓存,但这取决于您的调用频率。