以文本方式查看主题

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

--  作者:南山南
--  发布时间:2019/12/19 7:51:00
--  跨表统计自动更新
1、不能及时更新,修改了两三次数据才更新第一次,有时候就不更新,感觉不稳定,不知具体原因出现在哪里?
2、因为订单表每次更新都是整年更新,若要重置列更新感觉速度太慢,订单表一年大概有一万行左右,对于此问题老师给我点具体设计思路,我想了一个月,思想如以下代码,但是感觉不好,效率低下,大量重算速度慢。

订单表(备注:这里有三种日期,访客、订单、过来)
DataColChanged事件写入如下代码:
Select Case e.DataCol.Name
    Case "单数","预算利润","实际利润"
        Dim pr,pr1,pr2 As DataRow
        pr = DataTables("推广流水").Find("编号= \'" & e.DataRow("编号") & "\'")
        If pr IsNot Nothing Then
            DataTables("推广流水").DataCols("编号").RaiseDataColChanged(pr)
        End If
        pr1 = DataTables("公司流水").Find("日期= \'" & e.DataRow("订单日期") & "\'")
        If pr1 IsNot Nothing Then
            DataTables("公司流水").DataCols("日期").RaiseDataColChanged(pr1)
        End If
        pr2 = DataTables("公司流水").Find("日期= \'" & e.DataRow("过来日期") & "\'")
        If pr2 IsNot Nothing Then
            DataTables("公司流水").DataCols("日期").RaiseDataColChanged(pr2)
        End If
End Select
公司流水表DataColChanged事件写入如下代码:
If e.DataCol.Name = "日期" Then
    If e.NewValue Is Nothing Then
        e.DataRow("广告费")=Nothing
        e.DataRow("加v")=Nothing
        e.DataRow("人工成本")=Nothing
        e.DataRow("订单日期_单数")=Nothing
        e.DataRow("订单日期_预算利润")=Nothing
        e.DataRow("订单日期_实际利润")=Nothing
        e.DataRow("过来日期_单数")=Nothing
        e.DataRow("过来日期_预算利润")=Nothing
        e.DataRow("过来日期_实际利润")=Nothing
        e.DataRow("出团_订单日期_单数")=Nothing
        e.DataRow("出团_订单日期_预算利润")=Nothing
        e.DataRow("出团_订单日期_实际利润")=Nothing
        e.DataRow("待出团_过来日期_单数")=Nothing
        e.DataRow("待出团_过来日期_预算利润")=Nothing
        e.DataRow("待出团_过来日期_实际利润")=Nothing
    Else
        Dim Filter,Filter1,Filter2,Filter3,Filter4,Filter5,Filter6 As String
        Filter = "日期 = #" & e.DataRow("日期") & "# And 公司= \'" & e.DataRow("公司") & "\'"
        Filter1 = "订单日期 = #" & e.DataRow("日期") & "# And 公司= \'" & e.DataRow("公司") & "\'"
        Filter2 = "过来日期 = #" & e.DataRow("日期") & "# And 公司= \'" & e.DataRow("公司") & "\'"

        Filter3 = "订单日期 = #" & e.DataRow("日期") & "# And 公司= \'" & e.DataRow("公司") & "\'And 出团=\'出团\'"
        Filter4 = "订单日期 = #" & e.DataRow("日期") & "# And 公司= \'" & e.DataRow("公司") & "\'And 出团=\'待出团\'"

        Filter5 = "过来日期 = #" & e.DataRow("日期") & "# And 公司= \'" & e.DataRow("公司") & "\'And 出团=\'出团\'"
        Filter6 = "过来日期 = #" & e.DataRow("日期") & "# And 公司= \'" & e.DataRow("公司") & "\'And 出团=\'待出团\'"


        e.DataRow("广告费")=DataTables("广告费").SQLCompute("sum([消费])",Filter )
        e.DataRow("现金")=DataTables("广告费").SQLCompute("sum([现金])",Filter )
        e.DataRow("加v")=DataTables("加V").SQLCompute("sum([数量])",Filter )
        e.DataRow("人工成本")=DataTables("分摊").SQLCompute("sum([人工成本])",Filter )
        
        e.DataRow("订单日期_单数")=DataTables("订单表").SQLCompute("sum([单数])",Filter1 )
        e.DataRow("订单日期_预算利润")=DataTables("订单表").SQLCompute("sum([预算利润])",Filter1 )
        e.DataRow("订单日期_实际利润")=DataTables("订单表").SQLCompute("sum([实际利润])",Filter1 )

        e.DataRow("过来日期_单数")=DataTables("订单表").SQLCompute("sum([单数])",Filter2 )
        e.DataRow("过来日期_预算利润")=DataTables("订单表").SQLCompute("sum([预算利润])",Filter2 )
        e.DataRow("过来日期_实际利润")=DataTables("订单表").SQLCompute("sum([实际利润])",Filter2 )

        e.DataRow("出团_订单日期_单数")=DataTables("订单表").SQLCompute("sum([单数])",Filter3 )
        e.DataRow("出团_订单日期_预算利润")=DataTables("订单表").SQLCompute("sum([预算利润])",Filter3 )
        e.DataRow("出团_订单日期_实际利润")=DataTables("订单表").SQLCompute("sum([实际利润])",Filter3 )
        e.DataRow("待出团_订单日期_单数")=DataTables("订单表").SQLCompute("sum([单数])",Filter4 )
        e.DataRow("待出团_订单日期_预算利润")=DataTables("订单表").SQLCompute("sum([预算利润])",Filter4 )
        e.DataRow("待出团_订单日期_实际利润")=DataTables("订单表").SQLCompute("sum([实际利润])",Filter4 )

        e.DataRow("出团_过来日期_单数")=DataTables("订单表").SQLCompute("sum([单数])",Filter5 )
        e.DataRow("出团_过来日期_预算利润")=DataTables("订单表").SQLCompute("sum([预算利润])",Filter5 )
        e.DataRow("出团_过来日期_实际利润")=DataTables("订单表").SQLCompute("sum([实际利润])",Filter5 )
        e.DataRow("待出团_过来日期_单数")=DataTables("订单表").SQLCompute("sum([单数])",Filter6 )
        e.DataRow("待出团_过来日期_预算利润")=DataTables("订单表").SQLCompute("sum([预算利润])",Filter6 )
        e.DataRow("待出团_过来日期_实际利润")=DataTables("订单表").SQLCompute("sum([实际利润])",Filter6 )
    End If
