Foxtable(狐表)用户栏目专家坐堂 → [求助]代码执行中会报出错误


  共有4422人关注过本帖树形打印复制链接

主题:[求助]代码执行中会报出错误

帅哥哟,离线,有人找我吗?
chnfo
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2179 积分:17863 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]代码执行中会报出错误  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/7/6 12:03:00 [只看该作者]

OWBS 保存的是查找的行,在循环的过程中,你表格的数据是否有变化?(比如重新加载、删除等操作,导致对应的行丢失)

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2179 积分:17863 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/7/6 12:18:00 [只看该作者]

没有,因为OWBS所查找的表数据已经load到本地,过程中,所涉及的数据都是本地数据,而且,虽然使用的是外部数据库ACCESS,但实际上只有我一个人用,在操作过程中,ACCESS并没有打开和操作。


 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2179 积分:17863 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/7/6 12:20:00 [只看该作者]

例子发上来测试。

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2179 积分:17863 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/7/6 16:13:00 [只看该作者]

因上传文件大小限制,删除了TbWL和TbMOD表中的很多数据。原本TbWL表中的数据有35000行,TbMod表中的数据有8000行(设置了加载条件后)

自定义函数里做了几个随机增加数据的函数,要注意随机增加后把重复数据删除(偷懒没有把删除重复数据的代码加上,手工删除算了)

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:pm2018.zip





 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/7/6 17:47:00 [只看该作者]

你给的例子,要怎么测试,才出现错误?

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2179 积分:17863 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:105493 积分:536456 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2018/7/6 21:16:00 [只看该作者]

点击“4构表”按钮后弹出几个提示,然后明细表没有数据,点击哪个表的第一行、第二行、第三行?

 回到顶部
帅哥哟,离线,有人找我吗?
chnfo
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2179 积分:17863 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By: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编辑过]

 回到顶部
总数 39 1 2 3 4 下一页