以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  多字段计算  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=80932)

--  作者:kaituozhe
--  发布时间:2016/2/13 7:01:00
--  多字段计算

在统计银行交易数据时,经常需要统计多对多转账交易数据的统计与查询,比如 需要统计 甲乙丙丁四个人对ABCD四个人的交易数据,为此我设计如下代码,但是运行速度非常慢,有没有更好的办法

\'Select Case e.DataCol.Name
\'Case "涉及人员","交易户名"
    \'For Each dr1 As DataRow In DataTables("银行现金汇总").DataRows
        \'If dr1.IsNull("交易户名") = False AndAlso dr1.IsNull("涉及人员") = False Then \'如果工号列不为空
            \'Dim nms1() As String = dr1("交易户名").Split(",") \'将工号列内容拆分成数组
            \'Dim nms2() As String = dr1("涉及人员").Split(",") \'将工号列内容拆分成数组
            \'Dim v1 As Double
            \'Dim v2 As Double
            \'For Each nm1 As String In nms1 \'遍历参与加工此产品的每个工号
                \'For Each nm2 As String In nms2 \'遍历参与加工此产品的每个工号
                    \'v1 = v1 + DataTables("银行明细").sqlCompute("sum(借方金额)","交易户名 = \'"& nm1 & "\'and 对方户名 = \'" & nm2 & "\'")
                    \'v2 = v2 + DataTables("银行明细").sqlCompute("sum(贷方金额)","交易户名 = \'"& nm1 & "\'and 对方户名 = \'" & nm2 & "\'")
                \'Next
            \'Next
            \'e.DataRow("银行交易_借方金额") = v1
            \'e.DataRow("银行交易_贷方金额") = v2
        \'End If
    \'Next
\'End Select


--  作者:Hyphen
--  发布时间:2016/2/13 8:47:00
--  

多值字段作为录入和展示的一种方式比较直观,操作方便。但是对于统计分析很不友好。

常见的作法是另外用一套表来存储多对多的关系。

--  作者:kaituozhe
--  发布时间:2016/2/13 9:10:00
--  
Dim v1 As Double
Dim v2 As Double
Select Case e.DataCol.Name
    Case "涉及人员","交易户名"
        If e.DataRow.IsNull("交易户名") = False AndAlso e.DataRow.IsNull("涉及人员") = False Then \'如果工号列不为空
            Dim nms1() As String = e.DataRow("交易户名").Split(",") \'将工号列内容拆分成数组
            Dim nms2() As String = e.DataRow("涉及人员").Split(",") \'将工号列内容拆分成数组
           
            For Each nm1 As String In nms1 \'遍历参与加工此产品的每个工号
                For Each nm2 As String In nms2 \'遍历参与加工此产品的每个工号
                    v1 = v1 + DataTables("银行明细").sqlCompute("sum(借方金额)","交易户名 = \'"& nm1 & "\'and 对方户名 = \'" & nm2 & "\'")
                    v2 = v2 + DataTables("银行明细").sqlCompute("sum(贷方金额)","交易户名 = \'"& nm1 & "\'and 对方户名 = \'" & nm2 & "\'")
                Next
            Next
        End If
e.DataRow("银行交易_借方金额") = v1
e.DataRow("银行交易_贷方金额") = v2
Case "银行交易_借方金额","现金交易_借方金额"
e.DataRow("交易合计_借方金额") = e.DataRow("银行交易_借方金额")+e.DataRow("现金交易_借方金额")
Case "银行交易_贷方金额","现金交易_贷方金额",
e.DataRow("交易合计_贷方金额")=e.DataRow("银行交易_贷方金额")+e.DataRow("现金交易_贷方金额")
End Select

--  作者:kaituozhe
--  发布时间:2016/2/13 9:11:00
--  
常见的作法是另外用一套表来存储多对多的关系。具体怎么做能介绍的详细些吗?

--  作者:Hyphen
--  发布时间:2016/2/13 9:31:00
--  
比如把"交易户名"和"涉及人员",拆分成一一对应的关系,一个 "交易户名"的工号对应一个"涉及人员"的工号在一行记录中,如果 "交易户名"哟2个工号,"涉及人员"有3个工号,那么就有2X3行记录,这样会有数据冗余,但是统计分析就很方便。
--  作者:kaituozhe
--  发布时间:2016/2/13 10:20:00
--  
这样太多了,比如10个对10个就需要100行,这样太多了,我的意思是是否有更好的办法或者能够优化代码,提高代码效率
--  作者:Hyphen
--  发布时间:2016/2/13 10:51:00
--  
代码效率有时候是基于底层设计的,问题不是在于 100行的数据多不多,而是用空间换时间是否值得,特别是现在存储不值钱的情况下。
--  作者:kaituozhe
--  发布时间:2016/2/13 11:22:00
--  
我需要10对10计算时,先增加100行,再一一列出对应关系然后计算,但需要修改任何一个时就需要修改10个,增加、减少都会非常麻烦,这是多大的工作量呀?
--  作者:Hyphen
--  发布时间:2016/2/13 14:17:00
--  
没做过银行系统,所以想象不出来银行交易会有一笔交易是多对多进行的。如果多对多不是在一笔交易内完成的,那么就不存在多对多的关系。个人觉得是不是应该重新梳理一下这个的业务流程。



--  作者:kaituozhe
--  发布时间:2016/2/13 16:16:00
--  

在做数据统计