gpt4 book ai didi

abap - 如何在ABAP中检索层次结构的所有子节点?

转载 作者:行者123 更新时间:2023-12-03 05:13:02 31 4
gpt4 key购买 nike

假设我有一个表示层次结构的数据库表,其中包含以下列:

  • ID
  • predecessor_id
  • 姓名

从给定的 ID 开始,我必须能够检索所有子节点(不仅仅是直接子节点)。由于公共(public)表表达式(WITH RECURSIVE)在 ABAP 中不可用,解决这个问题的最佳方法是什么?

我想到的一个可能的解决方案是迭代结果集(循环或使用游标),并递归调用检索直接子节点的函数。不过,我希望有一种更优雅的方法。

最佳答案

首先您需要知道 SAP 不是数据库,OpenSQL 始终会转换为底层数据库的 SQL 方言。如果底层数据库不支持 WITHWITH RECURSIVE 以及我从以下内容中看到的 article并非每个数据库都这样做,那么将其添加到 OpenSQL 就没有任何意义,因为在许多情况下没有任何内容可以将其映射到。

因此,第一个解决方案是按照您的建议,编写一个单独的递归函数/方法/子例程,或者如果您确实想使用底层数据库功能,您可以使用 ADBC 接口(interface)。如果您熟悉JDBC,那么这个概念对您来说应该不陌生。但是,如果您这样做是出于生产目的,那么您应该确保将来数据库迁移的可能性很小或根本没有。

采用 ADBC 的解决方案适用于我在具有底层 Oracle 数据库的 SAP 系统上。

REPORT Z_ADBC_TEST.

CLASS lcl_test DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
main.
ENDCLASS.

CLASS lcl_test IMPLEMENTATION.
METHOD main.
DATA lo_sql_connection TYPE REF TO cl_sql_connection.
DATA lo_sql_statement TYPE REF TO cl_sql_statement.
DATA lo_sql_result_set TYPE REF TO cl_sql_result_set.
TYPES BEGIN OF lt_result_struct,
n TYPE i,
fact TYPE i,
END OF lt_result_struct.
DATA lt_result TYPE TABLE OF t_result_struct WITH DEFAULT KEY.
DATA lr_ref_to_data TYPE REF TO data.
FIELD-SYMBOLS <fs_result> LIKE LINE OF lt_result.

lo_sql_connection = cl_sql_connection=>get_connection( ).
lo_sql_statement = lo_sql_connection->create_statement( ).
GET REFERENCE OF lt_result INTO lr_ref_to_data.
lo_sql_result_set = lo_sql_statement->execute_query(
`WITH temp(n, fact) ` &&
`AS (SELECT 0,1 FROM dual UNION ALL ` &&
`SELECT n+1,(n+1)*fact FROM temp ` &&
`WHERE n < 9) ` &&
`SELECT * FROM temp`
).
lo_sql_result_set->set_param_table( lr_ref_to_data ).
WHILE lo_sql_result_set->next_package( ) > 0.
LOOP AT lt_result ASSIGNING <fs_result>.
WRITE: / <fs_result>-n, <fs_result>-fact.
ENDLOOP.
ENDWHILE.
ENDMETHOD.
ENDCLASS.

END-OF-SELECTION.
lcl_test=>main( ).

关于abap - 如何在ABAP中检索层次结构的所有子节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37725621/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com