用于MS Access的VB循环,用于添加数字

时间:2013-11-30 02:48:24

标签: sql vba ms-access

我刚开始使用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个不适用的记录。

提前致谢!

2 个答案:

答案 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区域设置使用了欧元货币格式,这是摘要表格:

enter image description here

详细信息表中我添加了一些额外的记录:

enter image description here

修改后

明细

enter image description here

答案 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的查询。