Как получить все элементы ассоциации?

Я создал представления CDS следующим образом:

define view YGAC_I_REQUEST_ROLE
  with parameters
    pm_req_id    : grfn_guid,
    @Consumption.defaultValue: 'ROL'
    pm_item_type : grac_prov_item_type,
    @Consumption.defaultValue: 'AP'
    pm_approval  : grac_approval_status
  as select from YGAC_I_REQ_PROVISION_ITEM as provitem

  association [1..1] to YGAC_I_ROLE as _Role on _Role.RoleId = provitem.ProvisionItemId

  association [1..*] to YGAC_I_ROLE_RS as _Relation on _Relation.RoleId1 = provitem.ProvisionItemId

{
  key ReqId,
  key ReqIdItem,
      Connector,
      ProvisionItemId,
      ActionType,
      ValidFrom,
      ValidTo,

      _Role.RoleId,
      _Role.RoleName,
      _Role.RoleType,


      _Role,
      _Relation
}
where
      ReqId             = $parameters.pm_req_id
  and ProvisionItemType = $parameters.pm_item_type
  and ApprovalStatus    = $parameters.pm_approval

Затем я использовал ABAP:

  SELECT
    FROM ygac_i_request_role( pm_req_id = @lv_test,
                              pm_item_type = @lv_item_type,
                              pm_approval = @lv_approval
                            )
    FIELDS reqid,
           connector,
           provisionitemid
  INTO TABLE @DATA(lt_result).

Как получить список _Relation согласно выбору выше.


person softshipper    schedule 28.05.2020    source источник
comment
это поможет? stackoverflow.com/questions/60996902/   -  person Haojie    schedule 29.05.2020
comment
Отвечает ли это на ваш вопрос? Как использовать CDS из ABAP SQL, используя значение ассоциации в условии WHERE?   -  person Sandra Rossi    schedule 29.05.2020
comment
@SandraRossi этот вопрос не о предложении WHERE, а об определяющих полях ассоциации в предложении SELECT, поэтому на самом деле это не дубликат   -  person Suncatcher    schedule 01.06.2020


Ответы (1)


Обычно это невозможно, как в SQL-запросах ABAP:

SELECT m~*, kt~*
  FROM mara AS m
  JOIN makt AS kt
... 

Это противоречит всей идее ассоциаций CDS, потому что они были созданы, чтобы подключиться по запросу и уменьшить количество повторных обращений к базе данных. Получение всех полей сводит на нет всю идею «ленивого соединения».

Однако в предложении FROM есть другой синтаксис, который включается path выражения, позволяющие запрашивать подчеркивающие ассоциации как полностью, так и по отдельным элементам. Вот как

SELECT *
  FROM ygac_i_request_role( pm_req_id = @lv_test )
       \_Role AS role
  INTO TABLE @DATA(lt_result).

Это извлекает все поля ассоциации _Role во внутреннюю таблицу.

Примечание: помните, что невозможно получить все опубликованные ассоциации текущего представления одновременно, только один путь для каждого запроса.

Возможный обходной путь - использовать JOIN

SELECT *
  FROM ygac_i_request_role AS main
  JOIN ygac_i_request_role
       \_Role AS role
    ON main~ProvisionItemId = role~RoleId
  JOIN ygac_i_request_role
       \_Relation AS relation
    ON main~ProvisionItemId = relation~RoleId1
  INTO TABLE @DATA(lt_table).

Это создает глубоко структурированный тип с выделенной структурой для каждой ассоциации соединения, например:

введите здесь описание изображения

Если вам не нравится такая структура для вашей задачи, lt_table следует объявить статически, чтобы все поля располагались в плоском виде.

TYPES BEGIN OF ty_table.
        INCLUDE TYPE ygac_i_request_role.
        INCLUDE TYPE ygac_i_role.
        INCLUDE TYPE ygac_i_role_rs.
TYPES END OF ty_table.
person Suncatcher    schedule 01.06.2020