Access中使用Loop的VBA更新表/记录集与来自另一个表/记录集的值?

时间:2014-02-05 22:26:47

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

我需要一些VBA for Access的帮助。

我有一个包含100行数据的表"Client_Table"。我有另一个表"SalesRep_Table",其中有10个不同的销售代表ID号(例如:AA1111,依此类推)。

我的目标是运行一个获取第一个ID记录"AA1111"的过程,并将其放在前10行的名为"AssignedSalesRepID"的Clients表的相应列中,然后是下一个ID号。 SalesRep_Table被插入到Clients表中的下10个单元格中,并且该过程重复循环,直到所有10个ID现在分别为10行,以填充Clients表中的100行数据。

我通过创建两个记录集并尝试通过SQL Update循环来实现它。但是,我最终得到的所有100条记录只包含最近100次重复的销售代表ID。你能看一下我的代码,让我知道它需要修复的地方吗?

Public Sub Command01_Click()

Dim strSQL
Dim ClientsTableQuery, SalesRepList
Dim DataB as Database
Dim ClientQD as QueryDef
Dim SalesQD as QueryDef
Dim rstClient as Recordset
Dim rstSalesRep as Recordset

ClientTableQuery = "Clients"
SalesTableQuery = "SalesRepList"

'Creates a recordset with 100 client records named "Clients" 
strSQL = "Select * from Client_Table"
Set DataB = CurrentDB()
Set ClientQD.CreateQueryDef(ClientTableQuery, strSQL)
Set rstClient = DataB.OpenRecordset(ClientTableQuery)

'Creates a recordset with 10 sales rep records named "SalesRepList"
strSQL = "Select SalesRepID from SalesRep_Table"
Set DataB = CurrentDB()
Set SalesQD.CreateQueryDef(SalesTableQuery, strSQL)
Set rstSalesRep = DataB.OpenRecordset(SalesTableQuery)


rstSalesRep.MoveFirst
rstClient.MoveFirst

Do Until rstSalesRep.EOF = True

'SQL Query to update the top 10 cells in the "Assigned Sales Rep ID" column in the  
Clients recordset with the Sales Rep ID from the SalesRepList recordset

strSQL = "Update Clients, SalesRepList SET Clients.AssignedSalesRepID =   
SalesRepList.SalesRepID where Clients.ClientIDNumber in (Select Top 10     
Clients.ClientIDNumber FROM Clents where Clients.AssignedSalesRepID is Null)"

DoCmd.RunSQL (strSQL)
rstSalesRep.MoveNext

Loop
MsgBox "Finished Looping"
rstSalesRep.Close


End Sub

2 个答案:

答案 0 :(得分:3)

我不想成为那个告诉你的人,但你应该重新考虑使用SQL来做这个更新。我看到你已经编写了很多代码,可能会觉得如果你切换回SQL那么你就会浪费掉所有这些vb代码。我过去曾经感觉到这一点。但是你可以用SQL来解决这个问题,其代码数量减少了一个数量级(或差不多)。

SQL解决方案的步骤:

  1. 两组中的序列行
  2. mod由B set sequence max
  3. 设定的序列
  4. 更新mod = b seq
  5. 上的设置

答案 1 :(得分:1)

您正在查询中进行加入调用,而不定义如何加入这两个表。您没有在任何地方提及,您希望将assignedSalesRepId设置为的rstSalesRep记录集的哪条记录。

此外,我会将您的所有代码减少到以下内容:

Dim strSQL
Dim DataB As Database
Dim rstSalesRep As Recordset

Set DataB = CurrentDb()

Set rstSalesRep = DataB.OpenRecordset("Select SalesRepID from  SalesRep_Table  ")
Do Until rstSalesRep.EOF = True

    strSQL = "Update Client_Table, SalesRep_Table SET Client_Table.AssignedSalesRepID = SalesRep_Table.SalesRepID " & _
    "where Client_Table.ClientIDNumber in (Select Top 2 Client_Table.ClientIDNumber FROM Client_Table where Client_Table.AssignedSalesRepID is Null)" & _
    " and SalesRep_Table.SalesRepID = '" & rstSalesRep("SalesRepID") & "'"

    DoCmd.RunSQL (strSQL)
    rstSalesRep.MoveNext

Loop
MsgBox "Finished Looping"
rstSalesRep.Close