SAP Cloud SDK для Javascript: фильтрация по расширенным объектам - PullRequest
0 голосов
/ 18 февраля 2020

Я знаю, что заново открываю старый ( Выполнить фильтр на расширенной сущности с помощью SAP Cloud SDK ), но некоторое время он был go и ссылался на версию Java используемого API использовать службу S / 4 HANA.

Я тестирую версию API Javascript с API-интерфейсом ODD SuccessFactors, который действительно способен выполнять фильтры для расширенных объектов, например:

<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 работает отлично, кто-нибудь смог сделать эту работу?

1 Ответ

1 голос
/ 18 февраля 2020

Обновление:

Изначально я не понимал, что Successfactors предлагал эту функцию поверх протокола. Я могу придумать два возможных обходных пути:

  1. использование new Filter, например:
PerPerson.requestBuilder().getAll().top(20)
  .select(
   ...
  ).filter(
    new Filter('personalInfoNav/firstName', 'eq', 'MARCO')
  )
...
Если это не сработает, вы можете вызвать build в построителе запросов вместо execute, что даст вам объект ODataRequest, из которого вы можете получить URL-адрес, которым затем придется манипулировать вручную. Тогда вы сможете использовать функцию executeHttpRequest для выполнения этого пользовательского объекта запроса в отношении пункта назначения.

Дайте мне знать, если один из них работает для вас!


Исходный ответ:

фильтрация по расширенным объектам в OData v2 возможна только в том случае, если отношение между двумя объектами равно 1: 1. В случае, если код будет выглядеть так:

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, фильтрация невозможна.

Надеюсь, это поможет!

...