欢迎来到这个奇妙的世界,这个世界充满了惊喜,也充满了挑战,在这里,我们将一起学习、探索、创新,用技术的力量去感知、去理解、去改变这个世界。
前言
最近在项目上很多人问到ABAP中的递归不知道如何写,我写了一段递归的示例代码,供大家学习与参考
一、递归示例
FUNCTION zkpi_get_fjh_xueyuan .
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_KPI) TYPE STRING
*" EXPORTING
*" VALUE(E_KPI) TYPE STRING
*"----------------------------------------------------------------------
PERFORM frm_create_yz CHANGING i_kpi.
"每次递归的结果传值给I_KPI,需要再次放入内表进行去重输出
SPLIT i_kpi AT ',' INTO TABLE DATA(lt_kpi).
SORT lt_kpi BY table_line.
DELETE ADJACENT DUPLICATES FROM lt_kpi COMPARING table_line.
CONCATENATE LINES OF lt_kpi INTO DATA(e_all) SEPARATED BY ','.
e_kpi = e_all.
ENDFUNCTION.
FORM frm_create_yz CHANGING i_kpi.
DATA: BEGIN OF ls_kpi_master,
zasset_id TYPE char64, "指标编码 表 ZKPI_MASTER_MAIN
zindex_classification TYPE char64, "类型 表 ZKPI_MASTER_MAIN
ztarget_metadata_obj_name TYPE char64, "目标模型名称 表 ZKPI_MASTER_MAIN
zsub_index_code TYPE char64, "子指标code(指标编码+值编码) ,指标名称。需在目标模型中添加此字段 ,表 ZKPI_SOURCE_GN
zindex_source_id TYPE char64, "UUID子指标来源关联表 ZKPI_REL_GN
zbase_metadata_obj_name TYPE char64, "基础模型名称 ZKPI_REL_GN
zacross_source_access TYPE char64, "跨系统取数来源标识 ZKPI_REL_GN:1表示C22,2表示新报表
zindex_table TYPE char64, "落地表 ZKPI_REL_GN
zaggregation_status TYPE char64,
zdatasource_id TYPE char64,
END OF ls_kpi_master,
lt_kpi_master LIKE TABLE OF ls_kpi_master.
DATA: BEGIN OF ls_kpi,
node_code(20) TYPE c,
END OF ls_kpi.
DATA: BEGIN OF ls_kpi2,
node_code(20) TYPE c,
END OF ls_kpi2.
DATA:lt_kpi LIKE STANDARD TABLE OF ls_kpi,
lt_kpi2 LIKE STANDARD TABLE OF ls_kpi2.
RANGES:lr_zasset_id FOR ls_kpi_master-zasset_id.
"取非聚合指标的所有因子
SELECT
SINGLE zexpr_from
INTO @DATA(lv_fyz)
FROM zpkpi_complex_ex
WHERE zcomplex_asset_id = @i_kpi
AND zexpr_from <> ''.
IF lv_fyz IS INITIAL.
i_kpi = space.
RETURN.
ENDIF.
" 将所有_A替换成空格
REPLACE ALL OCCURRENCES OF '_A' IN lv_fyz WITH space.
"分割所有因子到内表中
SPLIT lv_fyz AT ',' INTO TABLE lt_kpi.
SORT lt_kpi BY node_code.
DELETE ADJACENT DUPLICATES FROM lt_kpi COMPARING node_code.
"将因子指标放入 RANGE 表中
LOOP AT lt_kpi ASSIGNING FIELD-SYMBOL(<fs_kpi>).
lr_zasset_id-sign = 'I'.
lr_zasset_id-option = 'EQ'.
lr_zasset_id-low = <fs_kpi>-node_code.
APPEND lr_zasset_id.
ENDLOOP.
" 取出因子的属性,主要区别基础指标、可聚合指标、非聚合指标
SELECT
c~zasset_id
c~zindex_classification
c~ztarget_metadata_obj_name
b~zsub_index_code
a~zindex_source_id
a~zbase_metadata_obj_name
a~zacross_source_access
a~zindex_table
a~zaggregation_status
a~zdatasource_id "来自源系统标识
FROM zpkpi_rel_gn AS a
INNER JOIN zpkpi_source_gn AS b ON a~zindex_source_id = b~zindex_source_id
INNER JOIN zpkpi_master_mai AS c ON a~zasset_id = c~zasset_id
INTO CORRESPONDING FIELDS OF TABLE lt_kpi_master
WHERE c~zasset_id IN lr_zasset_id
AND a~zindex_table <> ''
AND b~zsort = '1'.
"循环因子,如果因子中包含非聚合,继续调用FM,进行再次递归查找因子
LOOP AT lt_kpi_master ASSIGNING FIELD-SYMBOL(<fs_kpi_master>).
IF <fs_kpi_master>-zindex_classification = '2' AND <fs_kpi_master>-zaggregation_status = '1'.
PERFORM frm_create_yz CHANGING <fs_kpi_master>-zasset_id.
ENDIF.
ENDLOOP.
" 将因子指标放入最终内表
SELECT zasset_id AS node_code FROM @lt_kpi_master AS node INTO TABLE @DATA(lt_node).
SORT lt_node BY table_line.
DELETE ADJACENT DUPLICATES FROM lt_node COMPARING table_line.
"按逗号分割输出
CONCATENATE LINES OF lt_node INTO DATA(lv_kpi) SEPARATED BY ','.
i_kpi = lv_kpi.
ENDFORM.
总结
递归用法的使用重点在于PERFORM 中 CHANGING 的使用,要重点理解CHANGING 与USING 的区别,下一篇文章我将对其介绍。