以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- 计算余数代码问题 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=152584) |
-- 作者:edisontsui -- 发布时间:2020/7/15 19:02:00 -- 计算余数代码问题 \'用于计算余数 Dim drs As New List(of DataRow) With DataTables("出入库") For Each nm As String In .GetValues("物料编号") \'找出每个物料编号的第一行数据, 添加到集合drs中 drs.Add(.Find("物料编号 = \'" & nm & "\'", "[_SortKey]")) Next For Each r As DataRow In drs .DataCols("出入库数量").RaiseDataColChanged(r) \'重置每个产品的第一行 Next End With \'余数计算结束 以上用于计算余数的代码是放在afteropenproject里面的,但老是出现如下警告: .NET Framework 版本:4.0.30319.34209 Foxtable 版本:2020.5.29.8 错误所在事件:项目,AfterOpenProject 详细错误信息: 未将对象引用设置到对象的实例。 请问为什么? |
-- 作者:有点蓝 -- 发布时间:2020/7/16 8:38:00 -- 1、Find查询不一定有结果,虽然理论上这里不可能没有结果,但是程序运行很多时候代码之间可能会互相干扰的,所以尽量还是先判断在使用:http://www.foxtable.com/webhelp/topics/0396.htm 2、有可能是RaiseDataColChanged,执行后"出入库数量"的datacolchanged事件有问题导致的
|
-- 作者:edisontsui -- 发布时间:2020/7/17 8:32:00 -- 一、上述代码已经加了如下判断了,但还是出现一样的警告: Dim drs As New List(of DataRow) With DataTables("出入库") For Each nm As String In .GetValues("物料编号") \'找出每个物料编号的第一行数据, 添加到集合drs中 If nm IsNot Nothing Then drs.Add(.Find("物料编号 = \'" & nm & "\'", "[_SortKey]")) End If Next For Each r As DataRow In drs .DataCols("入库数量").RaiseDataColChanged(r) \'重置每个产品的第一行 Next End With 二、“出入库”这个数据表的代码如下 datacolchanged: Select Case e.DataCol.Name Case "入库数量","出库数量" \'自动计算余数 Dim dr As DataRow Dim mr As DataRow = e.DataRow Dim drs As List(of DataRow) dr = e.DataTable.Find("[_SortKey] <= #" & mr("_SortKey") & "# And [物料编号] = \'" & mr("物料编号") & "\'", "_SortKey desc") If dr Is Nothing OrElse dr("_Identify") = mr("_Identify") Then mr("余数") = mr("入库数量") + mr("出库数量") dr = mr End If drs = e.DataTable.Select("[_SortKey] >= #" & dr("_SortKey") & "# And [物料编号] = \'" & dr("物料编号") & "\'", "_SortKey") For i As Integer = 1 To drs.Count - 1 drs(i)("余数") = drs(i-1)("余数") + drs(i)("入库数量") + drs(i)("出库数量") Next If e.DataCol.Name = "物料编号" AndAlso e.OldValue IsNot Nothing AndAlso e.OldValue <> e.NewValue Then dr = e.DataTable.Find("[_SortKey] <= #" & mr("_SortKey") & "# And [物料编号] = \'" & e.OldValue & "\'", "_SortKey desc") If dr Is Nothing Then dr = e.DataTable.Find("[物料编号] = \'" & e.OldValue & "\'", "_SortKey") If dr IsNot Nothing Then dr("余数") = dr("入库数量") + dr("出库数量") End If End If If dr IsNot Nothing Then drs = e.DataTable.Select("[_SortKey] >= #" & dr("_SortKey") & "# And [物料编号] = \'" & dr("物料编号") & "\'", "_SortKey") For i As Integer = 1 To drs.Count - 1 drs(i)("余数") = drs(i-1)("余数") + drs(i)("入库数量") + drs(i)("出库数量") Next End If End If End Select 上面红色部分,我觉得不对,但我是从使用说明里面抄的,这段代码是否会引起那样的警告? |
-- 作者:有点蓝 -- 发布时间:2020/7/17 9:16:00 -- 1、判断Find的结果,不是判断GetValues的结果,这个判断没有意义 2、看不出什么问题,自己调试一下看那一句代码出错:http://www.foxtable.com/webhelp/scr/1485.htm
|
-- 作者:edisontsui -- 发布时间:2020/7/17 10:41:00 -- Select Case e.DataCol.Name Case "出入库数量" MessageBox.Show(1) \'自动计算余数 Dim dr As DataRow Dim mr As DataRow = e.DataRow Dim drs As List(of DataRow) dr = e.DataTable.Find("[_SortKey] <= #" & mr("_SortKey") & "# And [物料编号] = \'" & mr("物料编号") & "\'", "_SortKey desc") If dr Is Nothing OrElse dr("_Identify") = mr("_Identify") Then mr("余数") = mr("入库数量") + mr("出库数量") dr = mr End If drs = e.DataTable.Select("[_SortKey] >= #" & dr("_SortKey") & "# And [物料编号] = \'" & dr("物料编号") & "\'", "_SortKey") For i As Integer = 1 To drs.Count - 1 drs(i)("余数") = drs(i-1)("余数") + drs(i)("入库数量") + drs(i)("出库数量") Next If e.DataCol.Name = "物料编号" AndAlso e.OldValue IsNot Nothing AndAlso e.OldValue <> e.NewValue Then dr = e.DataTable.Find("[_SortKey] <= #" & mr("_SortKey") & "# And [物料编号] = \'" & e.OldValue & "\'", "_SortKey desc") If dr Is Nothing Then dr = e.DataTable.Find("[物料编号] = \'" & e.OldValue & "\'", "_SortKey") If dr IsNot Nothing Then dr("余数") = dr("入库数量") + dr("出库数量") End If End If If dr IsNot Nothing Then drs = e.DataTable.Select("[_SortKey] >= #" & dr("_SortKey") & "# And [物料编号] = \'" & dr("物料编号") & "\'", "_SortKey") For i As Integer = 1 To drs.Count - 1 drs(i)("余数") = drs(i-1)("余数") + drs(i)("入库数量") + drs(i)("出库数量") Next End If End If End Select afteropenproject 里面的代码改好了,不会出现1楼的警告了,但是又出现另外一个警告了(如下所示): .NET Framework 版本:4.0.30319.34209 Foxtable 版本:2020.5.29.8 错误所在事件:表,出入库, DataColChanged 详细错误信息: 调用的目标发生了异常。 该字符串未被识别为有效的 DateTime。 上面是“出入库”这个数据表的部分代码,我放置了 MessageBox.Show(1),所以老是出现“1”。但是,我不知道问题的原因是什么。 |
-- 作者:有点蓝 -- 发布时间:2020/7/17 10:53:00 -- Dim drs As New List(of DataRow) With DataTables("出入库") For Each nm As String In .GetValues("物料编号") \'找出每个物料编号的第一行数据, 添加到集合drs中 dim dr as datarow = .Find("物料编号 = \'" & nm & "\'", "[_SortKey]") If dr IsNot Nothing Then drs.Add(dr) End If Next For Each r As DataRow In drs .DataCols("入库数量").RaiseDataColChanged(r) \'重置每个产品的第一行 Next End With
|
-- 作者:edisontsui -- 发布时间:2020/7/17 11:01:00 -- 5楼我已经谈到,afteropenproject 里面的代码改好了,我改的跟你6楼改的是一样的。现在我的问题是在“出入库”之 datacolchanged 事件里面了。详见5楼。谢谢。 |
-- 作者:有点蓝 -- 发布时间:2020/7/17 11:13:00 -- Select Case e.DataCol.Name Case "出入库数量" MessageBox.Show(1) \'自动计算余数 Dim dr As DataRow MessageBox.Show(2) Dim mr As DataRow = e.DataRow MessageBox.Show(3) Dim drs As List(of DataRow) MessageBox.Show(4) …… 看是哪一句代码出错
|
-- 作者:edisontsui -- 发布时间:2020/7/17 12:00:00 -- 1、2、3、4以及如下警告都会轮流出现: .NET Framework 版本:4.0.30319.34209 Foxtable 版本:2020.5.29.8 错误所在事件:表,出入库, DataColChanged 详细错误信息: 调用的目标发生了异常。 该字符串未被识别为有效的 DateTime。 |
-- 作者:有点蓝 -- 发布时间:2020/7/17 13:41:00 -- 每一行代码后都加上MessageBox.Show,测试看哪一个MessageBox.Show之后会出错 表,出入库, DataColChanged还有没有其他代码?提示的错误和日期有关 datacolchanged: Select Case e.DataCol.Name Case "入库数量","出库数量" \'自动计算余数 Dim dr As DataRow Dim mr As DataRow = e.DataRow Dim drs As List(of DataRow) dr = e.DataTable.Find("[_SortKey] <= #" & mr("_SortKey") & "# And [物料编号] = \'" & mr("物料编号") & "\'", "_SortKey desc") If dr Is Nothing OrElse dr("_Identify") = mr("_Identify") Then mr("余数") = mr("入库数量") + mr("出库数量") dr = mr End If drs = e.DataTable.Select("[_SortKey] >= #" & dr("_SortKey") & "# And [物料编号] = \'" & dr("物料编号") & "\'", "_SortKey") For i As Integer = 1 To drs.Count - 1 drs(i)("余数") = drs(i-1)("余数") + drs(i)("入库数量") + drs(i)("出库数量") Next Case "物料编号" If e.OldValue IsNot Nothing AndAlso e.OldValue <> e.NewValue Then dr = e.DataTable.Find("[_SortKey] <= #" & mr("_SortKey") & "# And [物料编号] = \'" & e.OldValue & "\'", "_SortKey desc") If dr Is Nothing Then dr = e.DataTable.Find("[物料编号] = \'" & e.OldValue & "\'", "_SortKey") If dr IsNot Nothing Then dr("余数") = dr("入库数量") + dr("出库数量") End If Else drs = e.DataTable.Select("[_SortKey] >= #" & dr("_SortKey") & "# And [物料编号] = \'" & dr("物料编号") & "\'", "_SortKey") For i As Integer = 1 To drs.Count - 1 drs(i)("余数") = drs(i-1)("余数") + drs(i)("入库数量") + drs(i)("出库数量") Next End If End If End Select |