깊은 구조로 선택

Nov 13 2020

저는 비교적 ABAP에 익숙하지 않아서 여전히 내부 테이블 등에 익숙해 져야하므로 현재 ABAP에서 SQL을 사용하여 중첩 된 구조를 채우는 방법에 대해 약간 어려움을 겪고 있습니다.

예를 들면 :

TYPES: BEGIN of <<mystructure>>,
         someID type sometype,
         relatedItemsInDataModel type table of sometabletype,
       END of <<mystructure>>.
DATA wa type <<mystructure>>.

<<SELECT INTO STATEMENT>>

DATA(lv_json) = /ui2/cl_json=>serialize( data = wa compress abap_true ... ).

기본적으로 사전에 다른 테이블 (B)과 일대 다 관계가있는 테이블 (A)이 있고 A의 모든 항목을 선택하고 AI의 모든 항목에 대해 모든 관련 항목을 선택하고 싶습니다. 해당 레코드에 대한 B의 항목.

내가 이것을하고 싶은 이유는 나중에 그 데이터를 다음과 같이 JSON으로 변환하기를 원하기 때문입니다.

[
 {
  "someID": "someValue",
  "relatedItemsInDataModel": [{...}, {...}]
 },
 {
  "someID": "someValue2",
  "relatedItemsInDataModel": [{...}, {...}, {...}, ...]
 },
 ...
]

그래서 나는 처음에 올바른 방법으로 접근하고 있으며 방금 설명한 것을 어떻게 얻을 수 있습니까?

답변

4 Florian Nov 13 2020 at 17:12

SELECTs는 플랫 테이블 만 검색합니다. 따라서 여러 단계에서 중첩 된 데이터를 검색하고이를 ABAP 코드로 어셈블해야합니다.

귀하의 예는 다음과 같습니다.

DATA the_ids_i_want TYPE RANGE OF sometype.

SELECT <field-list>
  FROM table_a
  INTO TABLE @DATA(selection_a)
  WHERE some_id IN @the_ids_i_want.

SELECT <field-list>
  FROM table_b
  INTO TABLE @DATA(selection_b)
  WHERE parent_id IN @the_ids_i_want.

LOOP AT selection_a INTO DATA(row_a).

  DATA(result_row) =
    VALUE <<mystructure>>(
      some_id = row_a-some_id ).

  LOOP AT selection_b INTO DATA(row_b)
      WHERE parent_id = row_a-some_id.
    
    INSERT VALUE #(
        field_a = row_b-field_a
        ... )
      INTO TABLE row_a-relatedItemsInDataModel.

  ENDLOOP.

ENDLOOP.

데이터에 따라 최적화 할 수있는 측면이 많이 있습니다. 예를 들어, WHERE조건은 외래 키 관계의 유형에 따라 다를 LOOP ... WHERE수 있으며, 조회 속도를 높이기 위해 정렬 된 키를 내부 테이블에 추가하는 것을 고려할 수 있으며, FOR대신을 사용하여 어셈블리에 대해 더 짧은 변형이있을 수 있습니다 LOOP AT. 하지만 기본적으로 이것이 필요한 것입니다.