我刚开始使用Access进行编码。我想创建一个Do While Until循环来比较两个表的数量。一个表格中包含客户编号的记录,其中包含每个客户编号的总金额,然后是另一个表格,其中包含所有明细行项目以及每个客户的项目金额。
示例:
摘要
CustID | Total |
1234 | $20.00 |
2345 | $40.00 |
详细
CustID | DocNo | Amount | Included |
1234 | 0000 | $15.00 | |
1234 | 1111 | $5.00 | |
1234 | 2222 | $3.00 | |
我希望能够执行循环,然后将包含列更新为“是”,以将所有适用的订单项添加到摘要表中的总计中。
因此,上面的示例会将 Detail 表的第一行和第二行更新为“Yes”,然后转到下一个CustID,因为前两行Amounts总计为$ 20.00 - 金额在摘要表中。详细信息表中的最后一条记录不会更新为任何内容,因为它不适用。关于这些记录顺序的好处是,标记为“是”的记录将是第一个累积记录集;不是每一个记录,也不是随机记录。每个总数没有固定数量的记录,它会有所不同 - 因此,我需要循环。
另外,有没有人建议如何最好地学习Access和Excel的VB / VBA?我只了解SQL而且我正在努力提高我的编码技能,因此我不必手动对这些金额进行小计,然后在Excel电子表格中删除30,000个不适用的记录。
提前致谢!
答案 0 :(得分:0)
我已经制定了第一种方法,使用DAO,您的表应该是摘要和明细:
Sub sof20295931SummaryDetail()
Dim lCustID0 As Long
Dim dblDetailTotal As Double, dblSummaryTotal As Double
Dim strSQL As String
Dim rst0 As DAO.Recordset, rst As DAO.Recordset
'
' get summary recordset:
'
strSQL = "SELECT CustID, Total" _
& " FROM Summary" _
& " ORDER BY CustID;"
Set rst0 = CurrentDb.OpenRecordset(strSQL)
'
' get detail recordset:
'
strSQL = "SELECT CustID, DocNo, Amount, Included" _
& " FROM Detail" _
& " ORDER BY CustID,DocNo;"
Set rst = CurrentDb.OpenRecordset(strSQL)
lCustID0 = rst0!CustID
dblSummaryTotal = rst0!Total
dblDetailTotal = 0
'
' check the recordset of the Detail:
'
Do While (Not rst.EOF)
'
' change CustID:
'
If (rst!CustID > lCustID0) Then
rst0.MoveNext
lCustID0 = rst0!CustID
dblSummaryTotal = rst0!Total
dblDetailTotal = 0
End If
'
' sum up:
'
dblDetailTotal = dblDetailTotal + rst!amount
'
' modify record:
'
rst.Edit
'
If (dblDetailTotal <= dblSummaryTotal) Then
rst!Included = "Yes"
Else
rst!Included = Null
End If
'
rst.Update
'
' go to the next record:
'
rst.MoveNext
Loop
'
' destruct objects:
'
rst0.Close
Set rst0 = Nothing
'
rst.Close
Set rst = Nothing
End Sub
我的Windows区域设置使用了欧元货币格式,这是摘要表格:
和详细信息表中我添加了一些额外的记录:
修改后
明细:
答案 1 :(得分:0)
由于没有回复更多以SQL为中心的方法是否合适,这里就是。
字段Included
在逻辑上不属于详细信息,但在摘要中。如果您想详细了解它,使用SQL是一项挑战:您不能使用聚合函数Sum()
并且还要更新值。但是如果将Included
移到摘要中,SQL就是一种自然的解决方案。我会推荐这种方法。
qrySummary (嵌套在下面的第二个查询中)
SELECT CustID, Sum([Total]) AS CustomerTotal
FROM tblDetail GROUP BY CustID;
<强> qryValidate 强>
UPDATE tblSummary LEFT JOIN qrySummary ON tblSummary.CustID = qrySummary.CustID
SET tblSummary.Included =
IIf([qrySummary].[CustomerTotal]=[tblSummary].[Amount],True,False);
要完成电子表格的操作,您需要在详细级别查看Included
;这将需要一个连接Detail和Summary的查询。