0

我知道我正在重新打开一个旧的(使用 SAP Cloud SDK 对扩展实体执行过滤器),但那是不久前的事了,它引用了用于使用 S/4 HANA 服务的 API 的 Java 版本。

我正在针对 SuccessFactors OData API 测试 API 的 Javascript 版本,它确实能够对扩展实体执行过滤器,如下所示:

<API_HOST>/odata/v2/PerPerson?$filter=personalInfoNav/firstName eq 'MARCO'&$expand=personalInfoNav&$select=personalInfoNav/firstName, personalInfoNav/lastName&$top=20

翻译成 SDK,它将是(TypeScript):

const personList: Array<PerPerson> = 
    await PerPerson.requestBuilder().getAll().top(20)
        .select(
            PerPerson.DATE_OF_BIRTH,
            PerPerson.PERSONAL_INFO_NAV.select(
                PerPersonal.PERSON_ID_EXTERNAL,
                PerPersonal.FIRST_NAME,
                PerPersonal.LAST_NAME,
                PerPersonal.GENDER
            )
        ).filter(PerPersonal.FIRST_NAME.equals('MARCO'))
         .execute({ destinationName: this.configService.get<string>('ACTIVE_DESTINATION') });

但是此代码无法编译,因为过滤器函数的类型不兼容,这里需要“PerPerson”类型而不是“PerPersonal”。我无法找到任何关于此的信息。

考虑到普通的 OData 查询可以完美运行,任何人都能够完成这项工作吗?

4

1 回答 1

1

更新:

我最初并不了解 Successfactors 在协议之上提供此功能。我能想到两种可能的解决方法:

  1. 使用new Filter,例如:
PerPerson.requestBuilder().getAll().top(20)
  .select(
   ...
  ).filter(
    new Filter('personalInfoNav/firstName', 'eq', 'MARCO')
  )
...
  1. 如果这不起作用,您可以调用build请求构建器而不是execute,它会为您提供ODataRequest可以从中获取 URL 的对象,然后您必须手动操作。然后您应该能够使用该executeHttpRequest函数针对目标执行此自定义请求对象。

让我知道其中一项是否适合您!


原答案:

仅当两个实体之间的关系为 1:1 时,才能对 OData v2 上的扩展实体进行过滤。在这种情况下,代码如下所示:

PerPerson.requestBuilder().getAll().top(20)
  .select(
    PerPerson.DATE_OF_BIRTH,
    PerPerson.PERSONAL_INFO_NAV.select(
      PerPersonal.PERSON_ID_EXTERNAL,
      PerPersonal.FIRST_NAME,
      PerPersonal.LAST_NAME,
      PerPersonal.GENDER
    )
  ).filter(
    PerPerson.PERSONAL_INFO_NAV.filter(
      PerPersonal.FIRST_NAME.equals('MARCO')
  ))
...

但是,如果关系是 1:n,则无法进行过滤。

希望有帮助!

于 2020-02-18T09:18:37.690 回答