Foxtable(狐表)用户栏目专家坐堂 → 请教RaiseDataColChanged手工触发DataColChanged事件


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

主题:请教RaiseDataColChanged手工触发DataColChanged事件

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


加好友 发短信
等级:婴狐 帖子:51 积分:1532 威望:0 精华:0 注册:2008/11/15 21:35:00
请教RaiseDataColChanged手工触发DataColChanged事件  发帖心情 Post By:2009/4/1 22:21:00 [只看该作者]

RaiseDataColChanged手工触发DataColChanged事件后再对某列对另外一个表格数据汇总,每次选择主表或者启动后,自动计算,但是好慢啊,要停10多秒钟时间不动。
请问下还有其它的方法吗?
对于跨表计算只能触发DataColChanged事件吗?
谢谢~


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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33963 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2009/4/2 2:10:00 [只看该作者]

可以在当前表的DataColChanged事件中设置代码,对统计表进行实时计算,如果数据量很大,这个方法估计比在统计表中一次性计算要好。


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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/4/2 9:22:00 [只看该作者]

以下是引用烟酒在2009-4-1 22:21:00的发言:

RaiseDataColChanged手工触发DataColChanged事件后再对某列对另外一个表格数据汇总,每次选择主表或者启动后,自动计算,但是好慢啊,要停10多秒钟时间不动。
请问下还有其它的方法吗?
对于跨表计算只能触发DataColChanged事件吗?
谢谢~


不要针对所有行触发,通常应该针对某一行,除非要重算所有数据。

下面是帮助中的一段话:

注意我们给RaiseDataColChanged参数:

DataTables("表A").DataCols("分类").RaiseDataColChanged(dr)

如果省略参数,将针对所有行的分类列触发DataColChanged事件,效率会低很多。

另外还需要检查一下代码,看看是否存在重复计算的问题,因为设置不当,效率差个100倍的情况,也是常见的。

[此贴子已经被作者于2009-4-2 9:27:45编辑过]

 回到顶部
美女呀,离线,留言给我吧!
yangming
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:4109 积分:23338 威望:0 精华:21 注册:2008/9/1 20:07:00
  发帖心情 Post By:2009/4/2 11:44:00 [只看该作者]

我也学习学习,呵呵


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


加好友 发短信
等级:婴狐 帖子:51 积分:1532 威望:0 精华:0 注册:2008/11/15 21:35:00
  发帖心情 Post By:2009/4/2 13:47:00 [只看该作者]

呵呵   但是我的汇总表里面之前已经有现成的数据了,只是在某列统计数据,我也是在当前表的DataColChanged事件中设置代码的,但是要手工触发,因为其它数据没有变化。谢谢czy
感谢老6指教。我的数据是需要行都要进行统计,因为这个统计表内的项目是后面明细表所有项目包含的,那么多数据我也不知道哪些数据行需要统计哪些不需要统计,所以我不得不触发所有行统计。
(这个汇总表的列也比较多,有58列,里面大部分是公示列,只有11列公式无法计算,需要代码进行计算。)

这是MainTableChanged内设置的:
If MainTable Is Nothing Then
    Return
End If
If Maintable.Name = "工程量清单" Then
   DataTables("工程量清单").DataCols("清单编号").RaiseDataColChanged()
End If

这是DataColChanged设置的:
dim nius as new list(of String)
Dim dr As DataRow = e.DataRow
nius= DataTables("台帐").GetUniqueValues("", "清单内容")
If e.DataCol.name="清单编号" then
    For Each niu As String In nius
        dr("田家屋场大桥_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = '田家屋场大桥'")
        dr("向家梁子大桥_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = '向家梁子大桥'")
        dr("牛王庙大桥_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = '牛王庙大桥'")
        dr("易家屋场大桥_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = '易家屋场大桥'")
        dr("月亮山大桥_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = '月亮山大桥'")
        dr("K28540天桥_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = 'K28+540车行天桥'")
        dr("K29360天桥_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = 'K29+360车行天桥'")
        dr("K28312涵洞_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = 'K28+312钢筋砼盖板涵'")
        dr("K28605涵洞_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = 'K28+605钢筋砼盖板涵'")
        dr("K29580涵洞_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = 'K29+580钢筋砼盖板涵'")
        dr("增减数量")=DataTables("台帐").Compute("Sum(增减数量)", "[清单内容] = '" & dr("清单编号") & "'" )
    next
end if
[此贴子已经被作者于2009-4-2 13:50:06编辑过]

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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33963 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2009/4/2 14:11:00 [只看该作者]

没明白这里为何要用流程语句。

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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/4/2 14:17:00 [只看该作者]

这样会快100倍:

