如何用ABAP SQL层级函数简化TDEVC表Z开头包查询?
使用ABAP SQL层级函数简化TDEVC包层级查询
当然可以通过ABAP SQL的层级查询功能大幅简化你的代码,无需后续循环遍历处理,直接在SELECT语句中就能一次性获取所有以Z开头的自定义包及其父包、根包信息。以下是两种简洁的实现方式:
方式1:使用CONNECT BY语法(ABAP 7.40 SP08及以上)
利用传统层级关联语法配合CONNECT_BY_ROOT函数直接获取根节点:
TYPES: BEGIN OF ty_result, devclass TYPE devclass, parentcl TYPE devclass, root TYPE devclass, END OF ty_result, ty_results TYPE STANDARD TABLE OF ty_result WITH EMPTY KEY. DATA(lt_result) = VALUE ty_results( ). SELECT devclass, parentcl, CONNECT_BY_ROOT devclass AS root FROM tdevc WHERE devclass LIKE 'Z%' START WITH parentcl IS NULL CONNECT BY PRIOR devclass = parentcl INTO TABLE @lt_result.
语法说明:
START WITH parentcl IS NULL:指定层级树的起点为无父包的根节点CONNECT BY PRIOR devclass = parentcl:定义层级关联规则——父包的DEVCLASS等于子包的PARENTCLCONNECT_BY_ROOT devclass:直接提取当前节点的最顶层祖先(根包)
方式2:使用HIERARCHY导航函数(ABAP 7.54及以上)
ABAP 7.54引入了更直观的层级函数,用HIERARCHY_ROOT_NODE可以更清晰地获取根节点:
TYPES: BEGIN OF ty_result, devclass TYPE devclass, parentcl TYPE devclass, root TYPE devclass, END OF ty_result, ty_results TYPE STANDARD TABLE OF ty_result WITH EMPTY KEY. DATA(lt_result) = VALUE ty_results( ). SELECT devclass, parentcl, HIERARCHY_ROOT_NODE( tdevc ) AS root FROM tdevc WHERE devclass LIKE 'Z%' HIERARCHY START WITH parentcl IS NULL CONNECT BY PRIOR devclass = parentcl INTO TABLE @lt_result.
优势:
这种写法的层级逻辑更明确,HIERARCHY关键字统一声明层级规则,配合专用导航函数(如HIERARCHY_PATH、HIERARCHY_LEVEL等)还能扩展获取更多层级相关信息。
两种方式最终都会返回所有以Z开头的包,同时包含其直接父包parentcl和最顶层的根包root,完全替代你原来的循环处理逻辑,代码更简洁且执行效率更高。
内容的提问来源于stack exchange,提问作者rplantiko
相关产品推荐
相关产品推荐

