我有一个来自en SQL server的记录集。我不知道需要检索的确切数据量,因此我创建了一个动态数组。 我需要做的是在将数据放入数组时对数据进行单独排序。但我不知道这方面的最佳做法是什么。
E.g。我有一组数据,其中客户ID在一列中,收入在第二列中。假设我只有2个客户,并且有一个如下所示的列表:
Customer ID Revenue
1 604
2 669
2 732
2 629
1 897
2 530
我希望我的数组有两个维度(客户1和2),并且最大长度与一个客户的最大购买量相匹配。在这种情况下,客户2进行了四次购买,而客户1进行了两次购买。因此,我的理想数组将是这样的:myArray(1到2,4)。
我将如何做到最好?
然后在我定义了我的数组之后,我想用我的数据填充它,但是数据没有排序,那么我如何确定我应该在哪个地方放下数据呢?如果这样做了吗?
例如,我最初的想法是运行数据集并执行以下操作:
i = 1
do until dataset.eof
if dataset.field("customerid") = 1 then
myArray(1, i) = dataset.field("customerid").value
else if dataset.field("customerid") = 2 then
myArray(1, i) = dataset.field("customerid").value
end if
i = i + 1
dataset.movenext
loop
在客户ID发生变化之前,这一切都很好。如果第一行到客户1,那么数据将放在myArray(1,1)和myArray(1,2)中。但是,如果下一行的客户ID是客户2,则客户2的第一个条目将在myArray(2,3)中,而不是myArray(2,1),因为我希望如此。 如果我根据我的第一个问题定义了数组,我将超过数组的限制: - )
这一切都有意义吗?
提前致谢: - )
答案 0 :(得分:0)
您可以使用脚本字典,其中客户ID为关键字,收入数组为值。
未测试:
dim dict as object, id, rev, tmp, k
set dict = createobject("scripting.dictionary")
do until dataset.eof
id = dataset.fields("customerid").Value
rev = dataset.fields("revenue").Value
if dict.exists(id) then
tmp = dict(id)
ub = ubound(tmp)+1
redim preserve tmp(0 to ub)
tmp(ub) = rev
dict(id) = tmp
else
dict(id) = Array(rev)
end if
dataset.movenext
loop
for each k in dict
debug.print k, join(dict(k),", ")
next k
答案 1 :(得分:0)
我认为数组不是此目标的最佳数据结构。我会使用一组类。这为存储和排序数据提供了极大的灵活性。例如,我创建了以下内容:
- 在工作表中(作为数据源,替换你的记录集):
-Code模块Module1:
Option Explicit
Sub jzz()
Dim Customers As Collection
Dim cust As cls_customer
Dim i As Long
Dim arr() As Long
Set Customers = New Collection
i = 1
Do Until Cells(i, 1) = vbNullString
'check if the customer is already in the collection:'
For Each cust In Customers
If cust.id = Cells(i, 1) Then Exit For
Next cust
'check if the customer was found; if not, create new and add to collection'
If cust Is Nothing Then
Set cust = New cls_customer
cust.id = Cells(i, 1)
Customers.Add cust
End If
cust.Revenue = Cells(i, 2)
i = i + 1
Loop
For Each cust In Customers
Debug.Print cust.id, cust.Revenue_count
Next cust
Set Customers = Nothing
End Sub
-Class module cls_customer:
Option Explicit
Public id As Long
Private p_revenue_collection As Collection
Public Property Let Revenue(value As Long)
'accepts a long (value) and adds it to the collection'
p_revenue_collection.Add value
End Property
Public Property Get Revenue_count() As Long
Revenue_count = p_revenue_collection.Count
End Property
Private Sub Class_Initialize()
Set p_revenue_collection = New Collection
End Sub
该类仅包含revenue_count属性,该属性返回集合中的条目数量,但您可以随意添加自己的属性以返回已排序的数据等。