使用记录集中的字段作为每个查询的参数,对记录集中的每个记录运行并追加查询

时间:2018-07-22 19:52:59

标签: loops ms-access access-vba append recordset

Private Sub btnMakeECR_Click()
 Me.OrderDate = Date

 Dim rs As DAO.Recordset
 Dim db As DAO.Database
 Set db = CurrentDb
 Set rs = db.OpenRecordset("SELECT tblOrderDetails.Quantity, 
          tblOrderDetails.WeaponID " & vbCrLf & _
          "FROM tblOrderDetails")
 Dim qdf As DAO.QueryDef
 Dim strSQL As String
 Dim qrtAMT As Integer


qryAMT = DCount("[tblOrderDetails.OrderID]", "tblOrderDetails", "
         [tblOrderDetails.OrderID] = [Forms]![frmOrderEntry]![OrderID]")


On Error Resume Next
DoCmd.DeleteObject acQuery, "testQry"
On Error GoTo 0

strSQL = "SELECT TOP " & qryAMT & " tblOrder.OrderID, 
          tblOrderDetails.OrderID, tblOrder.ArmorerID, tblOrder.RecieverID, 
          tblOrder.OrderDate, tblOrder.RecieverNumber, tblOrder.UnitName, 
          tblOrder.PickUpDate, tblOrder.Returned, tblOrder.Cleaned, 
          tblOrder.Notes, tblOrder.DateReturned, tblOrder.DateCleaned, 
          tblOrderDetails.OrderDetailID, tblWeaponGroups.WeaponID, 
          tblWeapons.InventoryID, tblWeapons.SerialNumber, 
          tblOrderDetails.WeaponID, tblWeapons.StockNumber, 
          tblWeapons.IssueCount, tblOrderDetails.Quantity, tblWeapons.Status 
          " & vbCrLf & _
          "FROM (tblWeaponGroups INNER JOIN tblWeapons ON 
          tblWeaponGroups.WeaponID = tblWeapons.WeaponID) INNER JOIN 
          (tblOrder INNER JOIN tblOrderDetails ON tblOrder.OrderID = 
          tblOrderDetails.OrderID) ON tblWeaponGroups.WeaponID = 
          tblOrderDetails.WeaponID " & vbCrLf & _
          "WHERE (((tblWeapons.Status)=""AVAILABLE"")) " & vbCrLf & _
          "ORDER BY tblOrderDetails.WeaponID, tblWeapons.StockNumber, 
          tblWeapons.IssueCount, tblOrderDetails.Quantity;"

Set qdf = db.CreateQueryDef("testQry", strSQL)

DoCmd.OpenQuery ("testQry")

End Sub

这是我的记录集和要运行的查询。我想使用记录集中的字段作为查询中的参数,对记录集中的每个记录运行查询。我想附加所有查询。理想的结果是返回一个表或查询,该表或查询的记录数等于记录集中的记录数,而每组记录将包含等于记录集中相应值的记录数

像这样

RECORDSET         QUERY                      END RESULT OF QUERY
A 2           A AFGHANISTAN                   2 A AFGHANISTAN 
B 1           A ALBANIA                       2 A ALBANIA
C 4           A ALGERIA                       1 B BAHRAIN 
D 1           B BAHRAIN                       4 C CAMBODIA 
              B BARBADOS                      4 C CANADA
              B CAMBODIA                      4 C CHILE
              C CANADA                        4 C CHINA
              C CHILE                         1 D DENMARK
              C CHINA
              C CUBA
              D DENMARK
              D DOMINICA

我将其用于订单,我所有的产品都在同一张表中,并通过类型,序列号和位置进行标识。

忽略qryAMT,我只是测试Dcount函数,并使用定义的整数改变查询的结果。我将用另一个表达式代替qryAMT的值,例如(dcount-dcount + loop step = loopstep时表的数量字段)

1 个答案:

答案 0 :(得分:0)

 Private Sub Command373_Click()
 Dim db As DAO.Database
 Dim rs As DAO.Recordset
 Dim strQNT As String
 Dim srtQNTV As Integer
 Dim qdf As DAO.QueryDef
 Dim strSQL As String
 Dim strWID As Integer

 strQNT = "Quantity"


 Set db = CurrentDb
 Set rs = db.OpenRecordset("tblOrderDetails", dbOpenForwardOnly)

 DoCmd.OpenTable "tblECR", acViewNormal

On Error Resume Next
DoCmd.DeleteObject acTable, "tblECR"
On Error GoTo 0

On Error Resume Next
DoCmd.DeleteObject acQuery, "testQryA"
On Error GoTo 0
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM tblECR"

Do While Not rs.EOF
Debug.Print rs![Quantity]
Debug.Print rs![WeaponID]
strQNTV = rs!Quantity.Value
strWID = rs!WeaponID.Value

strSQL = "INSERT INTO tblECR ( OrderDetailID, OrderID, Quantity, ArmorerID, 
         RecieverID, RecieverNumber, UnitName, PickUpDate, SerialNumber, 
         Nomenclature, IssueCount, WeaponID, StockNumber, Status ) " & vbCrLf & _
        "SELECT TOP " & strQNTV & " tblOrderDetails.OrderDetailID, tblOrderDetails.OrderID, tblOrderDetails.Quantity, tblOrder.ArmorerID, tblOrder.RecieverID, tblOrder.RecieverNumber, tblOrder.UnitName, tblOrder.PickUpDate, tblWeapons.SerialNumber, tblWeapons.Nomenclature, tblWeapons.IssueCount, tblWeapons.WeaponID, tblWeapons.StockNumber, tblWeapons.Status " & vbCrLf & _
        "FROM tblOrder INNER JOIN (tblOrderDetails INNER JOIN tblWeapons ON tblOrderDetails.WeaponID = tblWeapons.WeaponID) ON tblOrder.OrderID = tblOrderDetails.OrderID " & vbCrLf & _
        "WHERE (((tblOrderDetails.OrderID)=[Forms]![frmOrderEntry]![OrderID]) AND ((tblWeapons.WeaponID)= " & strWID & ") AND ((tblWeapons.Status)=""AVAILABLE"")) " & vbCrLf & _
        "ORDER BY tblWeapons.IssueCount, tblWeapons.WeaponID, tblWeapons.StockNumber;"


 On Error Resume Next
 DoCmd.DeleteObject acQuery, "testQryA"
 On Error GoTo 0

 Set qdf = db.CreateQueryDef("testQryA", strSQL)
 DoCmd.OpenQuery ("testQryA")
 rs.MoveNext

 Loop
 rs.Close
  DoCmd.SetWarnings True



 End Sub

就这样。有用。那里有一些垃圾代码,但是可以工作。谢谢大家的帮助。