以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  关于绑定表  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=91787)

--  作者:lk15502
--  发布时间:2016/10/19 8:20:00
--  关于绑定表
织造产量表有一列“织造人员”是多值字段,填入姓名和织造重量,如张山-256.8,李四-257.9,王五-123.6,诸葛亮-159.8;在combobox的selectedindexchanged事件写入代码,模仿帮助中多值字段统计产量,并绑定表,请老师看看代码可以改动的地方,
Dim month As Integer = e.sender.text
Dim Year As Integer = Date.Today.Year
Dim day As Integer = Date.Today.day

If month = 1 Then
    Dim dt1 As Date = New Date(Year,1,1) \'本一年的1月1日
    Dim dt2 As Date = New Date(Year,1,25) \'本年的1月的25日
    
    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("织造产量表").Select("[织造日期] >= \'" & dt1 & "\' and [织造日期] <= \'" & dt2 & "\'")
        If dr1.IsNull("织造人员") = False AndAlso 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 nm1() As String = nm.split("-")
                Dim v As Double = val(nm1(1))
                Dim dr2 As DataRow
                If lst.ContainsKey(nm1(0)) \'如果集合中包括此姓名对应的行
                    dr2= lst(nm1(0)) \'将此行赋值给变量dr2
                Else
                    dr2 = dt.AddNew() \'否则增加一行.
                    dr2("姓名") = nm1(0) \'新增行的姓名列设置为此姓名
                    lst.add(nm1(0),dr2) \'将新增行添加到字典中,以便接下来检索
                End If
                dr2("数量") = dr2("数量") + v \'加上姓名"-"后的重量
            Next
        End If
    Next
    Tables("织造产量表_Table2").DataSource = dt
    
ElseIf month = 12 Then
    Dim dt1 As Date = New Date(Year,11,26) \'上个月26日
    Dim dt2 As Date = New Date(Year,12,31) \'本月的31日
    
    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("织造产量表").Select("[织造日期] >= \'" & dt1 & "\' and [织造日期] <= \'" & dt2 & "\'")
        If dr1.IsNull("织造人员") = False AndAlso 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 nm1() As String = nm.split("-")
                Dim v As Double = val(nm1(1))
                Dim dr2 As DataRow
                If lst.ContainsKey(nm1(0)) \'如果集合中包括此姓名对应的行
                    dr2= lst(nm1(0)) \'将此行赋值给变量dr2
                Else
                    dr2 = dt.AddNew() \'否则增加一行.
                    dr2("姓名") = nm1(0) \'新增行的姓名列设置为此姓名
                    lst.add(nm1(0),dr2) \'将新增行添加到字典中,以便接下来检索
                End If
                dr2("数量") = dr2("数量") + v \'加上姓名"-"后的重量
            Next
        End If
    Next
    Tables("织造产量表_Table2").DataSource = dt
    
ElseIf month = 365 Then
    Dim dt1 As Date = New Date(Year,1,1) \'1月1日
    Dim dt2 As Date = New Date(Year,12,31) \'12月的31日
    
    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("织造产量表").Select("[织造日期] >= \'" & dt1 & "\' and [织造日期] <= \'" & dt2 & "\'")
        If dr1.IsNull("织造人员") = False AndAlso 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 nm1() As String = nm.split("-")
                Dim v As Double = val(nm1(1))
                Dim dr2 As DataRow
                If lst.ContainsKey(nm1(0)) \'如果集合中包括此姓名对应的行
                    dr2= lst(nm1(0)) \'将此行赋值给变量dr2
                Else
                    dr2 = dt.AddNew() \'否则增加一行.
                    dr2("姓名") = nm1(0) \'新增行的姓名列设置为此姓名
                    lst.add(nm1(0),dr2) \'将新增行添加到字典中,以便接下来检索
                End If
                dr2("数量") = dr2("数量") + v \'加上姓名"-"后的重量
            Next
        End If
    Next
    
Else
    Dim dt1 As Date = New Date(Year,(Month - 1),26) \'上个月26日&
    Dim dt2 As Date = New Date(Year,Month,25) \'本月的25日
    
    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("织造产量表").Select("[织造日期] >= \'" & dt1 & "\' and [织造日期] <= \'" & dt2 & "\'")
        If dr1.IsNull("织造人员") = False AndAlso 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 nm1() As String = nm.split("-")
                Dim v As Double = val(nm1(1))
                Dim dr2 As DataRow
                If lst.ContainsKey(nm1(0)) \'如果集合中包括此姓名对应的行
                    dr2= lst(nm1(0)) \'将此行赋值给变量dr2
                Else
                    dr2 = dt.AddNew() \'否则增加一行.
                    dr2("姓名") = nm1(0) \'新增行的姓名列设置为此姓名
                    lst.add(nm1(0),dr2) \'将新增行添加到字典中,以便接下来检索
                End If
                dr2("数量") = dr2("数量") + v \'加上姓名"-"后的重量
            Next
        End If
    Next
    Tables("织造产量表_Table2").DataSource = dt
End If

--  作者:lk15502
--  发布时间:2016/10/19 8:35:00
--  
代码中dr2("数量“)改成dr2("重量")
--  作者:有点蓝
--  发布时间:2016/10/19 9:52:00
--  
Dim month As Integer = e.sender.text
Dim Year As Integer = Date.Today.Year
Dim day As Integer = Date.Today.day
Dim dt1 As Date
Dim dt2 As Date
If month = 1 Then
    dt1= New Date(Year,1,1) \'本一年的1月1日
    dt2 = New Date(Year,1,25) \'本年的1月的25日
ElseIf month = 12 Then
    dt1= New Date(Year,11,26) \'上个月26日
    dt2 = New Date(Year,12,31) \'本月的31日

ElseIf month = 365 Then
    dt1= New Date(Year,1,1) \'1月1日
    dt2 = New Date(Year,12,31) \'12月的31日
Else
    dt1= New Date(Year,(Month - 1),26) \'上个月26日&
    dt2 = New Date(Year,Month,25) \'本月的25日
End If

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("织造产量表").Select("[织造日期] >= \'" & dt1 & "\' and [织造日期] <= \'" & dt2 & "\'")
    If dr1.IsNull("织造人员") = False AndAlso 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 nm1() As String = nm.split("-")
            Dim v As Double = val(nm1(1))
            Dim dr2 As DataRow
            If lst.ContainsKey(nm1(0)) \'如果集合中包括此姓名对应的行
                dr2= lst(nm1(0)) \'将此行赋值给变量dr2
            Else
                dr2 = dt.AddNew() \'否则增加一行.
                dr2("姓名") = nm1(0) \'新增行的姓名列设置为此姓名
                lst.add(nm1(0),dr2) \'将新增行添加到字典中,以便接下来检索
            End If
            dr2("数量") = dr2("数量") + v \'加上姓名"-"后的重量
        Next
    End If
Next
Tables("织造产量表_Table2").DataSource = dt



--  作者:lk15502
--  发布时间:2016/10/19 10:09:00
--  
试运行出现错误:
.NET Framework 版本:2.0.50727.5485
Foxtable 版本:2016.7.29.1
错误所在事件:窗口,织造产量表,ComboBox1,SelectedIndexChanged
详细错误信息:
索引超出了数组界限。

--  作者:有点蓝
--  发布时间:2016/10/19 10:45:00
--  
调试技巧:http://www.foxtable.com/webhelp/scr/1485.htm

看看是哪句代码有问题,也可能是数据的问题