以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- 如何使以下代码直接对后台数据库有效?而不是只对Tables (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=140074) |
||||
-- 作者:scofields -- 发布时间:2019/8/28 23:19:00 -- 如何使以下代码直接对后台数据库有效?而不是只对Tables 以下代码只对Tables有效,我如何改成能对后台数据库有效呢? Dim drs As List(of DataRow) = DataTables("日报").Select("市场部 <> \'英德区域\'") If drs.Count > 0 ThenFor Each dr As DataRow In drs Dim y As Integer = dr("报表日期").Year \'取Y为今年 Dim m As Integer = dr("报表日期").Month \'取M为当月 Dim d As Integer = dr("报表日期").Day \'取D为当日 Dim dt1 As New Date(y, m, 1) \'获取本月第一天 Dim dt2 As New Date(y, m, d) \'获取本月第几天 Dim dt3 As New Date(y, 1, 1) \'取本年度第一天 dr("石子水泥月累计") = DataTables("日报").SQLCompute("sum(本期石子日销量)", "报表日期 >= \'"& dt1 & "\' And 报表日期<=\'" & dt2 & "\' ") Next DataTables("日报").Save() End If |
||||
-- 作者:有点蓝 -- 发布时间:2019/8/29 9:56:00 -- Dim drs As List(of DataRow) = DataTables("日报").sqlSelect("市场部 <> \'英德区域\'") If drs.Count > 0 ThenFor Each dr As DataRow In drs Dim y As Integer = dr("报表日期").Year \'取Y为今年 Dim m As Integer = dr("报表日期").Month \'取M为当月 Dim d As Integer = dr("报表日期").Day \'取D为当日 Dim dt1 As New Date(y, m, 1) \'获取本月第一天 Dim dt2 As New Date(y, m, d) \'获取本月第几天 Dim dt3 As New Date(y, 1, 1) \'取本年度第一天 dr("石子水泥月累计") = DataTables("日报").SQLCompute("sum(本期石子日销量)", "报表日期 >= \'"& dt1 & "\' And 报表日期<=\'" & dt2 & "\' ") Next DataTables("日报").SQLUpdate(drs) End If |
||||
-- 作者:scofields -- 发布时间:2019/8/29 20:14:00 -- 感谢老师,不过这段代码对于少于数据运行速度很快,但对于数据量较大,却难了,我测试了500行,用时22秒,如果是10000行,那岂不是卡死?所以还想问一下,有没更加高效的方式?! |
||||
-- 作者:有点蓝 -- 发布时间:2019/8/30 10:47:00 -- 使用sql,或者存储过程处理 |
||||
-- 作者:scofields -- 发布时间:2019/8/30 11:04:00 -- 有没实例可以的?就针对这个,帮忙做一个实例。 |
||||
-- 作者:有点蓝 -- 发布时间:2019/8/30 12:10:00 -- 上传您的实例,提供表格和数据测试 |
||||
-- 作者:scofields -- 发布时间:2019/8/31 10:44:00 -- 老师,这是实例,我把数据库分离出来了,数据里有80000行数据。帮忙看一下如何提高后台数据更新效率。
|
||||
-- 作者:有点蓝 -- 发布时间:2019/8/31 13:40:00 -- 首先不建议使用这样的表结构,月报和年报应该单独出来一个表,可以有效减少大量的冗余数据和处理时间。 下面是使用代码的处理,结合统计表和SQL更新,本机数据库测试在5秒左右 Dim st As Date = Date.Now Dim g As New GroupTableBuilder("统计表1", DataTables("日报")) g.FromServer = True g.Groups.AddDef("市场部") g.Groups.AddDef("报表日期", DateGroupEnum.Year, "年") g.Groups.AddDef("报表日期", "月") g.Totals.AddDef("本期沙日销") g.Totals.AddDef("本期石日销") \'g.Build Dim dt As DataTable = g.Build(True) Dim cmd As new SQLCommand cmd.C cmd.CommandText = "UPDATE 日报 SET 本期沙年累计 = ? ,本期石年累计=?, 本期沙月累计=?, 本期石月累计=? WHERE 市场部= ? and year(报表日期)=? and MONTH(报表日期)=?" For Each s As String() In dt.GetValues("市场部|年|月") For Each dr As DataRow In dt.Select("市场部=\'" & s(0) & "\' and 年=" & s(1) & " and 月=" & s(2)) Dim cnt1 As Double = dt.Compute("sum(本期石日销)","市场部=\'" & s(0) & "\' and 年=" & s(1) & "and 月 = " & s(2)) Dim cnt2 As Double = dt.Compute("sum(本期沙日销)","市场部=\'" & s(0) & "\' and 年=" & s(1) & "and 月 = " & s(2)) Dim cnt12 As Double = dt.Compute("sum(本期石日销)","市场部=\'" & s(0) & "\' and 年=" & s(1) & "and 月 <= " & s(2)) Dim cnt22 As Double = dt.Compute("sum(本期沙日销)","市场部=\'" & s(0) & "\' and 年=" & s(1) & "and 月 <= " & s(2)) cmd.Parameters.Clear cmd.Parameters.Add("@本期沙月累计",cnt2 ) cmd.Parameters.Add("@本期石月累计",cnt1) cmd.Parameters.Add("@本期沙年累计",cnt22) cmd.Parameters.Add("@本期石年累计",cnt12) cmd.Parameters.Add("@市场部",s(0)) cmd.Parameters.Add("@年",s(1)) cmd.Parameters.Add("@月",s(2)) cmd.ExecuteNonQuery Next Next MessageBox.Show("耗时: " & (Date.Now - st).TotalSeconds & "秒") \'计算并显示执行代码所花费的秒数 下面是纯sql的方式,分2条SQL,如果给表加上合适的索引,执行大概在1秒内 update [日报] set 本期石月累计 = a.本期石月累计,本期沙月累计=a.本期沙月累计
from (
select [市场部],year([报表日期]) as 年,MONTH([报表日期]) as 月, sum([本期石日销]) as 本期石月累计,sum([本期沙日销]) as 本期沙月累计
from [日报]
group by [市场部],year([报表日期]),MONTH([报表日期])
) as a
where a.[市场部] = [日报].[市场部] and a.[年] = year([日报].[报表日期]) and a.[月] = MONTH([日报].[报表日期] ) update [日报] set 本期石年累计 = m.本期石年累计 ,本期沙年累计 = m.本期沙年累计
from (
select b.[市场部],b.年,b.月,sum(a.本期沙月累计) as 本期沙年累计, sum(a.本期石月累计) as 本期石年累计
from (
select [市场部],year([报表日期]) as 年,MONTH([报表日期]) as 月, sum([本期石日销]) as 本期石月累计,sum([本期沙日销]) as 本期沙月累计
from [日报] group by [市场部],year([报表日期]),MONTH([报表日期])
) as a
inner join (
select [市场部],year([报表日期]) as 年,MONTH([报表日期]) as 月, sum([本期石日销]) as 本期石月累计,sum([本期沙日销]) as 本期沙月累计
from [日报] group by [市场部],year([报表日期]),MONTH([报表日期])
) as b
on a.市场部 = b.市场部 and a.年 = b.年 and a.月 <= b.月
group by b.[市场部],b.年,b.月
) as m where m.[市场部] = [日报].[市场部] and m.[年] = year([日报].[报表日期]) and m.[月] = MONTH([日报].[报表日期] ) |