Foxtable(狐表)用户栏目专家坐堂 → 如何使以下代码直接对后台数据库有效?而不是只对Tables


  共有2022人关注过本帖树形打印复制链接

主题:如何使以下代码直接对后台数据库有效?而不是只对Tables

帅哥哟,离线,有人找我吗?
scofields
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:562 积分:4521 威望:0 精华:0 注册:2016/4/17 20:05:00
如何使以下代码直接对后台数据库有效?而不是只对Tables  发帖心情 Post By:2019/8/28 23:19:00 [只看该作者]

 以下代码只对Tables有效,我如何改成能对后台数据库有效呢?
Dim drs As List(of DataRow) = DataTables("日报").Select("市场部 <> '英德区域'")
If  drs.Count > 0 Then
    For 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

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107730 积分:547983 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/8/29 9:56:00 [只看该作者]

Dim drs As List(of DataRow) = DataTables("日报").sqlSelect("市场部 <> '英德区域'")
If  drs.Count > 0 Then
    For 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
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:562 积分:4521 威望:0 精华:0 注册:2016/4/17 20:05:00
  发帖心情 Post By:2019/8/29 20:14:00 [只看该作者]

感谢老师,不过这段代码对于少于数据运行速度很快,但对于数据量较大,却难了,我测试了500行,用时22秒,如果是10000行,那岂不是卡死?所以还想问一下,有没更加高效的方式?!

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107730 积分:547983 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/8/30 10:47:00 [只看该作者]

使用sql,或者存储过程处理

 回到顶部
帅哥哟,离线,有人找我吗?
scofields
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:562 积分:4521 威望:0 精华:0 注册:2016/4/17 20:05:00
  发帖心情 Post By:2019/8/30 11:04:00 [只看该作者]

 有没实例可以的?就针对这个,帮忙做一个实例。

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107730 积分:547983 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/8/30 12:10:00 [只看该作者]

上传您的实例,提供表格和数据测试

 回到顶部
帅哥哟,离线,有人找我吗?
scofields
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:562 积分:4521 威望:0 精华:0 注册:2016/4/17 20:05:00
  发帖心情 Post By:2019/8/31 10:44:00 [只看该作者]

老师,这是实例,我把数据库分离出来了,数据里有80000行数据。帮忙看一下如何提高后台数据更新效率。
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:后台数据更新实例.zip


 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107730 积分:547983 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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([日报].[报表日期] )

 回到顶部