分级提成计算
请先打开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.2
/ 2 ^ (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 Double =
cr("提成")
* 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 Double =
cr("提成")
* 0.4
'计算扣除额
cr("提成")
= cr("提成")
- deduct
'从
子行减去扣除额
pr("提成")
= pr("提成")
+ deduct
'将扣除额加到父行中
Exit For
End If
Next
Next
MainTable
= Tables("统计表1")