以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  跨表统计  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=178306)

--  作者:张飞
--  发布时间:2022/6/28 23:24:00
--  跨表统计
两个表:混凝土设计量,混凝土统计明细,混凝土设计量 的 实耗量列=混凝土统计明细 运输方量 列 统计之和,
混凝土统计明细表DataColChanged事件代码:
Select Case e.DataCol.Name
    Case "运输方量"
        If e.NewValue <> e.OldValue
            Dim pr As DataRow
            Dim filter As String
            filter = "[拌合站] = \'" & e.DataRow("拌合站") & " \' And [施工日期] = \'" & e.DataRow("施工日期") & " \' And [工程名称] = \'" & e.DataRow("工程名称") & " \' And [分项工程] = \'" & e.DataRow("分项工程") & " \' And [施工部位] = \'" & e.DataRow("施工部位") & " \' And [强度等级] = \'" & e.DataRow("强度等级") & " \' And [劳务队名称] = \'" & e.DataRow("劳务队名称") & " \'"
            pr = DataTables("混凝土设计量").Find(filter)
            If pr IsNot Nothing Then
                DataTables("混凝土设计量").DataCols("工程名称").RaiseDataColChanged(pr)
            End If
        End If
End Select。
为什么:混凝土设计量表 的 实耗量 列 数据统计要慢一拍(混凝土统计明细 运输方量 列 数据边2次,混凝土设计量表 的 实耗量 列 统计的是第一次变动的结果,总是慢一拍,不是同步变动)
[此贴子已经被作者于2022/6/28 23:30:38编辑过]

--  作者:有点蓝
--  发布时间:2022/6/28 23:35:00
--  
去掉下面的判断代码

If e.NewValue <> e.OldValue

--  作者:张飞
--  发布时间:2022/6/28 23:38:00
--  
尝试了,有延迟,才加了个判断


--  作者:有点蓝
--  发布时间:2022/6/29 8:30:00
--  
混凝土设计量datacolchanged事件发上来看看
--  作者:张飞
--  发布时间:2022/6/29 9:09:00
--  
Dim dr As DataRow = e.DataRow
Select Case e.DataCol.Name
    Case "设计量","变更量1","变更量2","损耗系数","变更后设计量","应耗量","节超量_不含损耗","节超量_含损耗","节超率_不含损耗","节超率_含损耗"
        If dr.IsNull("设计量") And dr.IsNull("变更量1") And dr.IsNull("变更量2")  Then
            dr("变更后设计量") = Nothing
            dr("应耗量") = Nothing
            dr("节超量_不含损耗") = Nothing
            dr("节超量_含损耗") = Nothing
            dr("节超率_不含损耗") = Nothing
            dr("节超率_含损耗") = Nothing
        Else
            dr("变更后设计量") = dr("设计量") + dr("变更量1") +dr("变更量2")
            dr("应耗量") = (dr("设计量") + dr("变更量1") + dr("变更量2")) * (1 + dr("损耗系数"))
            dr("节超量_含损耗") = (dr("设计量") + dr("变更量1") + dr("变更量2")) * (1 + dr("损耗系数")) - dr("实耗量")
            dr("节超量_不含损耗") = dr("设计量") + dr("变更量1") + dr("变更量2") - dr("实耗量")
            If  dr("变更后设计量") = 0 Then
                
                dr("节超率_不含损耗") = 0
                dr("节超率_含损耗") = 0
            Else
                dr("节超率_不含损耗") = dr("节超量_不含损耗") / dr("变更后设计量")
                dr("节超率_含损耗") = dr("节超量_含损耗") / dr("变更后设计量")
            End If
        End If
    Case "拌合站","施工日期","工程名称","分项工程","施工部位","规格型号"
        If dr.IsNull("拌合站") OrElse dr.IsNull("施工日期") OrElse dr.IsNull("工程名称") OrElse dr.IsNull("分项工程") OrElse dr.IsNull("施工部位") Then
            dr("实耗量") = Nothing
        Else
            Dim filter As String
            filter = "[拌合站] = \'" & dr("拌合站") & " \' and [施工日期] = \'" & dr("施工日期") & " \' and [工程名称] = \'" & dr("工程名称") & " \' And [分项工程] = \'" & dr("分项工程") & " \' And [施工部位] = \'" & dr("施工部位") & " \' And [强度等级] = \'" & dr("强度等级") & " \' "
            dr("实耗量")  = DataTables("混凝土出库明细").SQLCompute("Sum(运输方量)", Filter)
        End If
