SELECT 深入结构
SELECT into deep structure
我对 ABAP 比较陌生,所以我仍然需要习惯内部 tables 之类的东西,
所以目前我对如何在 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 ... ).
所以基本上,我在字典中有一个 table (A),它与另一个 table (B) 有一对多的关系,我想 select A 中的所有项目以及 A 中的每个项目我想要 select B 中的所有相关项目以获取该记录。
我想这样做的原因是我稍后想将该数据转换为 JSON 看起来像:
[
{
"someID": "someValue",
"relatedItemsInDataModel": [{...}, {...}]
},
{
"someID": "someValue2",
"relatedItemsInDataModel": [{...}, {...}, {...}, ...]
},
...
]
那么,我一开始就采取了正确的方法吗?我怎样才能实现我刚才描述的目标?
SELECT
s 仅检索平面 tables。因此,您需要分多个步骤检索嵌套数据,并 assemble 在 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
条件可能会根据外键关系的类型而有所不同,您可能要考虑将排序键添加到内部 table 以加快 LOOP ... WHERE
查找,可能有是装配体的较短变体,使用 FOR
而不是 LOOP AT
,等等 - 但基本上,这就是您所需要的。
我对 ABAP 比较陌生,所以我仍然需要习惯内部 tables 之类的东西, 所以目前我对如何在 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 ... ).
所以基本上,我在字典中有一个 table (A),它与另一个 table (B) 有一对多的关系,我想 select A 中的所有项目以及 A 中的每个项目我想要 select B 中的所有相关项目以获取该记录。
我想这样做的原因是我稍后想将该数据转换为 JSON 看起来像:
[
{
"someID": "someValue",
"relatedItemsInDataModel": [{...}, {...}]
},
{
"someID": "someValue2",
"relatedItemsInDataModel": [{...}, {...}, {...}, ...]
},
...
]
那么,我一开始就采取了正确的方法吗?我怎样才能实现我刚才描述的目标?
SELECT
s 仅检索平面 tables。因此,您需要分多个步骤检索嵌套数据,并 assemble 在 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
条件可能会根据外键关系的类型而有所不同,您可能要考虑将排序键添加到内部 table 以加快 LOOP ... WHERE
查找,可能有是装配体的较短变体,使用 FOR
而不是 LOOP AT
,等等 - 但基本上,这就是您所需要的。