以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]自定义函数或递归问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=99356)

--  作者:aidimeng
--  发布时间:2017/4/17 23:43:00
--  [求助]自定义函数或递归问题

有这样一个人员架构

会员编号  上一级   下一级左  下一级右 

 

 

 

简单画了个人员拓扑图


图片点击可在新窗口打开查看此主题相关图片如下:2017497495139274.png
图片点击可在新窗口打开查看

 

每个圆圈代表一个人员,现在想计算 图中每个圆圈下 左右两分支的总和,

 

想用自定义函数,但是 实在不知道怎么处理,希望高手给于帮助


图片点击可在新窗口打开查看此主题相关图片如下:qq图片20170417234058.png
图片点击可在新窗口打开查看
 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目2.rar

[此贴子已经被作者于2017/4/18 9:38:27编辑过]

--  作者:狐狸爸爸
--  发布时间:2017/4/18 9:55:00
--  
做个按钮,代码:

Dim nms() As String = {"a","b"}
For Each r As DataRow In DataTables("员工信息表").DataRows
    For Each nm As String In nms
        Dim cnt As Integer = 0
        Dim tr As DataRow = r
        Do
            If tr.IsNull("下级_" & nm) = False Then
                cnt = cnt + 1
                tr = DataTables("员工信息表").Find("会员编号 = \'" & tr("下级_" & nm) & "\'")
                If tr Is Nothing Then
                    Exit Do
                End If
            Else
                Exit Do
            End If
        Loop
        r("累积_" & nm) = cnt
    Next
Next

--  作者:有点蓝
--  发布时间:2017/4/18 10:25:00
--  
使用递归

函数Chid

Dim dr As DataRow = Args(0)
Dim t As Table = args(1)
Dim sum As Integer = dr("对碰累积_A") + dr("对碰累积_B")
Dim drs As List(Of DataRow) = DataTables("员工信息表").Select("上级=\'" & dr("会员编号") & "\'")
If drs.Count > 0 Then
    For Each dr2 As DataRow In drs
        sum += Functions.Execute("Chid",dr2,t)
    Next
End If
Dim rr As Row = t.AddNew
rr("会员编号")=dr("会员编号")
rr("累积业绩") = sum
Return sum

计算按钮事件
Tables("工资计算_table1").StopRedraw
For Each dr As DataRow In DataTables("员工信息表").Select("上级 is null")
    Functions.Execute("Chid",dr,Tables("工资计算_table1"))
Next
Tables("工资计算_table1").ResumeRedraw

--  作者:aidimeng
--  发布时间:2017/4/18 13:18:00
--  

执行了 没结果,递归方法需要有两个返回值


--  作者:aidimeng
--  发布时间:2017/4/18 13:28:00
--  
Dim dr As DataRow = Args(0)
Dim t As Table = args(1)
Dim sum As Integer = dr("对碰累积_A") + dr("对碰累积_B")
Dim drs As List(Of DataRow) = DataTables("员工信息表").Select("上级=\'" & dr("会员编号") & "\'") -----集合中最多包含两个值
If drs.Count > 0 Then
    For Each dr2 As DataRow In drs  
          if  dr("下级_A")= dr2("会员编号")  then   ---计算dr("会员编号")A分支的和
        sum += Functions.Execute("Chid",dr2,t)
       endif
    Next
End If
Dim rr As Row = t.AddNew
rr("会员编号")=dr("会员编号")
rr("累积业绩") = sum
Return sum
-----函数需要两个返回值的
计算按钮事件
Tables("工资计算_table1").StopRedraw
For Each dr As DataRow In DataTables("员工信息表").Select("上级 is null")
    Functions.Execute("Chid",dr,Tables("工资计算_table1"))
Next
Tables("工资计算_table1").ResumeRedraw

--  作者:有点蓝
--  发布时间:2017/4/18 14:12:00
--  
没看懂你的问题。截图说明最终结果是怎么样的
--  作者:aidimeng
--  发布时间:2017/4/18 14:20:00
--  


图片点击可在新窗口打开查看此主题相关图片如下:qq图片20170418141630.png
图片点击可在新窗口打开查看

 

以黄色圆为例:

1、目标是 计算黄色圆 累积_A 与累积_B 的值,

2、计算过程:计算黄色圆左边分支的时候 是   黄色圆 的 累积_A+ 蓝色圆(含本身)以下的  累积_A+ 累积_B 的和。 右边同理

[此贴子已经被作者于2017/4/18 14:24:26编辑过]

--  作者:有点蓝
--  发布时间:2017/4/18 14:36:00
--  
依然糊涂。到工资表手工整个最终计算结果看看
--  作者:aidimeng
--  发布时间:2017/4/18 14:56:00
--  


图片点击可在新窗口打开查看此主题相关图片如下:qq图片20170418145244.jpg
图片点击可在新窗口打开查看

画的不好,我的qq281706265


--  作者:aidimeng
--  发布时间:2017/4/18 18:35:00
--  
我手画下 表 您帮我看下吧  谢谢