以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  关于集合remove移除失败的问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=192755)

--  作者:13568406997
--  发布时间:2024/7/19 11:33:00
--  关于集合remove移除失败的问题
Dim drs As List(Of DataRow) = DataTables("可出货船").SQLSelect("已扣除标配附件<>\'true\' and 是否在库=\'true\'")
Dim lst As List(Of DataRow) = DataTables("可出货船").SQLSelect("已扣除标配附件<>\'true\' and 是否在库=\'true\'")
Dim dr不扣 As DataRow = DataTables("系统重要参数").SQLFind("数值名称=\'在库船不扣除标配附件的仓库名称\'")
Dim str不扣仓库 As String
If dr不扣 IsNot Nothing Then
    str不扣仓库 = dr不扣("当前值")
End If
\'MessageBox.Show(2)

Dim 不扣仓库() As String = str不扣仓库.Split(",")
\'将已经登记为不扣的仓库中的船排除
MessageBox.Show("移除前drs.count=" & drs.count)

For Each s As String In 不扣仓库
    \'    MessageBox.Show(s)
    
    For Each dr As DataRow In lst
        Dim drKC As DataRow = DataTables("vw_库存查询表").SQLFind("库存号=\'" & dr("库存号") & "\'")
        If drKC IsNot Nothing Then
            If drKC("仓库名称") = s Then
                Dim drRM As DataRow = DataTables("可出货船").SQLFind("唯一码=\'" & dr("唯一码") & "\'")
                If drRM IsNot Nothing Then
                    \'                    MessageBox.Show("移除" & dr("唯一码"))
                    drs.remove(drRM)

                End If 
                
            End If
        Else
            drs.remove(dr) \'库存不存在
        End If 
    Next 
Next
MessageBox.Show("移除后drs.count=" & drs.count)


想从drs集合中移除指定仓库名称的记录,但试了多次,移除前后记录的总数没有变化,唯一码是肯定存在的


--  作者:13568406997
--  发布时间:2024/7/19 11:34:00
--  
drs.remove(drRM) 


是这个用法不对吗?

--  作者:y2287958
--  发布时间:2024/7/19 12:03:00
--  
drs集合中的元素与实际表中的行不能直接比较
--  作者:有点蓝
--  发布时间:2024/7/19 12:06:00
--  
不对的。

首先,对于对象型集合,一般不直接通过对象进行移除。最好是通过索引处理
其次,都不是同一个集合的对象。drRM是另外通过SQLFind查询的,对于数据库来说,可能是同一行数据,但是对于程序来说,已经是不同的对象了。SQLFind查询的结果都是独立的,和原有的表对象没有什么关系的。

不如使用文字说说上面的代码想做什么功能?

--  作者:13568406997
--  发布时间:2024/7/19 12:26:00
--  
有个别仓库的产品,在出库时不扣除标配附件的库存量,要把这些数据排除在外

已经把代码修改成下面这样了,正在调试:


Dim drs As New List(Of DataRow) 
Dim lst As List(Of DataRow) = DataTables("可出货船").SQLSelect("已扣除标配附件<>\'true\' and 是否在库=\'true\'")
Dim dr不扣 As DataRow = DataTables("系统重要参数").SQLFind("数值名称=\'在库船不扣除标配附件的仓库名称\'")
Dim str不扣仓库 As String
If dr不扣 IsNot Nothing Then
    str不扣仓库 = dr不扣("当前值")
End If
\'MessageBox.Show(2)

Dim 不扣仓库 As New list(Of String) 
\'将已经登记为不扣的仓库中的船排除
MessageBox.Show("移除前drs.count=" & drs.count)
For Each s As String In str不扣仓库.Split(",")
    不扣仓库.add(s)
Next

For Each dr As DataRow In lst
    Dim drKC As DataRow = DataTables("vw_库存查询表").SQLFind("库存号=\'" & dr("库存号") & "\'")
    If drKC IsNot Nothing Then
        If 不扣仓库.Contains(drKC("仓库名称")) = False Then
            Dim drRM As DataRow = DataTables("可出货船").SQLFind("唯一码=\'" & dr("唯一码") & "\'")
            If drRM IsNot Nothing Then
                Output.Show("添加   " & dr("唯一码"))
                drs.add(drRM)
                
            End If 
        End If
    End If 
Next 

MessageBox.Show("移除后drs.count=" & drs.count)