ABAP 递归用法示例

欢迎来到这个奇妙的世界,这个世界充满了惊喜,也充满了挑战,在这里,我们将一起学习、探索、创新,用技术的力量去感知、去理解、去改变这个世界。


前言

最近在项目上很多人问到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 的区别,下一篇文章我将对其介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酔墨诗欣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值