以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]同步更新关联列的处理逻辑  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=49693)

--  作者:tubairabbit
--  发布时间:2014/4/22 17:46:00
--  [求助]同步更新关联列的处理逻辑

同步更新关联列的处理逻辑是什么?

a. 对子表关联行,直接修改关联列的数据?

b. 新增复制关联行,关联列为修改后数据,再删除原关联行?

 

因为有如下父表A  关联子表B,勾选了同步更新关联列,同步删除关联行

表A                                           表B

关联列  第二列  第三列                  关联列 

test1                                        test1   

                                               test1 

 

表B datacolchanged设置:

Select Case e.DataCol.Name
    Case "关联列"
   Dim dr As DataRow
dr = DataTables("表A").Find("关联列 = \'" & e.NewValue & "\'")
    If dr IsNot Nothing Then
        dr("第二列") = "执行了新值代码"
    End If

Dim pr As DataRow
pr = DataTables("表A").Find("关联列 = \'" & e.OldValue & "\'")
    If pr IsNot Nothing Then
        pr("第三列") = "执行了旧值代码"
    End If

End Select

 

发现修改表A关联列内容为test2后,如下:表B关联列是能够同步更新,但是为什么没有执行新值代码?

 

表A                                           表B

关联列  第二列  第三列                  关联列 

test2              执行了旧值代码      test2   

                                               test2 

 

 

 

 

[此贴子已经被作者于2014-4-22 17:46:41编辑过]

--  作者:Bin
--  发布时间:2014/4/22 17:51:00
--  
弹出一下看看是否有触发事件
--  作者:有点甜
--  发布时间:2014/4/22 17:51:00
--  

 呃,同一个时间,一行,怎么可能脚踏两条船?

 

dr = DataTables("表A").Find("关联列 = \'" & e.NewValue & "\'")

pr = DataTables("表A").Find("关联列 = \'" & e.OldValue & "\'")


--  作者:有点甜
--  发布时间:2014/4/22 17:53:00
--  
 直接说你的意图。
--  作者:tubairabbit
--  发布时间:2014/4/22 18:10:00
--  

实际的数据是

表A

关联列  费用合计          

pc001  300

pc002  150

 

表B

关联列  费用种类  费用金额

pc001  保费       100                

pc001  运费       200

pc002  保费       100             

pc002  税费       50           ------> pc001 税费 50

考虑到有可能表B的关联列pc002修改为pc001,需重新统计表A的“费用合计”,所以在表B datacolchanged 设置了:

Select Case e.DataCol.Name
    Case "关联列" \'子表关键字变化,触发父表新旧2个关键字汇总内容更新
        If e.OldValue <> e.NewValue Then
            Dim pr,prold As DataRow
            pr = DataTables("表A
").Find("[关联列] = \'" & e.DataRow("关联列") & "\'")
            prold = DataTables("表A").Find("[关联列] = \'" & e.OldValue & "\'")
            If pr IsNot Nothing Then
                pr("费用合计") = DataTables("表B").Compute("Sum([费用金额])","[关联列] = \'" & e.DataRow("关联列") & "\'")
             messagebox.show("新值代码执行")

End If
           
            If prold IsNot Nothing Then

           prold("费用合计") = DataTables("表B").Compute("Sum([费用金额])","[关联列] = \'" & e.OldValue & "\'")
           messagebox.show("旧值代码执行")

   End If

   End If

 

此代码对于上面修改子表数据的情况,确实起到作用了,

表A

关联列  费用合计          

pc001  350

pc002  100

 

但是觉得勾选了“同步更新关联列”,pc001改成pc003,应该也能触发表B的新旧两个值的这两段代码,为什么旧值代码执行了,新值汇总的代码没有执行?


               

 


--  作者:tubairabbit
--  发布时间:2014/4/22 18:17:00
--  

如果不用关联设置里的“同步更新关联列”内容,改用写代码的方式实现关联列更新,在表A的datacolchanged中设置了

Select Case e.DataCol.Name

    Case "关联列"

  Dim Filter As String = "[关联列] = \'" & e.OldValue  & "\'"
DataTables("表B").ReplaceFor(e.DataCol.Name, e.NewValue, Filter)    

end select

 

发现就没问题,能够按预想执行表B的关联列的新旧两个值汇总的代码。 这里我主要是希望执行新值汇总的代码。    

[此贴子已经被作者于2014-4-22 18:19:48编辑过]

--  作者:有点甜
--  发布时间:2014/4/22 19:29:00
--  
 能用就好,不要细究,不知内部可能做什么操作的。
--  作者:tubairabbit
--  发布时间:2014/4/23 9:11:00
--  

大家如果“关联”里设置同步更新关联列,都是怎样设计父表汇总的呀?


--  作者:Bin
--  发布时间:2014/4/23 9:14:00
--  
你喜欢怎么样汇总都可以.

有条件统计子表数据看这里http://www.foxtable.com/help/topics/2472.htm

--  作者:有点甜
--  发布时间:2014/4/23 9:53:00
--  
以下是引用tubairabbit在2014-4-23 9:11:00的发言:

大家如果“关联”里设置同步更新关联列,都是怎样设计父表汇总的呀?

 

看9楼,也可以用代码统计。

 

你的思路错了,你应该把统计代码写在父表才对的。