2017-02-16 45 views
0

昨天我正在圍繞SE和網絡尋找一種方法,將來自多個記錄的特定字段連接在一起,作爲Access數據庫中查詢/報告結構的一部分。我發現this SE question這導致我轉向了Allen Browne的ConcatRelated()函數 here。在通過命名該模塊與功能相同來錯誤地走下去之後,我按照需要工作。爲什麼這個錯誤導致循環而不是退出函數?

但是,在我最初嘗試在查詢中使用它時,我犯了一個愚蠢的錯誤,並給它提供了等於"WHERE Employee = " & [Employee]而不是正確的'WHERE Employee = ' & [Employee] & "'"作爲字符串評估所需的參數。這導致了預期的3464(數據類型不匹配)運行時錯誤,但是在Allen的修改中,它顯示了導致錯誤的實際字符串。毫不奇怪,我只需點擊「確定」即可修復SQL。我很驚訝地發現這沒有奏效。只要我點擊了msgbox,它就會再次回來。我用Ctrl+Break來停止代碼,但點擊End導致它回到相同的錯誤,而不是實際結束函數。我可以停止循環的唯一方法是點擊Debug,這將我放入代碼中,但我無法離開代碼來更改原始查詢。打到重置導致錯誤再次彈出,並讓我馬上回到循環。

我最終從錯誤處理程序中註釋掉所有內容並將其告知Exit Function,最終擺脫了困境。我知道最有可能只是掩蓋了問題,所以我添加了一個計數器,並在每次調用錯誤處理程序時增加計數器,然後在即時窗口中檢查該值。果然,每次我在查詢中的某處點擊時,它會增加10或更多。

我不明白是什麼導致錯誤循環。 Err_Handler應該將它從第一個錯誤的函數中轉儲出來,因爲沒有任何信息告訴它嘗試Resume,並且它專門將它指向Exit_Handler,該函數重置一對變量,然後執行Exit Function。即使直接將Exit Function置於Err_Handler仍會導致多次增加到我的錯誤計數器。進一步試驗Debug突出顯示了線Set rs = DBEngine(0)(0).OpenRecordset(strSql, dbOpenDynaset)。我不知道它有多大幫助,因爲它是函數構造值strSql後的第一行。評論它,導致下一行被突出顯示。

我知道爲什麼導致最初的錯誤(我的錯誤),這是一個簡單的修復。我對錯誤的意外結果以及它創建的循環更感興趣。

TL;博士

  1. 什麼會導致此錯誤循環,而不是退出或斷裂了嗎?
  2. 爲什麼如果錯誤處理調用立即退出,但似乎首先似乎無限循環地添加諸如msgbox之類的東西,或者至少在我厭倦了單擊之前似乎發生有限的次數。
  3. 有沒有辦法在代碼中繞過這個問題,以便它在第一次出現錯誤後實際停止?

我最初使用的是一張有600多條記錄的表格,但後來用一張只有10條記錄的小表進行了實驗。 小表查詢SELECT TestEmpHistory.Employee, ConcatRelated("EmpGroup", "TestEmpHistory", "Employee = " & Employee) AS CompliedNames FROM TestEmpHistory重現錯誤。 表TestEmpHistory採用以下格式:
ID(AutoNum)| Employee | EmpGroup |查詢中未引用的其他字段


ID | Employee | EmpGroup |

1 | Employee1 | G & A
2 | Employee1 |銷售
3 | Employee2 | CSR
4 | Employee2 | G & A
5 | Employee3 | CSR
6 | Employee3 |編程
7 | Employee3 | G & A
8 | Employee4 | CSR
9 | Employee4 | CSR
10 | Employee4 |編程

我使用Access 2016

+3

我不認爲有人會讀你所有的問題,你可以總結它或添加一些代碼? – Moreno

回答

1

沒有看完整個帖子,我猜你在一個循環是其原因是因爲它的運行對查詢返回的每一行的代碼。解決這個問題的唯一方法是,當您闖入代碼時暫時將其全部註釋掉,以便查詢可以完成而不會爲每行產生錯誤。完成此操作後,您可以返回並更正您的查詢設計,然後取消註釋功能代碼並再次嘗試。

+0

在點擊它之前,我不得不閱讀它,但它很有意義。這是我第一次在查詢中使用函數。該函數不會停留在循環中,而是調用基本上被阻塞的函數的查詢。問題出在我尋找的地方。在我的疑難解答中丟棄了我的東西是,當查詢中有600多行時,ErrorCount通常只返回33-35個錯誤。它只是這樣做,因爲這是屏幕上可見的行數!我縮小了行高度並增加了ErrorCount以匹配。 –

+0

Upvoted並標記爲回答,雖然我沒有代表upvote計數在這一點。 –

相關問題