Foxtable(狐表)用户栏目专家坐堂 → 从字符串“”到类型“Double”的转换无效


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

主题:从字符串“”到类型“Double”的转换无效

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


加好友 发短信
等级:七尾狐 帖子:1536 积分:9956 威望:0 精华:0 注册:2014/12/18 16:12:00
从字符串“”到类型“Double”的转换无效  发帖心情 Post By:2020/4/14 14:10:00 [只看该作者]

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”的转换无效。>这样的警告。请教为什么?谢谢。

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


加好友 发短信
等级:超级版主 帖子:109503 积分:557183 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By: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
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:七尾狐 帖子:1536 积分:9956 威望:0 精华:0 注册:2014/12/18 16:12:00
  发帖心情 Post By:2020/4/14 16:16:00 [只看该作者]

非常感谢您的详细解释。

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


加好友 发短信
等级:七尾狐 帖子:1536 积分:9956 威望:0 精华:0 注册:2014/12/18 16:12:00
  发帖心情 Post By: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”的转换无效>这个警告,而且导致“采购单”和"批号表"的数据错误。请问是哪里问题呢?

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


加好友 发短信
等级:超级版主 帖子:109503 积分:557183 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/14 17:34:00 [只看该作者]

这个事件还有没有其它代码?

调试技巧:http://www.foxtable.com/webhelp/scr/1485.htm,看哪一句代码出错

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


加好友 发短信
等级:七尾狐 帖子:1536 积分:9956 威望:0 精华:0 注册:2014/12/18 16:12:00
  发帖心情 Post By:2020/4/14 17:44:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:出入库datacolchanged全部代码.rar


这是全部代码。我一下子加了太多message.box, 测试起来老是要按取消。不得不强行退出系统。

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


加好友 发短信
等级:七尾狐 帖子:1536 积分:9956 威望:0 精华:0 注册:2014/12/18 16:12:00
  发帖心情 Post By:2020/4/14 18:52:00 [只看该作者]

我把 MessageBox.Show(1) 这句代码放在 datacolchanged 事件里面任何位置都会出现一样的警告。

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


加好友 发短信
等级:七尾狐 帖子:1536 积分:9956 威望:0 精华:0 注册:2014/12/18 16:12:00
  发帖心情 Post By:2020/4/14 18:55:00 [只看该作者]

我们仓库等着用系统,可否请你帮我再看一下,究竟是哪里的问题?谢谢。

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


加好友 发短信
等级:超级版主 帖子:109503 积分:557183 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/4/14 20:53:00 [只看该作者]

大概看了一下,无法判断问题。还是调试一下吧。调试的时候不要重置列,改一行数据调试,或者只加载一行数据调试。先少放几个提示框缩小范围,再在小范围内添加提示框调试。

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


加好友 发短信
等级:七尾狐 帖子:1536 积分:9956 威望:0 精华:0 注册:2014/12/18 16:12:00
  发帖心情 Post By:2020/4/15 8:54:00 [只看该作者]

找到问题了。还是2楼说的第2点问题。改正代码后,运行一段时间看看情况。谢谢。

 回到顶部