以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- [求助]代码执行中会报出错误 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=121444) |
-- 作者:chnfo -- 发布时间:2018/7/6 11:50:00 -- [求助]代码执行中会报出错误 Dim st As Date = Date.Now Dim log As String = "" Dim r As Row = Tables("TbMod").Current DataTables("TbModD").loadfilter = "ModID = \'" & r("ID") & "\'" \'‘TbModD的数据大约有7000行 DataTables("TbModD").load() If DataTables("TbModD").Find("ModID = \'" & r("ID") & "\'") IsNot Nothing Then output.Show("找到明细,开始执行程序") tv.StopRedraw t.StopRedraw output.Show("开始清除WBSL的表达式") Dim cns As String = "A,C,LC,P,PC,SC,T,U,FMV" For Each c As String In cns.Split(",") DataTables("WBSL").DataCols(c).Expression = "" Next output.Show("开始构建UnitWL") Dim dt As DataTable = Functions.Execute("UnitWL",4,"PM") log & = "构表耗时: " & (Date.Now - st).TotalSeconds & "秒" & vbcrlf log & = "Temp表的数据行=" & dt.DataRows.Count & vbcrlf output.Show("开始计算明细WBSID序列") Dim xs As List(of String) = dt.GetValues("WBSID") \'获得变更明细对应的WBSID序列 log & = "明细WBSID序列耗时: " & (Date.Now - st).TotalSeconds & "秒" & vbcrlf Dim OWBS As new List(of DataRow) If xs.Count > 0 Then output.Show("明细WBSID行数不为0,开始计算末级WBSC序列") Dim wcs As new List(of String) For Each x As String In xs Dim dr As DataRow = DataTables("TbWBS").Find("ID = \'" & x & "\'") If dr IsNot Nothing Then wcs.Add(dr("C")) End If Next log & = "末级WBSC序列耗时: " & (Date.Now - st).TotalSeconds & "秒" & vbcrlf If wcs.Count > 0 Then output.Show("末级WBSC序列不为0,开始计算WBSC序列") Dim zs As List(of String) = Functions.Execute("CArray",wcs,".",1,2) ’这是我自定义的函数 log & = "所有WBSC序列耗时: " & (Date.Now - st).TotalSeconds & "秒" & vbcrlf output.Show("开始计算所有WBSDR") For Each z As String In zs Dim dr As DataRow = DataTables("TbWBS").Find("C = \'" & z & "\'") If dr IsNot Nothing Then OWBS.Add(dr) ‘OWBS的数据大约有8000行左右 End If Next log & = "所有WBSDR序列耗时: " & (Date.Now - st).TotalSeconds & "秒,所有序列长度=" & owbs.Count & vbcrlf ‘Dim xyz As String = "" ’For Each dr As DataRow In owbs ‘xyz &= dr("ID") & chr(9) ’Next ‘output.Show("所有的WBSID为" & xyz) ’如果这段代码不注释掉,整个代码执行都没有问题,TbMod表目前有10行,都顺利执行完成。 output.Show("开始给涉及WBSDR赋值") ‘这行信息显示之后,报出错误“未将对象引用设置到对象的实例”,但勾选查看详细,又没具体说明 systemready = False For Each dr As DataRow In owbs dr("Temp") = True Next systemready = True log & = "WBSID序列的Temp列赋值耗时: " & (Date.Now - st).TotalSeconds & "秒,需要计算的数据=" & owbs.Count & vbcrlf End If End If End If output.Show(log) 在数据量很少的时候(比如20行以内),不论怎么执行都不会报错。 所以,问题: 1、这个赋值报错,可能跟数据量大小是有关系的 2、如果把需要赋值的行的ID都显示出来,可以顺利执行。是不是可能有些代码是要延时处理的,否则会有问题? [此贴子已经被作者于2018/7/6 11:52:01编辑过]
|
-- 作者:有点甜 -- 发布时间:2018/7/6 12:03:00 -- OWBS 保存的是查找的行,在循环的过程中,你表格的数据是否有变化?(比如重新加载、删除等操作,导致对应的行丢失) |
-- 作者:chnfo -- 发布时间:2018/7/6 12:18:00 -- 没有,因为OWBS所查找的表数据已经load到本地,过程中,所涉及的数据都是本地数据,而且,虽然使用的是外部数据库ACCESS,但实际上只有我一个人用,在操作过程中,ACCESS并没有打开和操作。 |
-- 作者:chnfo -- 发布时间:2018/7/6 12:19:00 -- 1、数据量少的时候,不会出现任何问题。 2、如果‘Dim xyz As String = "" ’For Each dr As DataRow In owbs ‘xyz &= dr("ID") & chr(9) ’Next ‘output.Show("所有的WBSID为" & xyz) ’如果这段代码不注释掉,整个代码执行都没有问题,TbMod表目前有10行,都顺利执行完成 完全相同的代码,完全相同的环境,完全相同的数据库,如果这段代码注释掉,就会报错;这段代码不注释掉,就顺利执行。非常怪异。
[此贴子已经被作者于2018/7/6 12:21:09编辑过]
|
-- 作者:有点甜 -- 发布时间:2018/7/6 12:20:00 -- 例子发上来测试。 |
-- 作者:chnfo -- 发布时间:2018/7/6 16:13:00 -- 因上传文件大小限制,删除了TbWL和TbMOD表中的很多数据。原本TbWL表中的数据有35000行,TbMod表中的数据有8000行(设置了加载条件后) 自定义函数里做了几个随机增加数据的函数,要注意随机增加后把重复数据删除(偷懒没有把删除重复数据的代码加上,手工删除算了) |
-- 作者:有点甜 -- 发布时间:2018/7/6 17:47:00 -- 你给的例子,要怎么测试,才出现错误? |
-- 作者:chnfo -- 发布时间:2018/7/6 20:57:00 -- 增加多行TbMod对应的子表TbModD的数据(一般在7000行左右)。然后点击TbMod的“C”列,弹出窗口,点击“4构表”按钮。 一般情况下,点第一行,不会有问题。 但再点第二行的时候,有可能会报错 如果还不报错,再点第三行。 我在点的时候,一般点第二行就会报出错误。但并不一定每次切换行,点C列,弹出窗口必然报错。可以多试几次,肯定会出现错误 但是,如果TbModD的数据量很小,不会报错。数据量达到一定程度,才会报错。我在测试的时候,一般 datatables("TbModD").loadfilter = "ProID = \'" & CurproID & "\' and ModID = \'" & tables("TbMod").current("ID") & "\'" 加载的数据会有7000行左右,此时,如果点多行,必定在给OWBS对应的行的Temp列赋true时,报错 [此贴子已经被作者于2018/7/6 21:05:40编辑过]
|
-- 作者:有点蓝 -- 发布时间:2018/7/6 21:16:00 -- 点击“4构表”按钮后弹出几个提示,然后明细表没有数据,点击哪个表的第一行、第二行、第三行? |
-- 作者:chnfo -- 发布时间:2018/7/6 21:24:00 -- 要用随机增加的自定义函数,增加数据啊。增加数据之后,要删除冗余行,否则可能开始就会出错。冗余行的判断说明在自定义函数里 因为增加TbModD和TbModWBSD数据后,会超过上传附件的大小,所以我把数据删除了 1、先增加TbWL表数据,删除冗余行 2、再增加TbModD表数据,删除冗余行 3、再增加TbModWBSD表数据,删除冗余行 在有数据的情况下,点击构表4按钮,一步步执行,当执行到给OWBS的行赋值时,就会报错。但数据量小了就不会。我在测试的时候,单行TbMod对应的TbModD的数据有8000行左右。
[此贴子已经被作者于2018/7/6 21:38:48编辑过]
|