Foxtable(狐表)用户栏目专家坐堂 → [求助]RaiseDataColChanged的用法问题


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

主题:[求助]RaiseDataColChanged的用法问题

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


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]RaiseDataColChanged的用法问题  发帖心情 Post By:2016/10/13 15:28:00 [只看该作者]

表A中有ID、Code、A、P、V、CA、CP、CV、Class、FCode 、…………等列
Class = 2时
A、P变化会导致V变化,并导致class = 1的V值变化
CA、CP变化会导致CV变化,并导致Class = 1的CV值变化
A变化会导致CA变化

如何来写datacolchanged事件效率会高一些?

dim r as datarow = e.datarow
select case r("Class")
case 2
   dim fil as string = "合计条件"
   select case e.datacol.name
        case "A","p"
             r("V") = r("A") * r("P")
             e.datatable.datacols("ID").RaiseDataColChanged("Code = '" & r("FCode") & "'")
   end select 

   select case e.datacol.name
        case "A","CP"
             r("CA") = r("A") +datatables("B").compute("sum(A)",fil)
             r("CV") = r("CA") * r("CP")
             e.datatable.datacols("ID").RaiseDataColChanged("Code = '" & r("FCode") & "'")
   end select 
case 1
    dim fil as string = "汇总条件"
    select case e.datacol.name
        case "ID"
             r("V") = e.datatables("A").compute("Sum(V)",fil)
             r("CV") = e.datatables("A").compute("Sum(CV)",fil)
     end select
end select 


感觉这样,Class = 2的行中A变化时,它会重置一次,而它导致CA变化,又会重置一次。可能效率有影响。
如何效率会高一点呢?

[此贴子已经被作者于2016/10/13 16:01:48编辑过]

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


加好友 发短信
等级:超级版主 帖子:110597 积分:562881 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/10/13 16:20:00 [只看该作者]


[此贴子已经被作者于2016/10/13 16:23:44编辑过]

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


加好友 发短信
等级:超级版主 帖子:110597 积分:562881 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/10/13 16:24:00 [只看该作者]

Dim r As DataRow = e.DataRow
Select Case e.DataCol.name
    Case "A","p"
        If r("Class") = 2
            r("V") = r("A") * r("P")
            If e.DataCol.name = "A" Then
                r("CA") = r("A") +DataTables("B").compute("sum(A)",fil)
            Else
                e.DataTable.datacols("ID").RaiseDataColChanged("Code = '" & r("FCode") & "'")
            End If
        End If
    Case "CA","CP"
        If r("Class") = 2
            r("CV") = r("CA") * r("CP")
            e.DataTable.datacols("ID").RaiseDataColChanged("Code = '" & r("FCode") & "'")
        End If
    Case "ID"
        If r("Class") = 1
            Dim fil As String = "汇总条件"
            r("V") = e.DataTables("A").compute("Sum(V)",fil)
            r("CV") = e.DataTables("A").compute("Sum(CV)",fil)
        End If
End Select

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


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2016/10/18 16:08:00 [只看该作者]

是否可以这样呢?似乎看起来更直观一点,代码是多了点
select case r("Class")
  case 2
      select case  e.datacol.name
          case "A"
               r("CA") = r("A") + X
      end select 

      select case e.datacol.name
          case  "A","P"
               r("V") = r("A") * r("P")
         case  "CA","CP"
               r("CV") = r("CA") * r("CP")  
      end select 

      select case e.datacol.name
          case  "V"
               e.DataTable.datacols("A").RaiseDataColChanged("Code = '" & r("FCode") & "' and Class = 1")
         case  "CV"
               e.DataTable.datacols("CA").RaiseDataColChanged("Code = '" & r("FCode") & "' and Class = 1")
      end select 
  case 1
            Dim fil As String = "汇总条件"
         select case e.datacol.name
            case  "A"
               r("V") = e.DataTables("A").compute("Sum(V)",fil)
            case  "CA"
               r("CV") = e.DataTables("A").compute("Sum(CV)",fil)
         end select     
end select 
[此贴子已经被作者于2016/10/18 16:09:53编辑过]

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


加好友 发短信
等级:超级版主 帖子:110597 积分:562881 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/10/18 16:11:00 [只看该作者]

你自己测试通过就可以,这个我没有办法判断,我只是根据代码逻辑来改,看不到你的业务逻辑。

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


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2016/10/18 16:25:00 [只看该作者]

是可以通过,只是效率问题。现在数据量还没那么大
当class = 2 时
    A变化,则CA变化
    A,P变化,则V变化
    CA,CP变化,则CV变化

    当V或CV变化时,重置class = 1的A或CA,计算它们的V或CV值。
[此贴子已经被作者于2016/10/18 16:25:11编辑过]

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


加好友 发短信
等级:超级版主 帖子:110597 积分:562881 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/10/18 16:40:00 [只看该作者]

效率的东西要有数据对比测试才能确定

 回到顶部