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

|