我想编写一个自定义Fiori,使用oData Service从我的SAP系统中调用数据。
使用SEGW事务,我已经设置了一个服务,以返回基于VBAK表的平面结构。利用这些知识,我可以为每个对象类型开发一个EntitySet,并在需要时调用它们。但是,我希望将数据库调用减少到只有一条语句。应立即提供所有相关数据。
现在,我问自己:如何在一次调用中提供嵌套数据?比方说,对于VBAK中的每个条目,我希望有一个相关VBAP条目的嵌套数组。
我的问题是:
- 如何在DDIC中定义所描述的数据模型
- 如何在SEGW中设置所描述的数据模型
- 如何在我的服务实现类中重新实现该方法
如果我在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网关充当Odata请求和底层数据之间的接口(显然)。从概念上减少DB请求是有意义的,但您需要优化使用Gateway项目创建的"数据提供程序类"(DPC)。虽然您可以改进ABAP(以及相关的DB性能),但DPC中的请求将受到整个Odata设计范式的约束。
在SAP NW Gateway项目中,无法将复杂类型定义为实体集本身-请参阅帮助文件您应该查看是否存在一些可以满足您需求的SAP DDIC视图(例如,请参见WB2_V_VBAK_VBAP2),并围绕这些视图对实体集进行逻辑建模,即扁平化您的数据需求。
如何设置数据模型请注意,SEGW中的数据模型是一个逻辑模型,它不必物理存在于DB上,DPC类是ABAP,它负责填充实体集。
如何重新实现该方法从技术上讲,您可以重新定义DPC类的方法,这可以通过扩展运行时工件文件夹和扩展*_DPC_EXT类(右键单击并说转到工作台)直接从SEGW项目访问。您需要有一些合理的ABAP知识,以及实现任何可能要求的Odata过滤。
其他评论为了最大限度地减少数据库访问,您可能还想考虑在DPC类中实现一些缓存,但这将取决于调用的频率。