以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  下面代码执行速度很慢 有没有好的方法实现这个要求?  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=85996)

--  作者:jswjyjf
--  发布时间:2016/6/7 15:46:00
--  下面代码执行速度很慢 有没有好的方法实现这个要求?
根据库存表的期初数和某段期间的进货 销售 要实现新的库存数 下列代码 执行 速度很慢 有没有好的办法?
Dim dt As DataTable = DataTables("区间进销存_Table1")
For Each dr As DataRow In dt.DataRows
    Dim filter2 As String
\'  filter2="产品名称 = \'" & dr("产品名称") & "\' and 颜色 = \'" & dr("颜色") & "\' and 仓库 = \'" & dr("仓库") & "\' and 日期 >= #" & e.Form.Controls("startdate").value & "# " & " And 日期 <= #" & e.Form.Controls("enddate").value & "#"
  filter2="产品名称 = \'" & dr("产品名称") & "\' and 仓库 = \'" & dr("仓库") & "\' and 日期 < #" & e.Form.Controls("startdate").value & "#"

   Dim s1 As Double = DataTables("进货单明细").sqlCompute("sum(数量)", filter2)
    Dim s2 As Double = DataTables("销售单明细").sqlCompute("sum(数量)", filter2)
    Dim s3 As Double = DataTables("其他出库单明细").sqlCompute("sum(数量)", filter2)
    Dim s4 As Double = DataTables("其他入库单明细").sqlCompute("sum(数量)", filter2)
    dr("期初_数量") += s1+s4 - s2 - s3
    Dim s5 As Double = DataTables("进货单明细").sqlCompute("sum(金额)", filter2)
    Dim s6 As Double = DataTables("销售单明细").sqlCompute("sum(金额)", filter2)
    Dim s7 As Double = DataTables("其他出库单明细").sqlCompute("sum(金额)", filter2)
    Dim s8 As Double = DataTables("其他入库单明细").sqlCompute("sum(金额)", filter2)
    dr("期初_金额") += s5+s6-s7-s8
Next


--  作者:狐狸爸爸
--  发布时间:2016/6/7 15:53:00
--  

直接用多表统计工具SQLGroupTableBuilder得到所有的统计结果。

然后遍历这个统计表,逐行将统计结果写入到DataTables("区间进销存_Table1")中。

 

效率会提高百倍甚至千倍。

 

http://www.foxtable.com/help/topics/1626.htm

 

[此贴子已经被作者于2016/6/7 15:54:33编辑过]

--  作者:jswjyjf
--  发布时间:2016/6/7 15:58:00
--  
不会弄


--  作者:Hyphen
--  发布时间:2016/6/7 17:05:00
--  
不会就上传实例,说明操作逻辑
--  作者:大红袍
--  发布时间:2016/6/8 10:42:00
--  

 尽量不要用sqlCompute,数据越多,越慢。

 

 建议根据日期,先把所需的数据加载出来,然后直接用compute统计效率更高。


--  作者:jswjyjf
--  发布时间:2016/6/8 14:52:00
--  
下面是我做的项目  要求计算某段期间的进销存报表 每个期间期初 进货 销售 库存都是不同的 除非没有发生
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:区间进销存.rar



--  作者:大红袍
--  发布时间:2016/6/8 16:35:00
--  

参考

 

Dim filter1 As String
filter1="日期 >= #" & e.Form.Controls("startdate").value & "# " & " And 日期 <= #" & e.Form.Controls("enddate").value & "#"
Dim bd1 As New SQLGroupTableBuilder("统计表1","进货单明细")
Dim b As New SQLGroupTableBuilder("统计表1","订单")
bd1.ConnectionName = "wjhansdata"
Dim dt1 As fxDataSource
bd1.Groups.AddDef("产品名称") \'根据型号分组
bd1.Groups.AddDef("仓库") \'根据型号分组
bd1.Totals.AddDef("数量","进货_数量") \'对数量进行统计
bd1.Totals.AddDef("金额","进货_金额") \'对金额进行统计
bd1.Filter = filter1
dt1 = bd1.BuildDataSource()

Dim bd2 As New SqlGroupTableBuilder("统计表2","销售单明细")
bd2.ConnectionName = "wjhansdata"
Dim dt2  As fxDataSource
bd2.Groups.AddDef("产品名称") \'根据型号分组
bd2.Groups.AddDef("仓库") \'根据型号分组
bd2.Totals.AddDef("数量","销售_数量") \'对数量进行统计
bd2.Totals.AddDef("金额","销售_金额") \'对金额进行统计
bd2.Totals.AddDef("成本","销售_成本") \'对金额进行统计
bd2.Filter = filter1
dt2 = bd2.BuildDataSource()