End If

推广流水表DataColChanged事件写入如下代码:
If e.DataCol.Name = "编号" Then
    If e.NewValue Is Nothing Then
        e.DataRow("账户币")=Nothing
        e.DataRow("现金")=Nothing
        e.DataRow("加v")=Nothing
        e.DataRow("订单日期_单数")=Nothing
        e.DataRow("订单日期_预算利润")=Nothing
        e.DataRow("订单日期_实际利润")=Nothing
        e.DataRow("过来日期_单数")=Nothing
        e.DataRow("过来日期_预算利润")=Nothing
        e.DataRow("过来日期_实际利润")=Nothing
        e.DataRow("出团_订单日期_单数")=Nothing
        e.DataRow("出团_订单日期_预算利润")=Nothing
        e.DataRow("出团_订单日期_实际利润")=Nothing
        e.DataRow("待出团_过来日期_单数")=Nothing
        e.DataRow("待出团_过来日期_预算利润")=Nothing
        e.DataRow("待出团_过来日期_实际利润")=Nothing
        e.DataRow("运营") = Nothing
        e.DataRow("推广") = Nothing
        e.DataRow("路径") = Nothing
    Else
        Dim dr As DataRow
        dr = DataTables("ku").Find("[编码] = \'" & e.NewValue & "\'")
        If dr IsNot Nothing Then
            e.DataRow("运营") = dr("运营")
            e.DataRow("推广") = dr("平台")
            e.DataRow("路径") = dr("路径")
        End If
        Dim Filter,Filter1,Filter2,Filter3,Filter4,Filter5,Filter6 As String
        Filter = "日期 = #" & e.DataRow("日期") & "# And 编号= \'" & e.DataRow("编号") & "\'And 公司= \'" & e.DataRow("公司") & "\'"
        Filter1 = "订单日期 = #" & e.DataRow("日期") & "# And 公司= \'" & e.DataRow("公司") & "\'And 编号= \'" & e.DataRow("编号") & "\'"
        Filter2 = "过来日期 = #" & e.DataRow("日期") & "# And 公司= \'" & e.DataRow("公司") & "\'And 编号= \'" & e.DataRow("编号") & "\'"
        
        
        Filter3 = "订单日期 = #" & e.DataRow("日期") & "# And 公司= \'" & e.DataRow("公司") & "\'And 出团=\'出团\'And 编号= \'" & e.DataRow("编号") & "\'"
        Filter4 = "订单日期 = #" & e.DataRow("日期") & "# And 公司= \'" & e.DataRow("公司") & "\'And 出团=\'待出团\'And 编号= \'" & e.DataRow("编号") & "\'"
        
        Filter5 = "过来日期 = #" & e.DataRow("日期") & "# And 公司= \'" & e.DataRow("公司") & "\'And 出团=\'出团\'And 编号= \'" & e.DataRow("编号") & "\'"
        Filter6 = "过来日期 = #" & e.DataRow("日期") & "# And 公司= \'" & e.DataRow("公司") & "\'And 出团=\'待出团\'And 编号= \'" & e.DataRow("编号") & "\'"
        
        
        e.DataRow("账户币")=DataTables("广告费").SQLCompute("sum([消费])",Filter )
        e.DataRow("现金")=DataTables("广告费").SQLCompute("sum([现金])",Filter )
        e.DataRow("加v")=DataTables("加V").SQLCompute("sum([数量])",Filter )
        
        e.DataRow("订单日期_单数")=DataTables("订单表").SQLCompute("sum([单数])",Filter1 )
        e.DataRow("订单日期_预算利润")=DataTables("订单表").SQLCompute("sum([预算利润])",Filter1 )
        e.DataRow("订单日期_实际利润")=DataTables("订单表").SQLCompute("sum([实际利润])",Filter1 )
        
        e.DataRow("过来日期_单数")=DataTables("订单表").SQLCompute("sum([单数])",Filter2 )
        e.DataRow("过来日期_预算利润")=DataTables("订单表").SQLCompute("sum([预算利润])",Filter2 )
        e.DataRow("过来日期_实际利润")=DataTables("订单表").SQLCompute("sum([实际利润])",Filter2 )
       
        e.DataRow("出团_过来日期_单数")=DataTables("订单表").SQLCompute("sum([单数])",Filter5 )
        e.DataRow("出团_过来日期_预算利润")=DataTables("订单表").SQLCompute("sum([预算利润])",Filter5 )
        e.DataRow("出团_过来日期_实际利润")=DataTables("订单表").SQLCompute("sum([实际利润])",Filter5 )
        e.DataRow("待出团_过来日期_单数")=DataTables("订单表").SQLCompute("sum([单数])",Filter6 )
        e.DataRow("待出团_过来日期_预算利润")=DataTables("订单表").SQLCompute("sum([预算利润])",Filter6 )
        e.DataRow("待出团_过来日期_实际利润")=DataTables("订单表").SQLCompute("sum([实际利润])",Filter6 )
    End If
End If

--  作者:有点蓝
--  发布时间:2019/12/19 8:42:00
--  
1、代码没有问题,不更新,是因为您限制了"单数","预算利润","实际利润"这3列数据有变动才会触发更新的操作。但是查询统计条件却还有公司、出团等等列,如果这些列没有数据,很明显统计不到的,也就是说"单数","预算利润","实际利润"这3列数据有变动之前,公司、出团这些列必须先要有数据。

2、这种没有什么好办法,如果要即时统计,只能这样,再说是后台统计的肯定会慢。如果实时性要求不高,个人的建议是专门做一个统计窗口,通过sql进行统计,定时(比如10分钟)或者点击按钮后再统计,把最后结果显示到窗口中。