如何在输出中有多个表的情况下基于RFC创建OData?

时间:2018-08-29 13:45:19

标签: odata sap abap saprfc

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

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

有什么方法可以将多个表与输出中的多个条目组合在一起?当我说输出时,我指的是从GetEntity / GetEntitySet得到的XML。

例如,采用以下伪造的RFC定义,该定义采用PERNR,并输出直接报告列表和员工详细信息的结构。

导入

  • PERNR

导出

  • S_EMPLOYEE_DETAILS

表格

  • T_DIRECT_REPORTS

有没有一种方法可以将表,结构和参数导入到一个输出中?

1 个答案:

答案 0 :(得分:4)

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

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

一旦完成这项工作,您就可以进入“最佳实践”并通过填充expand子句来实现GET_EXPANDED_ENTITY方法,在我看来这是首选方法,因为您无需实现两个单独的方法,并且比较方便也更快(如果发生许多扩展)。

两种实现方法都可以通过

调用

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