以文本方式查看主题

-  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