Abap 选择进入深层结构

Abap 选择进入深层结构,abap,opensql,Abap,Opensql,我对ABAP比较陌生,所以我仍然需要习惯内部表格之类的东西, 因此,目前我正在努力研究如何在ABAP中使用SQL来填充嵌套结构 例如: TYPES: BEGIN of <<mystructure>>, someID type sometype, relatedItemsInDataModel type table of sometabletype, END of <<mystructure>>. D

我对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 ... ).
那么,首先,我的方法正确吗?我如何才能实现我刚才描述的目标?

选择仅检索平面表。因此,您需要分多个步骤检索嵌套数据,并将其组装到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.
根据您的数据,有许多方面可以优化。例如,其中的条件可能取决于外键关系的类型,您可能需要考虑将排序键添加到内部表以加快循环。在查找中,程序集可能有较短的变体,使用for而不是LOOP AT等。但基本上,这是您所需要的。

仅选择检索平面表格。因此,您需要分多个步骤检索嵌套数据,并将其组装到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.

根据您的数据,有许多方面可以优化。例如,其中的条件可能取决于外键关系的类型,您可能需要考虑将排序键添加到内部表以加快循环。在查找中,程序集可能有较短的变体,使用for而不是LOOP AT等-但基本上,这就是您所需要的。

我认为不可能用标准SQL填充嵌套的结构化结构,因为SQL是关系型而不是层次型的。我认为不可能用标准SQL填充嵌套的结构化结构,因为SQL是关系型而不是层次型的。非常感谢!我自己也找到了一个类似的解决方案,但你的回答很好地解释了这一点。非常感谢,非常感谢!我自己也找到了一个类似的解决方案,但你的回答很好地解释了这一点。谢谢。