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

论坛 期权论坛 脚本     
匿名技术用户   2021-1-4 16:12   24   0

*节点定义

data: begin of add_itab occurs 0 ,
node(10) type i,
parentnode(10) type 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.
data: end 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,长度不足由“_”填充

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP