首页 > 解决方案 > 如何在输出中使用多个表创建基于 RFC 的 OData?

问题描述

我正在处理一个大型项目,该项目需要我为各种远程函数调用创建 OData。我能够弄清楚如何为简单的 RFC 建模和创建 OData;但是,我正在努力处理使用多个表以及简单的导出和导入参数的更复杂的 RFC。

我想通过一次调用通过 GetEntity 和 GetEntitySet 输出这些表以及导入和导出参数。我已经在网上进行了广泛的搜索以找到解决方案,但最好的解决方案似乎是重新定义 RFC 或多次调用 OData,这并不理想。

有没有办法将多个表与输出中的多个条目组合起来?当我说输出时,我指的是从 GetEntity/GetEntitySet 生成的 XML。

例如,采用下面的假 RFC 定义,该定义采用 PERNR,并输出直接下属列表和员工详细信息结构。

输入

出口

表格

有没有办法将表、结构和导入参数组合到一个输出中?

标签: odataabapsaprfc

解决方案


首先要了解的是,OData 协议并非旨在像经典函数调用那样单独工作。然而,它基于实体/关系类型的模型。因此,在您的情况下,id 建议使用您的结构 S_EMPLOYEE_DETAILS 的适当属性创建一个名为“Employee”的实体类型。有了这个,您可以例如实现方法 GET_EMPLOYEE_ENTITY 以通过 PERNR 检索员工的单个实例。

接下来要做的是获取该员工的直接下属。由于在您的情况下,这是从 Employee 到 Employee 的 1:N 关系,您可以创建一个名为“DirectReports”的导航属性,并具有适当的基数。然后在您的 GET_EMPLOYEE_ENTITYSET 中,您可以返回表 T_DIRECT_REPORTS 的实例(请注意,导航属性不为空,您必须读取父级的键!)。

一旦完成这项工作,您就可以继续使用“最佳实践”并通过填充扩展子句来实现方法 GET_EXPANDED_ENTITY,我认为这是首选方式,因为您不需要实现两个单独的方法并且也更快(如果发生许多扩展)。

两种实现方法都可以通过调用

GET EmployeeSet('12345678')?$expand=DirectReports


推荐阅读