깊은 구조로 선택
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
SELECT
s는 플랫 테이블 만 검색합니다. 따라서 여러 단계에서 중첩 된 데이터를 검색하고이를 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
. 하지만 기본적으로 이것이 필요한 것입니다.