2014-03-05 59 views
0

我试图之间比较所有的字段值的表和返回两个表中的全部记录时,发现不符合项目上第二个环

正常工作的第一值集合中找不到现在运行通过,但只要它进入第二圈我得到ITEN不是这个集合中找到在

If rs1.Fields(fld) <> rs2.Fields(fld) Then 

这是代码,我有一节:

Private Sub Execute_Click() 
DoCmd.RunSQL "Delete * FROM Issues2" 
Dim rs1 As DAO.Recordset 
Dim rs2 As DAO.Recordset 
Dim fld As DAO.Field 

'.... set those recordsets via SQL statements 
Set rs1 = CurrentDb.OpenRecordset("Full") 
Set rs2 = CurrentDb.OpenRecordset("Transaction1") 
For Each fld In rs1.Fields 
    If rs1.Fields(fld) <> rs2.Fields(fld) Then 
     DoCmd.RunSQL "INSERT INTO Issues2 SELECT Full.* FROM Full LEFT JOIN Transaction1 ON Full.[Member ID] = Transaction1.[Member ID] WHERE (((Transaction1.[Member ID]) Is Null));" 
     DoCmd.RunSQL "INSERT INTO Issues2 SELECT Transaction1.* FROM Transaction1 LEFT JOIN Full ON Transaction1.[Member ID] = Full.[Member ID] WHERE (((Full.[Member ID]) Is Null));" 
    End If 
Next fld 

有没有人知道为什么它会在第一次运行时正常工作,但在第二次循环中出错?

+0

它可能会帮助您发布调用此例程的代码(两次)。还有这个建议:在第一次和第二次调用之间,插入'DoEvents'并查看行为是否改变。 – Smandoli

+0

代码只是附加到一个点击事件,只要我点击按钮这是什么运行。至于DoEvents,我会在那里放置?我全新的VBA,所以我不知道可能90%的条款的一切,或他们做什么 – user1787114

+0

“微软访问比较表”搜索网;请查看http://www.access-programmers.co.uk/forums/showpost.php?p=642465&postcount=12等结果。 – Smandoli

回答

1

你的逻辑缺少一些关键的东西。它看起来像你可能会想是这样的:上面

For Each fld1 In rs1.Fields 
For Each fld2 In rs2.Fields 
    If fld1.Name = fld2.Name Then 
    If fld1 <> fld2 Then 
     DoCmd.RunSQL "INSERT INTO Issues2 ...;" 
     DoCmd.RunSQL "INSERT INTO Issues2 ...;" 

    End If 

    End If 
Next fld2 
Next fld1 

代码修正3/5 4:45 PM CST

fld声明为rs1,但你试图调用它rs2以及。上面的代码提出了单独的字段变量,fld1fld2

你正在肆意肆意摆弄那些记录集。试试:

Set rs1 = CurrentDb.OpenRecordset("Full", dbOpenSnapshot) 

这样就没有rs1试图响应变化的危险。此外,加入DoEvents可以清理一些问题(虽然我尽量保留其使用临时调试...在您的情况,这给已经提到的逻辑问题是不相关的):

DoCmd.RunSQL "INSERT INTO Issues2 ...;" 
DoEvents 
DoCmd.RunSQL "INSERT INTO Issues2 ...;" 
DoEvents 

你有另一原代码严重问题。您的SQL查询不使用这些变量。也就是说,您正在反复运行相同的查询,而不是动态更改的查询。据我所知,这打破了目的。

+0

shouldnt For Each fld1 In rs1.Fields For Each fld2 In rs1.Fields be fld1 in rs1 and fld2 in rs2?否则在代码中的任何地方都没有提及rs2? – user1787114

+0

如果我使用该代码并在rs2中将每个代码更改为fld2,我得到一个编译错误,提示“next for for” – user1787114

+0

我刚刚注意到了这个错字。很高兴你也抓到了。编译错误是一些简单的语法问题;我从这里看不到这个问题,但它会解决问题。 – Smandoli

相关问题