以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]表达式列重算  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=134002)

--  作者:chnfo
--  发布时间:2019/4/25 9:13:00
--  [求助]表达式列重算
帮助的“表达式列的影响”里,这样描述表达式列的重算问题
实际上只要子表引用了父表的数据,批量修改父表中的任何一列都会受到影响,当然批量修改被引用的列受影响的程度最为明显。

假如父表有三列ABC,子表的表达式引用了父表的ABC三列。

问题:
1、如果父表批量修改X列(这一列并未被子表引用),是否也会导致子表的ABC三列重算?
2、如果只是个别修改父表中的ABC中的某一行的数据,是否就几乎没有什么影响?目前我做的项目实例,如果修改单行的父表数据,几乎感觉不到计算延时。
3、但表达式有很多好处,有时候用起来还是挺方便。目前我的思路是父表在操作的时候,尽量用导入(在导入的时候,把表达式去掉,导入完成后,再赋表达式),还有没别的更好的办法?

--  作者:有点甜
--  发布时间:2019/4/25 9:22:00
--  

 

 这个没办法。不然就减少使用表达式引用父表数据、统计子表数据。

 

 


--  作者:chnfo
--  发布时间:2019/4/25 9:37:00
--  
表达式看来极少量数据可以考虑使用。
就象有一个商品目录表A,在入库明细表中,直接用商品ID,然后引用表A的编号、名称、规格、单位,方便在界面上显示。
这都可能会有效率上的问题

只是类比举个例子。我们做的业务,商品目录A都可能会修改信息的
[此贴子已经被作者于2019/4/25 9:37:17编辑过]

--  作者:有点甜
--  发布时间:2019/4/25 12:45:00
--  

 

如果需要效率,那就自己写代码控制,动态添加临时列,然后跨表引用数据过来显示。

 

 


--  作者:chnfo
--  发布时间:2019/4/27 18:48:00
--  

甜版主所说的方法,我也考虑过。不过,我没想着增加动态列,这个代码工作量有点大了。我是想着增加表达式列,但不给它赋公式,要用的时候给表达式赋值

本来是想借用“查询与赋值并存”中的思路


Dim Dic As new Dictionary(of DataRow, string)

For Each
dr As DataRow In DataTables("子表").DataRows
    dim r as datarow = DataTables("主表").find("ID = \'" & dr("主表ID") & "\'")

   if r isnot nothing then 
    dic
.Add(dr, r("列1")

   end if 
Next
For Each
dr As DataRow In dic.Keys
   
dr("列X") = dic(dr)
Next


但貌似Dictionary不支持数组,例如 Dic As new Dictionary(of DataRowstring())

这样,如果有多列赋值就得定义多个dic,这个就有点小麻烦了



另外

Dim Dic As new Dictionary(of DataRow, Integer)
For Each dr As DataRow In DataTables("表A").DataRows
    dic.Add(dr, dr("V"))
Next
For Each
dr As DataRow In dic.Keys
   
dr("第四列") = dic(dr)
Next


最后一段代码

for i as integer = 0 to dic.count - 1

dim dr as datarow = dic.keys(i)   \'--------这一段有错误吗?

next




就算是定义dim mm as datarow = dic.keys(0)  \'---这样也是会报错的。

报错为:

编译错误:类“System.Collections.Generic.Dictionary(Of DataRow, String()).KeyCollection”没有默认属性,因此无法被索引。  错误代码:Dim uu As DataRow = dic.Keys(0)




[此贴子已经被作者于2019/4/27 20:44:38编辑过]

--  作者:chnfo
--  发布时间:2019/4/27 21:03:00
--  
用了另一个做法。就是不知道很大数据量(比如说4万行)的情况下,是表达式效率更高,还是赋值效率更高。-----以前试过一次,好象用表达式效率高很多
\'\'\'
Dim s() As String = {"T","U"}
Dim a() As String = {"T1","U1"}

Dim Dic As new Dictionary(of DataRow, String())
Dim n As Integer = s.Length

For Each dr As DataRow In DataTables("E").dataRows
    Dim k(n - 1) As String
    Dim cs As DataRow = DataTables("D").Find("C =  \'" & dr("C1") & "\'")
    
    If cs IsNot Nothing Then
        For  i As Integer = 0 To n - 1
            k(i) = cs(s(i))
        Next
        Dic.Add(dr,k)
    End If
Next
\'
For Each dr As DataRow In dic.Keys
    Dim m() As String = dic(dr)
    For j As Integer = 0 To a.Length - 1
        dr(a(j)) = m(j)
    Next
Next
\'
\'