在添加到VBA集合时迭代它

时间:2014-11-30 14:48:00

标签: ms-access access-vba

我试图在构建它时迭代一个集合,原因是我有一个由三列组成的表: ID,ParentID,CategoryName

表中的记录可以是" child"填写ParentID列的另一个类别。

作为表单上删除功能的一部分,我需要检查所选项目是否:
A)有任何子类别 B)有任何属于该类别的产品
C)任何儿童类别及其中的产品

然而,我所做的代码示例并没有做我期望的事情,我尝试使用For,Next循环,但这只适用于我开始循环时的集合,添加到循环被忽略了。

然后我尝试使用变量作为索引并递增它直到我超过列表计数。然而,这会引发错误3420 - "对象无效或不再设置"

如果有人可以帮助我帮助我理解为什么我会收到此错误或更好的方法来做到这一点我会很感激。

最终结果是我需要一个包含类别ID和所有子ID的列表

我的代码示例是:

Dim cat_index As Integer
Dim cat_list As New Collection

cat_list.Add ListCategories.Column(0) 'add top category id to list

cat_index = 1

Dim cat_rst As DAO.Recordset 'recordset to hold search results

Do Until cat_index > cat_list.Count
    MsgBox "Debug:" & vbCrLf & "cat_id:" & cat_id & vbCrLf & "cat_index:" & cat_index & vbCrLf & "cat_list.Count:" & cat_list.Count 'fault finding
    cat_id = cat_list.Item(cat_index)
    Set cat_rst = CurrentDb.OpenRecordset("SELECT ID FROM Categories WHERE ParentID = " & cat_id & ";")
    If cat_rst.RecordCount > 0 Then
        Do Until cat_rst.EOF 'loop until end of records
            MsgBox cat_rst![ID]
            cat_list.Add cat_rst![ID]
            cat_rst.MoveNext
        Loop
        cat_rst.Close
    End If
    cat_index = cat_index + 1
Loop

P.S。如果它有任何区别我使用Access 2013

编辑: 澄清我总共有三个表对这个功能很重要:
类别具有ID,ParentID,CategoryName
产品有ID,名称
Product_Categories具有ProductID,CategoryID

其中前两个表只有一个主键(ID列),这意味着我使用前两个表来定义类别和产品,第三个表将产品分类,这样一个产品可以分为多个类别。

1 个答案:

答案 0 :(得分:1)

在尝试使用' Collection'时,我也遇到了奇怪的结果。 (即使项目数量增加,也无法参考)。所以,我将代码转换为使用字典。

为了澄清您的A,B,C&#39规则,您似乎需要更多代码来满足这三个规则。但我不知道你的意思是'产品'?它们是如何相关/定义的?

Private Sub cmdArray_Click()
Dim cat_index   As Integer
Dim cat_List    As Dictionary
Dim cat_id      As Integer
Dim strSQL      As String
Dim cat_rst     As DAO.recordSet    'recordset to hold search results

    Set cat_List = New Dictionary
    'Tabe contains:  ID, ParentID, CategoryName

    cat_List.add CStr(ListCategories.Column(0)), ListCategories.Column(0)
    Debug.Print "Added Value of: " & ListCategories.Column(0)
    Debug.Print "cat_List contains: " & cat_List.Count & " entries"

    cat_index = 0           ' Relative to zero

    Do              'Do Until cat_index > cat_List.Count
        cat_id = cat_List.Items(cat_index)

        Debug.Print "cat_id: " & vbTab & cat_id & vbTab & "cat_index: " & vbTab & cat_index & vbTab & "cat_list.Count: " & vbTab & cat_List.Count  'fault finding
        strSQL = "SELECT * FROM Categories WHERE ParentID = " & cat_id & ";"
        Set cat_rst = CurrentDb.OpenRecordset(strSQL)
        If Not cat_rst.EOF Then
            Do Until cat_rst.EOF        'loop until end of records
                Debug.Print "    Found ID: " & cat_rst![ID] & vbTab & "Parent: " & cat_rst!ParentID & vbTab & "CategoryName: " & cat_rst!CategoryName
                cat_List.add cat_rst![ID], CStr(cat_rst![ID])
                cat_rst.MoveNext
            Loop
        Else
            Debug.Print "    No records found for: " & cat_id
        End If
        cat_rst.Close

        cat_index = cat_index + 1

        If cat_index >= cat_List.Count Then Exit Do
    Loop
End Sub