需求:计算下面树形结构中每个子节点与最上层父节点的对应关系。

DATA:BEGIN OF lt_ztab OCCURS 0,
      a  TYPE string,
      b  TYPE string,
     END OF lt_ztab.
DATA:lw_ztab LIKE LINE OF lt_ztab,
     lw_ztab1 LIKE LINE OF lt_ztab,
     lt_ltab LIKE TABLE OF lt_ztab WITH HEADER LINE.

DATA:BEGIN OF lt_mtab OCCURS 0,
      m  TYPE string,
END OF lt_mtab.

DATA:lw_mtab LIKE LINE OF lt_mtab.
DATA:l_a TYPE string,
     l_b TYPE string.
lw_ztab-a = 'A'.
lw_ztab-b = 'B'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'B'.
lw_ztab-b = 'D'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'B'.
lw_ztab-b = 'E'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'D'.
lw_ztab-b = 'M'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'M'.
lw_ztab-b = 'W'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'M'.
lw_ztab-b = 'L'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'C'.
lw_ztab-b = 'F'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'F'.
lw_ztab-b = 'N'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'C'.
lw_ztab-b = 'G'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'C'.
lw_ztab-b = 'H'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'A'.
lw_ztab-b = 'C'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'A1'.
lw_ztab-b = 'B1'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'B1'.
lw_ztab-b = 'D1'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'B1'.
lw_ztab-b = 'E1'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'D1'.
lw_ztab-b = 'M1'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'C1'.
lw_ztab-b = 'F1'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'F1'.
lw_ztab-b = 'N1'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'C1'.
lw_ztab-b = 'G1'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'C1'.
lw_ztab-b = 'H1'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'A1'.
lw_ztab-b = 'C1'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'X'.
lw_ztab-b = 'Y'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'X'.
lw_ztab-b = 'C'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'X1'.
lw_ztab-b = 'Y1'.
APPEND lw_ztab TO lt_ztab.

lw_ztab-a = 'X1'.
lw_ztab-b = 'B'.
APPEND lw_ztab TO lt_ztab.

lw_mtab-m = 'A'.
APPEND lw_mtab TO lt_mtab.

lw_mtab-m = 'A1'.
APPEND lw_mtab TO lt_mtab.

lw_mtab-m = 'X'.
APPEND lw_mtab TO lt_mtab.

lw_mtab-m = 'X1'.
APPEND lw_mtab TO lt_mtab.

SORT lt_ztab BY a b.

LOOP AT lt_mtab INTO lw_mtab.
  LOOP AT lt_ztab INTO lw_ztab WHERE a = lw_mtab-m.

l_a = lw_ztab-a.
    l_b =  lw_ztab-b .

PERFORM: get_lastdata USING l_a l_b .

ENDLOOP.
ENDLOOP.

LOOP AT lt_ltab.
  WRITE: / lt_ltab-a,lt_ltab-b.
ENDLOOP.

FORM get_lastdata USING p_a TYPE string  p_b TYPE string.

lt_ltab-a = p_a.
  lt_ltab-b = p_b.
  APPEND lt_ltab.

READ TABLE lt_ztab WITH KEY a = p_b BINARY SEARCH.
  IF sy-subrc NE 0.
    EXIT.
  ELSE.
    LOOP AT lt_ztab INTO lw_ztab1 WHERE a = p_b.
      PERFORM: get_lastdata USING p_a lw_ztab1-b .
    ENDLOOP.
  ENDIF.

ENDFORM.

执行结果:

