以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]RaiseDataColChanged的用法问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=91568)

--  作者:chnfo
--  发布时间:2016/10/13 15:28:00
--  [求助]RaiseDataColChanged的用法问题
表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编辑过]

--  作者:有点蓝
--  发布时间:2016/10/13 16:20:00
--  

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

--  作者:有点蓝
--  发布时间: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
--  发布时间: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编辑过]

--  作者:有点蓝
--  发布时间:2016/10/18 16:11:00
--  
你自己测试通过就可以,这个我没有办法判断,我只是根据代码逻辑来改,看不到你的业务逻辑。
--  作者:chnfo
--  发布时间: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编辑过]

--  作者:有点蓝
--  发布时间:2016/10/18 16:40:00
--  
效率的东西要有数据对比测试才能确定