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


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

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

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


加好友 发短信
等级:九尾狐 帖子:2191 积分:18007 威望: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编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2191 积分:18007 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/7/6 12:18:00 [显示全部帖子]

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


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


加好友 发短信
等级:九尾狐 帖子:2191 积分:18007 威望: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编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2191 积分:18007 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/7/6 16:13:00 [显示全部帖子]

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

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

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





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


加好友 发短信
等级:九尾狐 帖子:2191 积分:18007 威望: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编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2191 积分:18007 威望: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编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2191 积分:18007 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/7/6 22:08:00 [显示全部帖子]

先点TbMod表的第一行的C,弹出窗口,会依次显示系统响应代码。一般第一行的弹窗不会显示错误。
当所有代码执行结束后,关闭弹窗。

再点TbMod表的第二行的C,弹出窗口……

如果不报错,再点TbMod表的第三行的C,弹出窗口。如果不出意外的话,会报错。

如果还不报错,再点第四行……

我在测试的时候,点TbMod表的第二行的C,在执行过程中就报错了。

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


加好友 发短信
等级:九尾狐 帖子:2191 积分:18007 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/7/6 22:55:00 [显示全部帖子]

不会啊。我这里没有出现过这个问题。
你是不是没有删除冗余项啊。TbWL\TbModD\TbModWBSD三个表都要删除冗余项,否则肯定会报错
上次我也曾经报这个错,经过检查,是表中有数据冗余导致的。

把从这里开始的代码注释掉,再试也行啊。
MessageBox.Show("开始构建UnitWBS")
Functions.Execute("UnitWBS",4,1)

我每次执行完这里,就开始报错了。因为这一句没有执行
            MessageBox.Show("开始构建UnitWBS")


MessageBox.Show("开始给涉及WBSDR赋值,需要计算的数据=" & owbs.Count & "很奇怪的是执行到这里之后,就开始报错,问题在哪里呢?")
[此贴子已经被作者于2018/7/6 23:04:00编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2191 积分:18007 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/7/6 23:05:00 [显示全部帖子]

TbWL表中,ProID、WBSID、LID三列的值不能完全相同
比如TbModD中,ProID、ModID、WLID中,三列的值不能完全相同,。
TbModWBSD中,ProID、ModID、WBSID三列的值不能完全相同。

如果完全相同,则就是重复数据,需要删除
[此贴子已经被作者于2018/7/6 23:39:01编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2191 积分:18007 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/7/7 9:51:00 [显示全部帖子]

需求并不复杂。
就是把TbMod所对应的TbModD和TbModWBSD的有关信息,展示在一个表中,用于编辑。
本来还可以在窗口中用两个表(一个绑定TbModWBSD,一个绑定TbModD)来做,但是在用和看的时候,并不方便。

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