以文本方式查看主题 - 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) if r isnot nothing then end if 但貌似Dictionary不支持数组,例如 Dic As new Dictionary(of DataRow, string()) 这样,如果有多列赋值就得定义多个dic,这个就有点小麻烦了 另外
Dim Dic As new
Dictionary(of
DataRow, Integer) 最后一段代码 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 \' \' |