以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [讨论]DataTable 内部索引已损坏:“5”  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=123729)

--  作者:syjylyq
--  发布时间:2018/8/22 8:41:00
--  [讨论]DataTable 内部索引已损坏:“5”
DataTable 内部索引已损坏:“5”的原因网上查了一下,网上的说法应该是跟datatable.select的函数有关。select执行时会创建一个dataview,此时数据被操作,内部引索就会被破坏,从而出错。

这是一张订单表

图片点击可在新窗口打开查看此主题相关图片如下:订单表.png
图片点击可在新窗口打开查看
这是一张订单的核价表

图片点击可在新窗口打开查看此主题相关图片如下:订单核价表.png
图片点击可在新窗口打开查看
两张表的数据都是同一个datatable

这是订单成本统计时的窗口,保存并关闭按钮中使用了select功能查找订单表的行,统计成本

图片点击可在新窗口打开查看此主题相关图片如下:成本核算.png
图片点击可在新窗口打开查看

经过试验发现,订单表使用上面查询工单号、款号等查询功能时,就会出现DataTable 内部索引已损坏:“5”的错误。
订单表不去操作,单单统计成本就会不会。
是不是这样理解,订单表查询时生成了一个dataview,保存并关闭按钮中使用了select功能运行时后台也要有一个datatable的dataview,但是这个dataview是订单表查询时生成的dataview,跟select的查询条件不匹配,所以出错了?

--  作者:有点蓝
--  发布时间:2018/8/22 8:47:00
--  
查询工单号、款号等查询功能具体写了什么代码?

保存并关闭按钮写了什么代码?

--  作者:syjylyq
--  发布时间:2018/8/22 9:16:00
--  

查询插件类似以下代码


订单管理_工单号_ValueChanged

 

Tables("订单信息").Filter = "工单号 = \'" & e.Sender.Value & "\'"

Tables("订单信息").Sort = "工单号"


保存并关闭

If Tables("成本录入窗口_成本明细表").Rows.Count > 0 Then

    Functions.Execute("保存更新","成本录入窗口_成本明细表","成本明细表")

    Functions.Execute("成本报交")

    Functions.Execute("保存更新单行","成本核算_订单信息","订单信息")

End If

e.Form.Close


保存更新的内部函数


Dim a As String = Args(0)

Dim b As String = Args(1)

For Each r As Row In Tables(a).rows

    Dim p As String = IIF(r.DataRow.RowState = DataRowState.Added, "A#", "U#")

    r.Save()

    Dim msg As String = p & b & "#" & r("_Identify")

    For Each bd As QQBuddy In QQClient.Buddies

        If bd.Online Then

            QQClient.Send(bd.name, msg)

        End If

    Next

Next


成本报交的内部函数:


Dim r As Row = Tables("成本核算_订单信息").Current

Dim nms() As String  = {"胚成本_原料费","胚成本_加工费","胚成本_其他","胚成本_原料费1","胚成本_加工费1","胚成本_其他1","制造成本_原料费","制造成本_染色费","制造成本_定型费","制造成本_车工费","制造成本_装饰费","制造成本_其他","包装成本_原料费","包装成本_辅料费","包装成本_加工费","包装成本_包装费","非人工成本费","包装成本_其他","管理费","包装成本_出运费","报关费","异常支出"}

For Each nm As String In nms

    r(nm) = Nothing

Next

Dim s As List (of String) = DataTables("成本明细表").GetValues("项目名称","工单号 = \'" & r("工单号") & "\'")

If s.Count > 0 Then

    For i As Integer = 0 To s.Count - 1

        r(s(i)) = DataTables("成本明细表").Compute("sum(金额)","工单号 = \'" & r("工单号") & "\' and 项目名称 = \'" & s(i) & "\'")

    Next

End If


保存更新单行的内部函数

Dim a As String = Args(0)

Dim b As String = Args(1)

Dim r As Row = Tables(a).Current

Dim p As String = IIF(r.DataRow.RowState = DataRowState.Added, "A#", "U#")

r.Save()

Dim msg As String = p & b & "#" & r("_Identify")

For Each bd As QQBuddy In QQClient.Buddies

    If bd.Online Then

        QQClient.Send(bd.name, msg)

    End If

Next



--  作者:有点蓝
--  发布时间:2018/8/22 9:30:00
--  
导出有问题的表和窗口到新的项目测试看还有没有问题,还有就把新项目上传测试
--  作者:syjylyq
--  发布时间:2018/8/22 13:49:00
--  
我把datatable里面的CurrentChanged事件里面的代码注释掉后不提示了,搞不懂什么原因。
[此贴子已经被作者于2018/8/22 13:50:52编辑过]

--  作者:有点蓝
--  发布时间:2018/8/22 13:52:00
--  
CurrentChanged事件写了什么代码?
--  作者:syjylyq
--  发布时间:2018/8/23 13:03:00
--  

If Tables("订单信息").Current IsNot Nothing Then

    Tables("订单明细").Filter = "工单号 = \'" & Tables("订单信息").Current("工单号") & "\'"

    Tables("备料明细").Filter = "工单号 = \'" & Tables("订单信息").Current("工单号") & "\'"

End If


--  作者:syjylyq
--  发布时间:2018/8/23 13:11:00
--  

图片点击可在新窗口打开查看此主题相关图片如下:qq图片20180823131404.png
图片点击可在新窗口打开查看
另外请问EXCEL的表达式,像这种<[款号] & " " & [模具号] & " " & [尺码]>多个字符串加在一起的,如果最后一个尺码的字符串是英文字符”结尾的话就会出错是吗?

--  作者:有点蓝
--  发布时间:2018/8/23 14:06:00
--  
回7楼,代码看不出什么问题,要测试过才知道了。

回8楼,测试确实有这个问题,算是一个bug,已反馈