多值字段与统计
普通用户请忽略本节内容。
本节知识的一个要点是Dictionary,如果你对其已经生疏,请先温习一下。
这是一个很好的使用字典的例子,希望大家能细细体会。
假定有一个下图所示的产量登记表,其中员工工号列是多值字段:
现在需要统计每个员工加工的产品数量,同一个产品,如果有多个员工参与加工,那么产量平分。
显然这样的统计,用传统的统计工具是无法实现的,我们只能手工编码统计,不过代码也不算复杂:
'生成统计表的结构
Dim dt
As
DataTable
Dim dtb
As
New
DataTableBuilder("统计")
dtb.AddDef("工号",
Gettype(String),
16)
dtb.AddDef("数量",
Gettype(Double))
dt = dtb.Build()
'开始逐行累加统计
Dim lst As
New
Dictionary(of
String
,DataRow)
'定义一个字典,用于检索每个员工在统计表中对应的行
For Each dr1 As
DataRow
In DataTables("产量登记").DataRows
If dr1.IsNull("员工工号")
= False Then '如果工号列不为空
Dim nms()
As String
= dr1("员工工号").Split(",")
'将工号列内容拆分成数组
Dim v
As Double
= dr1("数量")
/ nms.Length
'获得平均之后每个工号的生产数量
For Each nm
As String
In nms
'遍历参与加工此产品的每个工号
Dim
dr2 As
DataRow
If
lst.ContainsKey(nm)
'如果集合中包括此工号对应的行
dr2=
lst(nm)
'将此行赋值给变量dr2
Else
dr2 = dt.AddNew()
'否则增加一行.
dr2("工号")
= nm
'新增行的工号列设置为此工号
lst.add(nm,dr2)
'将新增行添加到字典中,以便接下来检索
End If
dr2("数量")
= dr2("数量")
+ v
'加上平均后的产量
Next
End If
Next
在命令窗口执行上面的代码,即可得到如下统计结果:
如果要统计每个员工加工不同产品的数量,代码只需稍微调整一下:
'生成统计表的结构
Dim dt
As
DataTable
Dim dtb
As New DataTableBuilder("统计")
dtb.AddDef("工号",
Gettype(String),
16)
dtb.AddDef("产品",
Gettype(String),
16)
dtb.AddDef("数量",
Gettype(Double))
dt = dtb.Build()
'开始逐行累加统计
Dim lst
As New
Dictionary(of
String ,DataRow)
'定义一个字典,用于检索每个员工在统计表中对应的行
For
Each dr1 As
DataRow
In
DataTables("产量登记").DataRows
If dr1.IsNull("员工工号")
= False
Then
'如果工号列不为空
Dim nms() As
String = dr1("员工工号").Split(",")
'将工号列内容拆分成数组
Dim v As
Double = dr1("数量")
/ nms.Length
'获得平均之后每个工号的生产数量
For
Each
nm
As
String
In
nms
'遍历参与加工此产品的每个工号
Dim dr2
As
DataRow
Dim
key As
String = nm &
"|" & dr1("产品")
'这里是关键,由工号和产品组成字典的关键词.
If
lst.ContainsKey(key)
'如果集合中包括此关键词对应的行
dr2= lst(key) '将此行赋值给变量dr2
Else
dr2 = dt.AddNew() '否则增加一行.
dr2("工号")
= nm '新增行的工号列设置为此工号
dr2("产品")
= dr1("产品")
'设置增行的产品
lst.add(key,dr2)
'将新增行添加到字典中,以便接下来检索
End
If
dr2("数量")
= dr2("数量") + v
'加上平均后的产量
Next
End
If
Next
MainTable = Tables("统计")
本页地址:http://www.foxtable.com/webhelp/topics/2400.htm