以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  重复行数据处理  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=184537)

--  作者:朱女士
--  发布时间:2022/12/13 10:34:00
--  重复行数据处理
老师:您好!

图片点击可在新窗口打开查看此主题相关图片如下:8481fd9bbf3f2bee82a3c8c59eb3184.jpg
图片点击可在新窗口打开查看
 上表中,我有4行相同的标识(bs),相同的工序耗时,我想将这4行的重量加起来,取一行的工序耗时,按每一行的重量占总重量的比例,去分劈工序耗时,然后再逐行到实际耗时列中,我的代码就填充了一行。其余三行没填进去。请指教!谢谢!(其实:四行实际耗时:是7.73,7.05,4.09,13.65,表中就填了一个7.73)
Dim Nas As New List(Of String)
Dim l As Integer
For Each bbm As String In DataTables("实时工序计算表").GetValues("bs")
    l = bbm.Length
    If l = 18 Then
        nas.Add(bbm)
    End if
Next
Dim j As Integer
Dim dzl, gxhs, zzl As Double

For Each na As String In Nas
    Dim m As Integer = DataTables("实时工序计算表").Compute("count(bs)", "bs=\'" & na & "\'")
    If m > 1 Then
        zzl = DataTables("实时工序计算表").Compute("sum(重量)", "bs=\'" & na & "\'") 
    End If
    For j = 1 To m
        Dim dr As DataRow = DataTables("实时工序计算表").find("bs=\'" & na & "\'")
        If dr IsNot Nothing Then
            gxhs = dr("工序耗时")
            dzl = dr("重量")
            dr("实际耗时") = dzl * gxhs / zzl
        End If
    Next
Next 

--  作者:有点蓝
--  发布时间:2022/12/13 10:42:00
--  
没看懂这个代码逻辑,麻烦解释一下每一行代码的意思
--  作者:朱女士
--  发布时间:2022/12/13 11:23:00
--  
对不起,是我没说清楚!
我先将“实时工序计算表”里的“bs"列的不重复值放在:集合里Dim Nas As New List(Of String)

‘定义集合
Dim Nas As New List(Of String) 
Dim l As Integer
‘将实时工序计算表里的bs列不重复值长度为18的放在集合里
For Each bbm As String In DataTables("实时工序计算表").GetValues("bs")
    l = bbm.Length
判断bsl列的长度
    If l = 18 Then
        nas.Add(bbm)
    End if
Next
Dim j As Integer
Dim dzl, gxhs, zzl As Double
’遍历集合里的每一项
For Each na As String In Nas
  ‘计算实时工序计算表里bs重复的条数m
  Dim m As Integer = DataTables("实时工序计算表").Compute("count(bs)", "bs=\'" & na & "\'")
’如果是多条,就把这个相同bs的m条的重量相加的和为:zzl
    If m > 1 Then
        zzl = DataTables("实时工序计算表").Compute("sum(重量)", "bs=\'" & na & "\'") 
    End If
\'下面取相同bs的单行工序耗时和重量取值,用重量比例加权重量,然后将m条数据逐条填入实际耗时列里,
    For j = 1 To m
        Dim dr As DataRow = DataTables("实时工序计算表").find("bs=\'" & na & "\'")
        If dr IsNot Nothing Then

            gxhs = dr("工序耗时") ’取第一行的工序耗时和重量
            dzl = dr("重量")
       ’当前行的重量dzl,占总重量zzl的比例乘以当前行的工序耗时gxhs等于当前行的实际耗时。
            dr("实际耗时") = dzl * gxhs / zzl  
        End If
    Next
Next 


 

--  作者:有点蓝
--  发布时间:2022/12/13 11:26:00
--  
find改为使用select:http://www.foxtable.com/webhelp/topics/0400.htm
--  作者:朱女士
--  发布时间:2022/12/13 11:28:00
--  
可能就是不会定位行,数据算出来了,就是不会定位填入数。
--  作者:有点蓝
--  发布时间:2022/12/13 11:29:00
--  

        for each dr As DataRow in DataTables("实时工序计算表").select("bs=\'" & na & "\'")
            gxhs = dr("工序耗时") ’取第一行的工序耗时和重量
            dzl = dr("重量")
       ’当前行的重量dzl,占总重量zzl的比例乘以当前行的工序耗时gxhs等于当前行的实际耗时。
            dr("实际耗时") = dzl * gxhs / zzl  
    Next