ms-access - MS Access VBA:将多个对象添加到集合中
问题描述
我正在尝试将多个对象添加到集合中。
我有几个循环构建和填充我的对象,然后将对象添加到集合中。
问题是,当我观看集合时,它显示所有对象都是相同的,而不是每个对象都具有构建它们的记录中的数据。
我该如何纠正?我需要在重建下一个对象之前解构我的对象吗?
Public Sub processPurchases()
'DB Connection
Dim dbs As Database
Set dbs = CurrentDb
Dim rstPurchases As Recordset
Set rstPurchases = dbs.OpenRecordset("qryPurchasesByCardHolder")
'Decalre Variables
Dim counter As Integer
Dim iteration As Integer
Dim bCode As String
Dim transDate As String
Dim ven As String
Dim amt As String
Dim req As String
Dim desc As String
Dim Purchases As New Collection
iteration = 0
If rstPurchases.RecordCount > 0 Then
rstPurchases.MoveFirst
Do While Not rstPurchases.EOF
iteration = iteration + 1
counter = 0
Do While counter < 11
counter = counter + 1
Dim p As String
p = ("Purchase" & iteration & "-" & counter)
Dim Purchase As New clsPurchaseItem
bCode = "budgetCode" & counter
transDate = "transDate" & counter
ven = "vendor" & counter
amt = "amount" & counter
req = "requestedBy" & counter
desc = "description" & counter
If Not rstPurchases.Fields(bCode).value = "" Then
MsgBox p
Purchase.CardHolderID = rstPurchases.Fields("cardEmpId").value
MsgBox "Card Holder ID: " & Purchase.CardHolderID
Purchase.CardHolderName = rstPurchases.Fields("cardName").value
MsgBox "Card Holder Name: " & Purchase.CardHolderName
Purchase.StatementDate = rstPurchases.Fields("currDate").value
MsgBox "Statement Date: " & Purchase.StatementDate
Purchase.Department = rstPurchases.Fields("deptname").value
MsgBox "Department: " & Purchase.Department
Purchase.BudgetCode = rstPurchases.Fields(bCode).value
MsgBox "Budget Code: " & Purchase.BudgetCode
Purchase.TransactionDate = rstPurchases.Fields(transDate).value
MsgBox "Transaction Date: " & Purchase.TransactionDate
Purchase.Vendor = rstPurchases.Fields(ven).value
MsgBox "Vendor:" & Purchase.Vendor
Purchase.Amount = rstPurchases.Fields(amt).value
MsgBox "Purchase Amount: " & Purchase.Amount
Purchase.RequestedBy = rstPurchases.Fields(req).value
MsgBox "Requested By: " & Purchase.RequestedBy
Purchase.Description = rstPurchases.Fields(desc).value
MsgBox "Description: " & Purchase.Description
Purchases.Add Purchase, p
End If
Loop
rstPurchases.MoveNext
MsgBox "Move To Next Record"
Loop
End If
MsgBox Purchases.Item("Purchase2-1").Description
End Sub
解决方案
问题是你使用Dim As New
Dim Purchase As New clsPurchaseItem
可能看起来与Dim Purchase As clsPurchaseItem
and相同Set Purchase = clsPurchaseItem
,但事实并非如此。它只初始化Purchase
一次,并让它处于一种奇怪的、坚不可摧的状态。
正如 Victor K 所说,您需要手动设置它。但是您还需要摆脱Dim As New
:
Public Sub processPurchases()
'DB Connection
Dim dbs As Database
Set dbs = CurrentDb
Dim rstPurchases As Recordset
Set rstPurchases = dbs.OpenRecordset("qryPurchasesByCardHolder")
'Decalre Variables
Dim counter As Integer
Dim iteration As Integer
Dim bCode As String
Dim transDate As String
Dim ven As String
Dim amt As String
Dim req As String
Dim desc As String
Dim Purchases As New Collection
iteration = 0
If rstPurchases.RecordCount > 0 Then
rstPurchases.MoveFirst
Do While Not rstPurchases.EOF
iteration = iteration + 1
counter = 0
Do While counter < 11
counter = counter + 1
Dim p As String
p = ("Purchase" & iteration & "-" & counter)
Dim Purchase As clsPurchaseItem
Set Purchase = New clsPurchaseItem
bCode = "budgetCode" & counter
transDate = "transDate" & counter
ven = "vendor" & counter
amt = "amount" & counter
req = "requestedBy" & counter
desc = "description" & counter
If Not rstPurchases.Fields(bCode).value = "" Then
MsgBox p
Purchase.CardHolderID = rstPurchases.Fields("cardEmpId").value
MsgBox "Card Holder ID: " & Purchase.CardHolderID
Purchase.CardHolderName = rstPurchases.Fields("cardName").value
MsgBox "Card Holder Name: " & Purchase.CardHolderName
Purchase.StatementDate = rstPurchases.Fields("currDate").value
MsgBox "Statement Date: " & Purchase.StatementDate
Purchase.Department = rstPurchases.Fields("deptname").value
MsgBox "Department: " & Purchase.Department
Purchase.BudgetCode = rstPurchases.Fields(bCode).value
MsgBox "Budget Code: " & Purchase.BudgetCode
Purchase.TransactionDate = rstPurchases.Fields(transDate).value
MsgBox "Transaction Date: " & Purchase.TransactionDate
Purchase.Vendor = rstPurchases.Fields(ven).value
MsgBox "Vendor:" & Purchase.Vendor
Purchase.Amount = rstPurchases.Fields(amt).value
MsgBox "Purchase Amount: " & Purchase.Amount
Purchase.RequestedBy = rstPurchases.Fields(req).value
MsgBox "Requested By: " & Purchase.RequestedBy
Purchase.Description = rstPurchases.Fields(desc).value
MsgBox "Description: " & Purchase.Description
Purchases.Add Purchase, p
End If
Loop
rstPurchases.MoveNext
MsgBox "Move To Next Record"
Loop
End If
MsgBox Purchases.Item("Purchase2-1").Description
End Sub
推荐阅读
- c# - 如何在检查唯一值的同时将数据从一个表单插入到另一个表单的列表框中?
- r - 如何改变R中igraph中边缘的强度和对称性?
- react-native - 使用 react native fetch blob 库读取应用数据中的缓存文件
- swift - 我正在尝试通过 BLE 连接接收指示,但我无法接收任何数据
- arrays - 如何在 Julia 中将数组转换为数组?
- r - 在 Latex 中使用 R 内联代码进行循环
- node.js - 在 IBM Cloud 中使用持续集成时保留应用程序特定变量
- react-native - Exoplayer 使用离线许可证
- django - Django:在导航栏中列出类别
- python-3.x - 奥运会评委,打印最低和最高分国家评委的姓名