Как получить все элементы ассоциации? - PullRequest
1 голос
/ 28 мая 2020

Я создал следующие представления 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 согласно выбору выше .

1 Ответ

1 голос
/ 01 июня 2020

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

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

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

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

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).

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

enter image description here

Если вас не устраивает такая структура для вашей задачи, 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.
...