Dim bd5 As New GroupTableBuilder("统计表5",DataTables("期初库存"))
Dim dt5 As fxDataSource
bd5.Groups.AddDef("产品名称") \'根据型号分组
bd5.Groups.AddDef("仓库") \'根据型号分组
bd5.Totals.AddDef("期初数量","期初_数量") \'对数量进行统计
bd5.Totals.AddDef("期初金额","期初_金额") \'对金额进行统计
dt5 = bd5.BuildDataSource()

Dim filter2="日期 < #" & e.Form.Controls("startdate").value & "#"

Dim bd10 As New SQLGroupTableBuilder("统计表1","进货单明细")
bd10.ConnectionName  = "wjhansdata"
Dim dt10 As fxDataSource
bd10.Groups.AddDef("产品名称") \'根据型号分组
bd10.Groups.AddDef("仓库") \'根据型号分组
bd10.Totals.AddDef("数量","进货_之前数量") \'对数量进行统计
bd10.Totals.AddDef("金额","进货_之前金额") \'对金额进行统计
bd10.Filter = filter2
dt10 = bd10.BuildDataSource()

Dim bd11 As New SqlGroupTableBuilder("统计表11","销售单明细")
bd11.ConnectionName  = "wjhansdata"
Dim dt11  As fxDataSource
bd11.Groups.AddDef("产品名称") \'根据型号分组
bd11.Groups.AddDef("仓库") \'根据型号分组
bd11.Totals.AddDef("数量","销售_之前数量") \'对数量进行统计
bd11.Totals.AddDef("金额","销售_之前金额") \'对金额进行统计
bd11.Totals.AddDef("成本","销售_之前成本") \'对金额进行统计
bd11.Filter = filter2
dt11 = bd11.BuildDataSource()


Dim nms As String() = {"产品名称","仓库"} \'指定连接列
dt5.Combine(nms,dt1,nms) \'将销售统计数据组合到进货统计数据
dt5.Combine(nms,dt2,nms) \'将退货统计数据组合到进货统计数据
dt5.Combine(nms,dt10,nms) \'将退货统计数据组合到进货统计数据
dt5.Combine(nms,dt11,nms) \'将退货统计数据组合到进货统计数据


Tables("区间进销存_Table1").DataSource = dt5 \'将统计结果绑定到Table

Dim dt As DataTable = DataTables("区间进销存_Table1")
For Each dr As DataRow In dt.DataRows
    dr("期初_数量") += dr("进货_之前数量") - dr("销售_之前数量")
    dr("期初_金额") += dr("进货_之前金额") - dr("销售_之前金额")
Next

With DataTables("区间进销存_Table1").DataCols  \'用表达式列计算库存数据
    .Add("库存_数量",Gettype(Integer), "IsNull([期初_数量],0)+ IsNull([进货_数量],0) - ISNULL([销售_数量],0) ")
    .Add("库存_金额",Gettype(Double), "IsNull([期初_金额],0)+ IsNull([进货_金额],0) - ISNULL([销售_成本],0) ")
End With
\'
Tables("区间进销存_table1").Cols("期初_数量").GrandTotal = True \'指定要合计的列
Tables("区间进销存_table1").Cols("期初_金额").GrandTotal = True
Tables("区间进销存_table1").Cols("进货_数量").GrandTotal = True
Tables("区间进销存_table1").Cols("进货_金额").GrandTotal = True
Tables("区间进销存_table1").Cols("销售_数量").GrandTotal = True
Tables("区间进销存_table1").Cols("销售_金额").GrandTotal = True
Tables("区间进销存_table1").Cols("销售_成本").GrandTotal = True


Tables("区间进销存_table1").Cols("库存_数量").GrandTotal = True
Tables("区间进销存_table1").Cols("库存_金额").GrandTotal = True
Tables("区间进销存_table1").GrandTotal = True \'显示合计模式

[此贴子已经被作者于2016/6/8 16:36:24编辑过]

--  作者:jswjyjf
--  发布时间:2016/6/8 20:45:00
--  
字段:进货_之前数量 能否不要显示
--  作者:大红袍
--  发布时间:2016/6/10 20:54:00
--  
以下是引用jswjyjf在2016/6/8 20:45:00的发言:
字段:进货_之前数量 能否不要显示

 

你可以生成之后隐藏嘛

 

Tables("区间进销存_table1").Cols("进货_之前数量").Visible = False