我试图在构建它时迭代一个集合,原因是我有一个由三列组成的表: 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列),这意味着我使用前两个表来定义类别和产品,第三个表将产品分类,这样一个产品可以分为多个类别。
答案 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