If e.DataCol.name="清单编号" then
        dr("田家屋场大桥_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = '田家屋场大桥'")
        dr("向家梁子大桥_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = '向家梁子大桥'")
        dr("牛王庙大桥_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = '牛王庙大桥'")
        dr("易家屋场大桥_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = '易家屋场大桥'")
        dr("月亮山大桥_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = '月亮山大桥'")
        dr("K28540天桥_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = 'K28+540车行天桥'")
        dr("K29360天桥_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = 'K29+360车行天桥'")
        dr("K28312涵洞_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = 'K28+312钢筋砼盖板涵'")
        dr("K28605涵洞_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = 'K28+605钢筋砼盖板涵'")
        dr("K29580涵洞_变更后数量")=DataTables("台帐").Compute("Sum(变更后数量)", "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = 'K29+580钢筋砼盖板涵'")
        dr("增减数量")=DataTables("台帐").Compute("Sum(增减数量)", "[清单内容] = '" & dr("清单编号") & "'" )
end if


[此贴子已经被作者于2009-4-2 14:29:01编辑过]

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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33963 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2009/4/2 14:30:00 [只看该作者]

这样试试能不能出正确结果?

Dim dt As DataTable = DataTables("台帐")
Dim dr As DataRow = e.DataRow
Dim Str As String = "[清单内容] = '" & dr("清单编号") & "'" & "and [单位工程名称] = "
If e.DataCol.name="清单编号" then
    dr("田家屋场大桥_变更后数量")=dt.Compute("Sum(变更后数量)", Str & "'田家屋场大桥'")
    dr("向家梁子大桥_变更后数量")=dt.Compute("Sum(变更后数量)", Str & "'向家梁子大桥'")
    dr("牛王庙大桥_变更后数量")=dt.Compute("Sum(变更后数量)", Str & "'牛王庙大桥'")
    dr("易家屋场大桥_变更后数量")=dt.Compute("Sum(变更后数量)", Str & "'易家屋场大桥'")
    dr("月亮山大桥_变更后数量")=dt.Compute("Sum(变更后数量)", Str & "'月亮山大桥'")
    dr("K28540天桥_变更后数量")=dt.Compute("Sum(变更后数量)", Str & "'K28+540车行天桥'")
    dr("K29360天桥_变更后数量")=dt.Compute("Sum(变更后数量)", Str & "'K29+360车行天桥'")
    dr("K28312涵洞_变更后数量")=dt.Compute("Sum(变更后数量)", Str & "'K28+312钢筋砼盖板涵'")
    dr("K28605涵洞_变更后数量")=dt.Compute("Sum(变更后数量)", Str & "'K28+605钢筋砼盖板涵'")
    dr("K29580涵洞_变更后数量")=dt.Compute("Sum(变更后数量)", Str & "'K29+580钢筋砼盖板涵'")
    dr("增减数量")=dt.Compute("Sum(增减数量)", "[清单内容] = '" & dr("清单编号") & "'" )
end if
[此贴子已经被作者于2009-4-2 15:40:14编辑过]

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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/4/2 14:35:00 [只看该作者]

用c版的代码,速度比楼主的提高100倍是保守估计,正常的话,应该是提高1000倍。

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


加好友 发短信
等级:八尾狐 帖子:1812 积分:12999 威望:0 精华:14 注册:2008/10/11 18:07:00
  发帖心情 Post By:2009/4/2 14:51:00 [只看该作者]

简化一下吧:


Dim T,gs,Ln,Ls() As String
Dim dr As DataRow = e.DataRow
T = "[清单内容] = '" & dr("清单编号") & "'"

Ln = "田家屋场大桥,向家梁子大桥,牛王庙大桥,易家屋场大桥,月亮山大桥"
Ln = Ln & ",K28540天桥,K29360天桥,K28312涵洞,K28605涵洞,K29580涵洞,增减数量"
Ls = Ln.split(",")


If e.DataCol.name="清单编号" then
        For Each Ln In Ls
            if Ln.Indexof("天桥") > 0 orelse Ln.Indexof("涵洞") > 0 then
                T = T & " and [单位工程名称] = '" & Ln.Insert(3,"+")  & "'"
                T = T.Replace("天桥","车行天桥").Replace("涵洞","钢筋砼盖板涵")
             End if
           
             if Ln <> "增减数量" then
                Ln = Ln & "_变更后数量"
                gs = "Sum(变更后数量)"
             else
                gs ="Sum(增减数量)"
             end if

             dr(Ln) = DataTables("台帐").Compute(gs,T)
        Next
end if
 

[此贴子已经被作者于2009-4-2 16:00:51编辑过]

 回到顶部
总数 16 1 2 下一页