递归计算层级项目预算(数据结构-树)

来源:互联网 发布:淘宝客还能赚钱吗 编辑:程序博客网 时间:2024/06/05 06:51

*节点定义

 databegin of add_itab occurs 0 ,
        node(10type i,
        parentnode(10type i ,
        folder type c ,
        data type twaer,
      end of add_itab.
data: itab2 like add_itab occurs 0 with header line.
data: total type bp_wjt.

*待处理的数据

 data :begin of zs_disp occurs 0,
        stufe type prps-stufe,
        posid type prps-posid,
        post1 type prps-post1,
        wtges1 type bpge-wtges,
        wtges2 type bpge-wtges,
        wtges3 type bpge-wtges,
        wtges4 type bpge-wtges,
      end of zs_disp.
data :begin of gt_item_d occurs 0.
        include structure zs_disp.
dataend of gt_item_d.

*建树
loop at ltmp_gt_item_d into ls_gt_item_d.
  lv_c1 = lv_c1 + 1.
      add_itab-data = ls_gt_item_d-wtges3.
      add_itab-node = lv_c1.
      add_itab-folder = 'X'.
  if ls_gt_item_d-post1 = ''.
      add_itab-parentnode =''.
      else.
        lv_c2 = 0.
        loop at ltmp_gt_item_d into ls_gt_item_d1.
          lv_c2 = lv_c2 + 1.
              if ls_gt_item_d1-posid = ls_gt_item_d-post1.
                add_itab-parentnode = lv_c2.
                endif.
          endloop.
    endif.

    clear ls_gt_item_d1.
    lv_c = 0.
    loop at ltmp_gt_item_d into ls_gt_item_d1.
        if ls_gt_item_d1-post1 = ls_gt_item_d-posid.
            lv_c = lv_c + 1.
        endif.
      endloop.
    if lv_c = 0.
        add_itab-folder = ''.
      endif.
    if add_itab-folder = 'X'."避免重复累加
       clear add_itab-data .
      endif.

   append add_itab."树
endloop.

以下是树表

*对每个节点值递归累加,结果存入total

 loop at gt_item_d[] into ls_gt_item_d.
   lv_c = lv_c + 1.
   clear total.
   perform get_tree_sum using lv_c changing total.
   ls_gt_item_d-wtges3 = total.
   modify gt_item_d[] from ls_gt_item_d.
   endloop.

*以下为递归form,(node为节点index)

 form get_tree_sum  using value(node) type i
                 changing sum type bp_wjt.
  data: l_sum type bp_wjt.
  loop at add_itab where node = node"当为最低叶子节点,则返回当前叶子的值
                        and folder = ''.
    sum = add_itab-data .
  endloop.
  loop at add_itab where parentnode = node .
    clear l_sum.
    if add_itab-folder = ''.
      sum = sum + add_itab-data .
      continue.
    endif.
    perform get_tree_sum using add_itab-node
                        changing l_sum.
    sum = sum + l_sum.
  endloop.
* loop at ADD_itab where parentnode = node .
*    if ADD_itab-folder = ''.
*      sum = sum + ADD_itab-DATA .
*    endif.
*    perform GET_TREE_SUM using ADD_itab-node sum.
*  endloop.
endform.                    " GET_TREE_SUM

 

 

另外,如果需要能使字段输入负数,需要V,长度不足由“_”填充

 

原创粉丝点击