分级提成计算

请先打开CaseStudy目录下的实例文件: 分级数据.Table

选择表"销售A":

假定每个员工销售一件产品的提成是8元,每个员工的提成额要扣除20%给上级,再扣除10%给上级的上级,再扣除5%给上级的上级的上级......

那么如何计算每个员工的实际提成收入呢?

Foxtable并没有内置提成计算功能,但利用我们前面已经学到的知识,可以轻松地完成这个任务。

完成这个任务的关键在于:

在折叠模式下,我们能通过Row的
Hierarchy属性获得其层级值,据此遍历找出其全部下级行,并根据二者的Hierarchy属性差值计算出扣除额。

可以在命令窗口执行以下代码,这段代码有详尽的注释,请认真学习理解:

'统计各员工销量
Dim
st As new InlineGroupTableBuilder("统计表1")
st
.DataTable = DataTables("销售A")
st
.ParentCol = "上级"
st
.ChildCol = "员工"
st
.GridTree = True  '一定要开启折叠模式
st
.AddTotal("数量","销量", 0)
st
.Build()
'增加一个提成列, 并计算出每个员工的直接销售提成

DataTables
("统计表1").DataCols.Add("提成", Gettype(Double))
DataTables
("统计表1").DataCols("提成").SetFormat("0.00") '提成列保留两位小数
Dim
tbl As Table = Tables("统计表1")
For
n As Integer = 0 To tbl.Rows.Count - 1
    tbl.Rows(n)(
"
提成") = tbl.Rows(n)("销量")  * 8
Next
For
n As Integer = 0 To tbl.Rows.Count - 1 
    Dim pr As Row = tbl.Rows(n)
'
上级
    Dim pHierarchy As Integer = pr.Hierarchy
'
上级 行的层级
    For m As Integer = n + 1 To tbl.Rows.Count - 1 
'
上级行的下一行位置开始遍历,找出全部下级行
        Dim cr As Row = tbl.Rows(m)
        Dim cHierarchy As Integer = cr.Hierarchy
'
下级行层级   
        If cr.Hierarchy <= pHierarchy  Then 
'
如果并非下级行,则终止遍历。
            Exit For
        End If
        Dim deduct As Double = cr(
"
销量")  * 8  * 0.22 ^ (cHierarchy - pHierarchy  - 1) '计算扣除额
        cr(
"
提成") = cr("提成") - deduct '从下级行减去扣除额
        pr(
"
提成") = pr("提成") + deduct '将扣除额加到本行中
   
Next

Next
MainTable
= Tables("统计表1")

我们可以直接指定每一层的扣除比例,例如规定前6层下级行的扣除比例分别为:

20%, 8%,6%, 5%, 3%, %1

从第7层开始的下级行不再扣除。

代码如下,可以直接在命令窗口测试执行:

'统计各员工销量
Dim
st As new InlineGroupTableBuilder("统计表1")
st
.DataTable = DataTables("销售A")
st
.ParentCol = "上级"
st
.ChildCol = "员工"
st
.GridTree = True  '一定要开启折叠模式
st
.AddTotal("数量","销量", 0)
st
.Build()
'增加一个提成列, 并计算出每个员工的直接销售提成

DataTables
("统计表1").DataCols.Add("提成", Gettype(Double))
DataTables
("统计表1").DataCols("提成").SetFormat("0.00") '提成列保留两位小数
Dim
tbl As Table = Tables("统计表1")
For
n As Integer = 0 To tbl.Rows.Count - 1
    tbl.Rows(n)(
"
提成") = tbl.Rows(n)("销量")  * 8
Next
Dim
pcts() As Double = {0.2, 0.08, 0.06, 0.05, 0.03, 0.01} ' 各层下级行的扣除比例
For
n As Integer = 0 To tbl.Rows.Count - 1 
    Dim pr As Row = tbl.Rows(n)
'
上级行
    Dim pHierarchy As Integer = pr.Hierarchy
'
上级行的层级
    For m As Integer = n + 1 To tbl.Rows.Count - 1 
'
从上级行的下一行位置开始遍历,找出全部下级行
        Dim cr As Row = tbl.Rows(m)
        Dim cHierarchy As Integer = cr.Hierarchy
'
下级行层级   
        If cr.Hierarchy <= pHierarchy  Then 
'
如果并非下级行,则终止遍历.
            Exit For
        End If
        Dim dif As Integer = cHierarchy  - pHierarchy
'
计算层级差
        If dif < 7 Then
'
层级差不超过7的下级行,才予以扣除
            Dim deduct As Double = cr(
"
销量")  * 8  * pcts(dif - 1) '计算扣除额
            cr(
"
提成") = cr("提成") - deduct '从下级行减去扣除额
            pr(
"
提成") = pr("提成") + deduct '将扣除额加到上级行中
        End If
   
Next

Next
MainTable
= Tables("统计表1")

另一种扣除方式

前面的扣除方式,是从上往下的:遍历上级行的所有下级行,根据层级深度,从下级行的直接销售提成中扣除一定比例,并添加到上级行中。

下级行还有自己的下级行,可以从自己的下级行中获得一定比例的销售提成,这一部分并不会被扣除到上级行中,如果这部分的提成也需要扣除一定比例到上级行中,那么就需要从下往上计算了。

假定现在的提成方式是:

每个员工销售一件产品的提成是8元,每个员工的提成要扣除40%给上级,而上级的合计提成(上级的直接销售提成 + 所有下级销售提成的40%)也要扣除40%给上级的上级......


这种从下往上的扣除方式,处理起来更加简单。

下面是完成这个任务的代码,你可以在命令窗口测试执行:

'统计各员工销量

Dim
st As new InlineGroupTableBuilder("统计表1")
st
.DataTable = DataTables("销售A")
st
.ParentCol = "上级"
st
.ChildCol = "员工"
st
.GridTree = True  '一定要开启折叠模式
st
.AddTotal("数量","销量", 0)
st
.Build()
'增加一个提成列, 并计算出每个员工的直接销售提成

DataTables
("统计表1").DataCols.Add("提成", Gettype(Double))
DataTables
("统计表1").DataCols("提成").SetFormat("0.00") '提成列保留两位小数
Dim
tbl As Table = Tables("统计表1")
For
n As Integer = 0 To tbl.Rows.Count - 1
    tbl.Rows(n)(
"
提成") = tbl.Rows(n)("销量") * 8
Next
For
n As Integer = tbl.Rows.Count - 1 To 0  Step - 1 '从下往上遍历
    Dim cr As Row = tbl.Rows(n)
'
下级行
    Dim cHierarchy As Integer = cr.Hierarchy
'
下级行层级
    For m As Integer = n - 1 To 0 Step - 1 
'
同样从下往上遍历,找出父行
        Dim pr As Row = tbl.Rows(m)
        Dim pHierarchy As Integer = pr.Hierarchy '
        If cr.Hierarchy = pHierarchy + 1 Then 
'
如果是父行
            Dim deduct As Doublecr(
"
提成") * 0.4  '计算扣除额
            cr(
"
提成")  =  cr("提成")  - deduct ' 从子行减去扣除额
            pr(
"
提成") = pr("提成")  + deduct '将扣除额加到父行中
            Exit For
        End If
   
Next

Next
MainTable
= Tables("统计表1")

前面的示例使用的都是内联式的销售表,如果换成层级式的BOM表,需要修改的只是统计部分的代码,其余代码完全相同,例如对于表"销售B":

完成同样的分级销售提成计算的代码如下,变化的只是前面加粗的几行代码而已:

'统计各员工销量
Dim
st As new LayersGroupTableBuilder("统计表1")
st
.DataTable = DataTables("销售B")
st
.PathCol= "层级"
st
.NameCol = "员工"
st
.Separator = "."
st
.GridTree = True  '一定要开启折叠模式
st
.AddTotal("数量","销量", 0)
st
.Build()
'增加一个提成列, 并计算出每个员工的直接销售提成

DataTables
("统计表1").DataCols.Add("提成", Gettype(Double))
DataTables
("统计表1").DataCols("提成").SetFormat("0.00") '提成列保留两位小数
Dim
tbl As Table = Tables("统计表1")
For
n As Integer = 0 To tbl.Rows.Count - 1
    tbl.Rows(n)(
"
提成") = tbl.Rows(n)("销量") * 8
Next
For
n As Integer = tbl.Rows.Count - 1 To 0  Step - 1 '从下往上遍历
    Dim cr As Row = tbl.Rows(n)
'
下级行
    Dim cHierarchy As Integer = cr.Hierarchy
'
下级行层级
    For m As Integer = n - 1 To 0 Step - 1 
'
同样从下往上遍历,找出父行
        Dim pr As Row = tbl.Rows(m)
        Dim pHierarchy As Integer = pr.Hierarchy '
        If cr.Hierarchy = pHierarchy + 1 Then 
'
如果是父行
            Dim deduct As Doublecr(
"
提成") * 0.4  '计算扣除额
            cr(
"
提成")  =  cr("提成")  - deduct '从 子行减去扣除额
            pr(
"
提成") = pr("提成")  + deduct '将扣除额加到父行中
            Exit For
        End If
   
Next

Next
MainTable
= Tables("统计表1")


本页地址:http://www.foxtable.com/webhelp/topics/3387.htm