以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  数据效率问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=98607)

--  作者:cuicuibing
--  发布时间:2017/4/2 9:37:00
--  数据效率问题
Dim cmd As New SQLCommand
Dim dt As DataTable
cmd.C
If Tables("订单表并列_Table1").Rows.Count = 0 Then
    Tables("订单表并列_Table2").Fill("S elect * From {工序库明细主表} Where [_Identify] Is Null","s" ,False)
    Tables("订单表并列_Table2").SetColVisibleWidth("物料编码|60|部件名称|60|部件规格|80|部件量|55|编码|70")
    Tables("订单表并列_Table2").Cols.Remove("物料编码")
    Tables("订单表并列_Table2").Cols.Remove("编码")
Else
    Dim tbl As Table = Tables("订单表并列_Table1")
    Dim  cur,cur2,cur3 As String
    Dim cur1 As Double
    cur= tbl.current("产品编码")
    cur1= tbl.current("订单数量")
    cur2= tbl.current("内部加工单号")
    Tables("订单表并列_Table2").Fill("Se lect * From {工序库明细主表} where  物料编码 = \'" & cur & "\'ORDER BY 部件名称 ","s" ,False)
    Tables("订单表并列_Table2").SetColVisibleWidth("物料编码|60|部件名称|60|部件规格|80|部件量|55|编码|70")
    Tables("订单表并列_Table2").Cols.Remove("物料编码")
    \'Tables("订单表并列_Table2").Cols.Remove("编码")
    \'DataTables("订单表并列_Table2").DataCols.Add("部件总量", Gettype(Double), "[部件量] *" & cur1)
    \'DataTables("订单表并列_Table2").DataCols.Add("人工量", Gettype(Double))
    \'For Each dr As DataRow In DataTables("订单表并列_Table2").DataRows
    \'cmd.CommandText = "S ELECT * From {清单} where 内部加工单号=\'" & cur2 & "\'and 产品编码 =\'" & cur & "\'and 编码= \'" & dr("编码")& "\'"
    \'dt = cmd.ExecuteReader()
    \'Dim Total As Double  = dt.Compute("Sum(人工量)")
    \'dr("人工量") = Total
    \'Next
End If

加入红色代码。  后台统计符合条件的行  人工量的合计。速度非常慢。这里应该如何统计好。



--  作者:有点色
--  发布时间:2017/4/2 11:11:00
--  
cmd.CommandText = "SELECT * From {清单} where 内部加工单号=\'" & cur2 & "\'and 产品编码 =\'" & cur & "\'"
dt = cmd.ExecuteReader()
For Each dr As DataRow In DataTables("订单表并列_Table2").DataRows
    Dim Total As Double  = dt.Compute("Sum(人工量)", "编码= \'" & dr("编码")& "\'")
    dr("人工量") = Total
Next

--  作者:cuicuibing
--  发布时间:2017/4/2 14:40:00
--  
版主,速度还是很慢。

请教版主。类似这种,后台数据统计的设计思路。

现在我的设计这样,   产品   分  工序库明细主表(指产品可分的部件),工序库明细表(部件可分的组件),对应的工序表以及工序价格

我现在的{清单}是生成的最详细的工序表,包含订单、产品、部件、组件、工序、价格的一个查询表。里边有个  单个工序对应订单数量的人工量。

我现在是想实现  统计  部件   项下  人工量  之和。
后期还要对应的生产   产品  项下  所有部件 的人工量  之和。


--  作者:有点色
--  发布时间:2017/4/2 14:49:00
--  

 不应该慢。实例发上来看看。

 

 如果需要生成查询表,可以把这几个表连接查询,最后再分组统计。


--  作者:cuicuibing
--  发布时间:2017/4/2 15:12:00
--  
Tables("订单表并列_Table2").Fill("Se lect 订单号,产品编码,部件名称,部件规格,部件量,部件编码,SUM(人工量) AS 人工量  From {清单} where  产品编码 = \'" & cur & "\' GROUP BY 订单号,产品编码,部件名称,部件规格,部件量,部件编码 ORDER BY 部件名称 ","s" ,True)

版主我直接改为这样查询,  速度有所提高,但感觉延迟还是有的。     清单  表 是一个很多表生产的查询表。 订单表  订单明细表,物料表,工序库明细主表,工序库明细表,工序表,工序价格。

怎样才能效率更高呢。这样,能得到想要的数据。

如果都从   清单  这个 sql  视图表中查询,速度不知道怎么样。

根据可以统计人工总量           订单号,产品编码   产品名称,  这样得到的字段  就是订单的一个明细表。
根据    订单号,产品编码,部件名称,部件规格,部件量    统计人工量。    其实根据  订单号,产品编码,部件编码就能得到数据。  但这样,部件名称,部件规格列就不显示
Se lect 订单号,产品编码,部件编码,SUM(人工量) AS 人工量  From {清单} where  产品编码 = \'" & cur & "\' GROUP BY 订单号,产品编码,部件编码 

这里的列多了,是不是影响统计速度。如果统计标准的列少了,如何显示 其他想要的列。

我现在  清单   后台视图 的行数才212行。
[此贴子已经被作者于2017/4/2 15:14:28编辑过]

--  作者:有点色
--  发布时间:2017/4/2 15:26:00
--  

1、你要多少列,那你 GROUP BY  后面,就需要加入多少列。

 

2、你那个生成清单表的sql语句可能有问题,具体做个例子上来测试下。


--  作者:cuicuibing
--  发布时间:2017/4/2 15:47:00
--  
版主我是在表的 currentchanged  中设置代码的。

打开开窗口时,时间为0.16-0.4秒。

随后点击行的时候,时间在1.3-1.8秒波动。

另外,数据的位数影响速度吗。我  清单表中的人工量  保留四位小数。

查询后的数据   有的小数位数  是十六位的,等于字段长度。但有的不是。   

我单独做了个测试窗口,  清单表  总共  212行数据  根据下列办法生产 24行数据,时间2.2-2.4秒
Dim st As Date = Date.Now
\'要测试耗时的代码
Tables("测试_Table1").Fill("S elect 产品编码,部件名称,部件规格,部件量,编码,SUM(人工量) AS 人工量  From {清单}  GROUP BY 产品编码,部件名称,部件规格,部件量,编码 ORDER BY 部件名称 ","s" ,True)
MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒")




下面这个加载  清单 全部数据    测试需要  0.11-0.13秒

Tables("测试_Table1").Fill("S elect * From {清单}  ","s" ,True)



[此贴子已经被作者于2017/4/2 16:18:57编辑过]

--  作者:有点色
--  发布时间:2017/4/2 19:51:00
--  

1、如果你数据量不多,你可以全部数据加载出来,然后直接用分组统计。

 

2、Group by 肯定事件会长一些,越复杂的视图越慢。