2011-11-21 13 views
0

這裏是我的問題:如何使用數據庫命令'Seek'和結果'NoMatch'?

比方說,我有這些表:

table1的

1 - 「一」

2 - 「B」

表2

1 -

2 -

3 -

現在,我使用下面的代碼比較表:

table2.MoveFirst 
Do While Not table2.EOF 
table1.Seek "=", table2!field2 
    If table1.NoMatch Then 
       go do a lot of things to find that information 
    Else 
    table2.Edit 
    table2!Field2 = table1!field2 
    table2.update 
    End If 
table2.MoveNext 
Loop 

table2!Field2 = table1!field2 

不工作這麼好線。我很確定我在這裏做錯了什麼,但我在找到解決方案時遇到問題。我什至不知道我應該谷歌...

編輯:字段2索引在表1,所以'尋求'的作品。

+0

有沒有理由不使用查詢來匹配兩個表?請注意,如果您有空值,事情會變得有點複雜。 – Fionnuala

+0

除了這個事實,我仍然是一個noob,沒有很好的理由。 問題是:如果table1上沒有匹配,我需要運行大量代碼來捕獲這些信息並更新table1和table2。 有沒有更有效的方法來做到這一點?我可以像使用表一樣使用查詢嗎? –

+0

是的,你可以,它會更快。我將在下面略寫一些註釋。 – Fionnuala

回答

1

一些注意事項。

讓我們說,你想從表2中的所有記錄,其中有一個字段不匹配稱爲字段1:

sSQL = "SELECT Field1, FieldX FROM Table2 " _ 
    & "LEFT JOIN Table1 " _ 
    & "ON Table2.Field1 = Table1.Field1 " _ 
    & "WHERE Table1.Field1 Is Null" 

你可以,當然,圍繞打造查詢設計窗口和小提琴詢問,直到正是你想要的,然後切換到SQL視圖來獲得正確的(ish)SQL字符串。

Dim rs As DAO.Recordset 

Set rs = CurrentDB.Openrecordset(sSQL) 

''table2.MoveFirst 
Do While Not rs.EOF ''table2.EOF 

''You do not need no match, all these records are missing a match 
'' table1.Seek "=", table2!field2 
'' If table1.NoMatch Then 
      go do a lot of things to find that information 
    rs.MoveNext 
Loop 
''This can all be done with one update query 
'' Else 
'' table2.Edit 
'' table2!Field2 = table1!field2 
'' table2.update 
'' End If 
'' table2.MoveNext 
'' Loop 

sSQL = "UPDATE Table2 " _ 
    & "INNER JOIN Table1 " _ 
    & "SET table2.Field2 = table1.field2 " 

CurrentDB.Execute sSQL dbFailOnerror 

請把上面的內容當作註釋,而不是完成代碼。

+0

我認爲在理解這段代碼之前我需要打我的SQL書籍。但我認爲這是做同樣事情的一種更簡單的方法。 –

+0

非常感謝回覆,代碼完美運行,也讓我有機會了解有關SQL的更多信息。 –

1

但行table2!Field2 = table1!field2工作不那麼好

...不是什麼不順心一個很好的說明。

代碼停止/崩潰在這條線?
它是否運行沒有錯誤,但什麼也不做,比你預期的東西?

我想你正在使用DAO記錄集。
很難沒有更多的信息給意見,但我會試試看:

  1. table2完全是空的?您的描述是這樣的:

    table2
    1 -
    2 -
    3 -

    如果是的話,很可能根本就不會執行整個循環。

  2. 記錄集table2可以更新嗎?
    並非所有類型的記錄集均支持此操作,這取決於您如何創建它。請參閱MSDN:Recordset Object (DAO),開頭處有一個Recordset類型的列表。
    如果它不可更新,當您撥打.Update時應該會出錯。

+0

1.)大部分是空的。當table2爲空並且table1上沒有信息時,我設法更新table1上的信息並在table2上創建一個新條目。 2.)是的,它可以。 –

1

如果你使用DAO的記錄(由基督教所建議的),你可以行

table2!Field2 = table1!field2 

改變

table2.Fields("Field2").value = table1.Fields("field2").value 

我假定這兩個字段2的是文本數據類型。