End Select

--  作者:张飞
--  发布时间:2022/6/29 9:10:00
--  
图片点击可在新窗口打开查看


--  作者:张飞
--  发布时间:2022/6/29 9:25:00
--  
Case "拌合站","施工日期","工程名称","分项工程","施工部位","规格型号"
        If dr.IsNull("拌合站") OrElse dr.IsNull("施工日期") OrElse dr.IsNull("工程名称") OrElse dr.IsNull("分项工程") OrElse dr.IsNull("施工部位") Then
            dr("实耗量") = Nothing
        Else
            Dim filter As String
            filter = "[拌合站] = \'" & dr("拌合站") & " \' and [施工日期] = \'" & dr("施工日期") & " \' and [工程名称] = \'" & dr("工程名称") & " \' And [分项工程] = \'" & dr("分项工程") & " \' And [施工部位] = \'" & dr("施工部位") & " \' And [强度等级] = \'" & dr("强度等级") & " \' "
            dr("实耗量")  = DataTables("混凝土出库明细").SQLCompute("Sum(运输方量)", Filter)
        End If

这段若是统计后台数据该怎么修改

--  作者:有点蓝
--  发布时间:2022/6/29 9:26:00
--  
SQLCompute只能统计已经保存的数据。混凝土统计明细里加个保存代码

Select Case e.DataCol.Name
    Case "运输方量"
e.DataRow.save
            Dim pr As DataRow
            Dim filter As String
            filter = "[拌合站] = \'" & e.DataRow("拌合站") & " \' And [施工日期] = \'" & e.DataRow("施工日期") & " \' And [工程名称] = \'" & e.DataRow("工程名称") & " \' And [分项工程] = \'" & e.DataRow("分项工程") & " \' And [施工部位] = \'" & e.DataRow("施工部位") & " \' And [强度等级] = \'" & e.DataRow("强度等级") & " \' And [劳务队名称] = \'" & e.DataRow("劳务队名称") & " \'"
            pr = DataTables("混凝土设计量").Find(filter)
            If pr IsNot Nothing Then
                DataTables("混凝土设计量").DataCols("工程名称").RaiseDataColChanged(pr)
            End If
End Select。

如果为了防止"混凝土设计量"对应的数据没有加载,还可以这样
Select Case e.DataCol.Name
    Case "运输方量"
e.DataRow.save
            Dim pr As DataRow
            Dim filter As String
            filter = "[拌合站] = \'" & e.DataRow("拌合站") & " \' And [施工日期] = \'" & e.DataRow("施工日期") & " \' And [工程名称] = \'" & e.DataRow("工程名称") & " \' And [分项工程] = \'" & e.DataRow("分项工程") & " \' And [施工部位] = \'" & e.DataRow("施工部位") & " \' And [强度等级] = \'" & e.DataRow("强度等级") & " \' And [劳务队名称] = \'" & e.DataRow("劳务队名称") & " \'"
            pr = DataTables("混凝土设计量").Find(filter)
            If pr IsNot Nothing Then
                DataTables("混凝土设计量").DataCols("工程名称").RaiseDataColChanged(pr)
else
dim drr as List(of datarow) = DataTables("混凝土设计量").appendload(filter) ‘追加数据’
if drr.count > 0 then
DataTables("混凝土设计量").DataCols("工程名称").RaiseDataColChanged(drr(0))
end if
            End If
End Select。

--  作者:张飞
--  发布时间:2022/6/29 9:35:00
--  
我在计划管理中加了这个:
For Each dt As DataTable In DataTables
    If dt.Type = 1 OrElse dt.Type = 3 Then
        If dt.HasChanges Then
            dt.Save()
        End If
    End If
Next  

--  作者:有点蓝
--  发布时间:2022/6/29 9:43:00
--  
计划管理是按照指定的间隔才会执行的,而不是即时的。事件触发的时候,数据未必保存了,所以才会出现上面说的有延迟