以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 从字符串“”到类型“Double”的转换无效 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=148736) |
||||
-- 作者:edisontsui -- 发布时间:2020/4/14 14:10:00 -- 从字符串“”到类型“Double”的转换无效 If e.DataCol.name = "入库数量" If e.DataRow("采购单号") = "" Else For Each dr As DataRow In DataTables("采购单").DataRows If dr("采购单号") = e.DataRow("采购单号") And dr("采购单行号") = e.DataRow("采购单行号") And dr("物料编号") = e.DataRow("物料编号") Then dr("收货数量") = e.DataRow("入库数量") + dr("收货数量") - e.OldValue Exit For Else Continue For End If Next End If End If 上面那段代码是在“出入库”这个数据表之datacolchanged里面的,运行时会出现如下警告: .NET Framework 版本:2.0.50727.8793 Foxtable 版本:2017.3.18.1 错误所在事件:表,出入库,DataColChanged 详细错误信息: 调用的目标发生了异常。 从字符串“”到类型“Double”的转换无效。 输入字符串的格式不正确。 “出入库”里面的“入库数量”变动同时也会影响到我们的“批号表”这个数据表: If e.DataCol.name = "入库数量" OrElse e.DataCol.name = "出库数量" OrElse e.DataCol.name = "批号" e.DataRow("出入库数量") = e.DataRow("出库数量") + e.DataRow("入库数量") \'批号表自动更新数据 If e.DataRow("批号") = "" Else Dim re As Boolean = False For Each dr As DataRow In DataTables("批号表").DataRows If dr("批号") = e.DataRow("批号") And dr("物料编号") = e.DataRow("物料编号") Then dr("库存数量") = e.DataRow("入库数量") + e.DataRow("出库数量") + dr("库存数量") - e.OldValue dr("批号变动记录") = "出入库变动:" & Date.now & " " & User.Name dr("库存数量变动记录") = "出入库变动:" & Date.now & " " & User.Name re = True Exit For Else Continue For End If Next If re = False Dim dr As DataRow dr = DataTables("批号表").AddNew() dr("批号") = e.DataRow("批号") dr("物料编号") = e.DataRow("物料编号") dr("物料名称") = e.DataRow("物料名称") dr("类别") = e.DataRow("类别") dr("来源") = e.DataRow("来源") dr("客户简称") = e.DataRow("客户") dr("库存数量") = e.DataRow("入库数量") + e.DataRow("出库数量") dr("批号变动记录") = "出入库变动:" & Date.now & " " & User.Name dr("库存数量变动记录") = "出入库变动:" & Date.now & " " & User.Name End If \'2018/8/15增加此句,自动删除批号表里面库存数量=0的数据行 DataTables("批号表").deletefor("库存数量 = 0") End If End If 以上代码多年来运行得都好好的,但是最近几天老是出现<调用的目标发生了异常。从字符串“”到类型“Double”的转换无效。>这样的警告。请教为什么?谢谢。 |
||||
-- 作者:有点蓝 -- 发布时间:2020/4/14 14:43:00 -- 几个问题 1、判断单元格是否为空(If e.DataRow("批号") = "")建议使用isnull(If e.DataRow.isnull("批号") = true) If e.DataRow("批号") = "" Else …… endif 这种还不如直接使用 If e.DataRow("批号") > "" …… endif 或者 If e.DataRow.isnull("批号") = false …… endif 2、这种在遍历里面判断还不如按条件只取符合条件的数据处理 For Each dr As DataRow In DataTables("批号表").DataRows If dr("批号") = e.DataRow("批号") And dr("物料编号") = e.DataRow("物料编号") Then dr("库存数量") = e.DataRow("入库数量") + e.DataRow("出库数量") + dr("库存数量") - e.OldValue dr("批号变动记录") = "出入库变动:" & Date.now & " " & User.Name dr("库存数量变动记录") = "出入库变动:" & Date.now & " " & User.Name re = True Exit For Else Continue For End If Next 改为 For Each dr As DataRow In DataTables("批号表").select("物料编号=\'" & e.DataRow("物料编号") & "\' and 批号=\'" & e.DataRow("批号") & "\'") dr("库存数量") = e.DataRow("入库数量") + e.DataRow("出库数量") + dr("库存数量") - e.OldValue dr("批号变动记录") = "出入库变动:" & Date.now & " " & User.Name dr("库存数量变动记录") = "出入库变动:" & Date.now & " " & User.Name re = True Next 3、最重要的一点,在判断多个列名的情况下,一般不要使用e.OldValue或者e.newValue这种用法。"入库数量","出库数量","批号"这3个列都会触发这个事件,如果是入库数量触发的e.OldValue就是入库数量的旧值。如果是批号列触发的e.OldValue就是批号的旧值。 您觉得如果是批号列触发的,下面代码还合理吗?一楼的错误就是这里的原因 dr("库存数量") = e.DataRow("入库数量") + e.DataRow("出库数量") + dr("库存数量") - e.OldValue |
||||
-- 作者:edisontsui -- 发布时间:2020/4/14 16:16:00 -- 非常感谢您的详细解释。 |
||||
-- 作者:edisontsui -- 发布时间:2020/4/14 17:04:00 -- If e.DataCol.name = "入库数量" OrElse e.DataCol.name = "出库数量" e.DataRow("出入库数量") = e.DataRow("出库数量") + e.DataRow("入库数量") \'批号表自动更新数据 If e.DataRow.isnull("批号") = True Else Dim re As Boolean = False For Each dr As DataRow In DataTables("批号表").Select("物料编号=\'" & e.DataRow("物料编号") & "\' and 批号=\'" & e.DataRow("批号") & "\'") dr("库存数量") = e.DataRow("入库数量") + e.DataRow("出库数量") + dr("库存数量") - e.OldValue dr("批号变动记录") = "出入库变动:" & Date.now & " " & User.Name dr("库存数量变动记录") = "出入库变动:" & Date.now & " " & User.Name re = True Next If re = False Dim dr As DataRow dr = DataTables("批号表").AddNew() dr("批号") = e.DataRow("批号") dr("物料编号") = e.DataRow("物料编号") dr("物料名称") = e.DataRow("物料名称") dr("类别") = e.DataRow("类别") dr("来源") = e.DataRow("来源") dr("客户简称") = e.DataRow("客户") dr("库存数量") = e.DataRow("入库数量") + e.DataRow("出库数量") dr("批号变动记录") = "出入库变动:" & Date.now & " " & User.Name dr("库存数量变动记录") = "出入库变动:" & Date.now & " " & User.Name End If \'2018/8/15增加此句,自动删除批号表里面库存数量=0的数据行 DataTables("批号表").deletefor("库存数量 = 0") End If End If ============ 上面的代码中,我已经做了更改,并且去掉了 e.DataCol.name = "批号" 这个判断,但还是有<从字符串“”到类型“Double”的转换无效>这个警告,而且导致“采购单”和"批号表"的数据错误。请问是哪里问题呢?
|
||||
-- 作者:有点蓝 -- 发布时间:2020/4/14 17:34:00 -- 这个事件还有没有其它代码? 调试技巧:http://www.foxtable.com/webhelp/scr/1485.htm,看哪一句代码出错
|
||||
-- 作者:edisontsui -- 发布时间:2020/4/14 17:44:00 --
这是全部代码。我一下子加了太多message.box, 测试起来老是要按取消。不得不强行退出系统。
|
||||
-- 作者:edisontsui -- 发布时间:2020/4/14 18:52:00 -- 我把 MessageBox.Show(1) 这句代码放在 datacolchanged 事件里面任何位置都会出现一样的警告。 |
||||
-- 作者:edisontsui -- 发布时间:2020/4/14 18:55:00 -- 我们仓库等着用系统,可否请你帮我再看一下,究竟是哪里的问题?谢谢。 |
||||
-- 作者:有点蓝 -- 发布时间:2020/4/14 20:53:00 -- 大概看了一下,无法判断问题。还是调试一下吧。调试的时候不要重置列,改一行数据调试,或者只加载一行数据调试。先少放几个提示框缩小范围,再在小范围内添加提示框调试。 |
||||
-- 作者:edisontsui -- 发布时间:2020/4/15 8:54:00 -- 找到问题了。还是2楼说的第2点问题。改正代码后,运行一段时间看看情况。谢谢。 |