ABAP写的一个递归的更多相关文章

  1. 原生js写的一个弧形菜单插件

    弧形菜单是一种半弧式或者全弧形菜单,是一种不同于传统横向或者竖向菜单形式的菜单.最近在网上看到好多人写出了这种效果,于是也尝试自己写了一个. 实现方式:原生态js 主要结构: 1.参数合并 var d ...

  2. 输入一个数字n 如果n为偶数则除以2,若为奇数则加1或者减1,直到n为1,求最少次数 写出一个函数

    题目: 输入一个数字n  如果n为偶数则除以2,若为奇数则加1或者减1,直到n为1,求最少次数  写出一个函数 首先,这道题肯定可以用动态规划来解, n为整数时,n的解为 n/2 的解加1 n为奇数时 ...

  3. C# winfrom 写的一个搜索助手,可以按照标题和内容搜索,支持doc,xls,ppt,pdf,txt等格式的文件搜索

    C# winfrom 写的一个搜索助手,可以按照标题和内容搜索,指定目录后,遍历搜索文件和子目,现在只写了支持.DOC.DOCX.XLS.XLSX.PPT.PPTX.PDF.HTML.HTM.TXT等 ...

  4. 今天写了一个简单的新浪新闻RSS操作类库

    今天,有位群友问我如何获新浪新闻列表相关问题,我想,用正则表达式网页中取显然既复杂又不一定准确,现在许多大型网站都有RSS集合,所以我就跟他说用RSS应该好办一些. 一年前我写过一个RSS阅读器,不过 ...

  5. 搞了我一下午竟然是web.config少写了一个点

    Safari手机版居然有个这么愚蠢的bug,浪费了我整个下午,使尽浑身解数,国内国外网站搜索解决方案,每一行代码读了又想想了又读如此不知道多少遍,想破脑袋也想不通到底哪里出了问题,结果竟然是web.c ...

  6. 用C3中的animation和transform写的一个模仿加载的时动画效果

    用用C3中的animation和transform写的一个模仿加载的时动画效果! 不多说直接上代码; html标签部分 <div class="wrap"> <h ...

  7. 写了一个常规性生成merge 的小脚本

    现在使用数据库来写存储过程,动不动参数就会用到xml ,当然罗,优势也很明显,参数相对固定,而且灵活,如果要修改或者什么的,中间接口层也不需要做变化,只需要修改封装的存储过程以及程序传参就ok了. 随 ...

  8. c# .Net :Excel NPOI导入导出操作教程之List集合的数据写到一个Excel文件并导出

    将List集合的数据写到一个Excel文件并导出示例: using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using System;using Sys ...

  9. 自己写的一个SqlHelper,感觉使用起来挺方便的

    自己写的一个SqlHelper,感觉使用起来挺方便的 using System; using System.Data; using System.Collections.Generic; using ...

随机推荐

  1. android开发之SnackBar的使用

    SnackBar是一个类似于Toast的东西,它也有显示时长,但是比Toast更加灵活,同时,我们还可以给SnackBar设置点击事件,那么我们今天就来看看怎么用吧! 先来一张效果图: 这种效果大家可 ...

  2. c语言,strcpy

    #include <stdio.h> #include <string.h> int main() {  char string[10];  char *str="a ...

  3. JavaScript日常会跳的坑系列(二)

    1.Number()将部分非数字类型转换为0 强制转换为数值类型函数: parseFloat.parseInt 优点:对非数值类型统一返回NaN 缺点:会将一部分符合数值类型的字符串也识别为数值 pa ...

  4. VS 2013 Chrome PPAPI 开发环境

    当前系统版本为 Windows 8.1 x64, Chrome 版本为 50.0 1. 准备工作 下载并安装 Python https://www.python.org/download/ * 必须使 ...

  5. ASP.NET MVC 使用Echarts

    Echarts官网 页面配置: <!DOCTYPE html> <html> <head> <meta name="viewport" c ...

  6. 在 APK 中找不到对应的 securityguard***.so 文件或者 so 文件载入出错

    1.解压查看你的apk是不是将so打进去了,如果没有打进入查看自己的jnilibs是否指定 2.查看手机是否是64的手机.因为百川的安全包没有64的支持,所以目前是以兼容包的形式给的包.如果第三方有6 ...

  7. Android开发之Adapter

    学习android时,对于我这种初学者来说,刚开始接触控件,发现有的控件需要adapter有些不需要,对此我感到不解.所以决定一探究竟. 其实android是一个完全遵从MVC模式的框架,activi ...

  8. store procedure example

    SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- ...

  9. asp.net mvc Remote远程验证

    1.Model实体 /// <summary> /// 课程编号 /// </summary> [MaxLength()] [Remote("IsUnique_Ava ...

  10. ios NSHashTable & NSMapTable

    在ios开发中大家用到更多的集合类可能是像NSSet或者NSDictionary,NSArray这样的.这里要介绍的是更少人使用的两个类,一个是NSMapTable,另一个是NSHashTable. ...