*节点定义
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,长度不足由“_”填充