odata - 如何在输出中使用多个表创建基于 RFC 的 OData?
问题描述
我正在处理一个大型项目,该项目需要我为各种远程函数调用创建 OData。我能够弄清楚如何为简单的 RFC 建模和创建 OData;但是,我正在努力处理使用多个表以及简单的导出和导入参数的更复杂的 RFC。
我想通过一次调用通过 GetEntity 和 GetEntitySet 输出这些表以及导入和导出参数。我已经在网上进行了广泛的搜索以找到解决方案,但最好的解决方案似乎是重新定义 RFC 或多次调用 OData,这并不理想。
有没有办法将多个表与输出中的多个条目组合起来?当我说输出时,我指的是从 GetEntity/GetEntitySet 生成的 XML。
例如,采用下面的假 RFC 定义,该定义采用 PERNR,并输出直接下属列表和员工详细信息结构。
输入
- PERNR
出口
- S_EMPLOYEE_DETAILS
表格
- T_DIRECT_REPORTS
有没有办法将表、结构和导入参数组合到一个输出中?
解决方案
首先要了解的是,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
推荐阅读
- python - 使用 Xarray 从 netCDF 文件中提取数据到高 DataFrame 的有效方法
- java - 每次创建新实例时,ArrayList 都会被覆盖
- javascript - 如何将 2D 实时动态文本添加到 Three.js 场景?
- javascript - React - 并排显示图像
- python - 如何打印与两个不同列表中的不同值相对应的值?(Python)
- reactjs - 如何在 setState 之后 localStorage 设置项目?
- html - translateY(-50%)后如何调整父div的高度
- c - c中可变大小的数组
- java - 如何将 Java 文件添加到构建路径 Android Studio
- html - 电子邮件 HTML - 无法使用 _ 而不是 - 正确换行的行