2013-03-06 18 views
1

我有一些vba腳本我試圖從窗體上的按鈕運行有點麻煩。訪問數據庫引擎無法鎖定表格 - 使表格腳本爲表格上的字段保留

通過鏈接的MDB文件,我寫了一串Make Table查詢來幫助某些其他查詢工作。我沒有讓用戶逐一重新運行每個單獨的Make Table查詢,而是將查詢放入VBA腳本中(使用DoCmd.RunSQL),然後將該腳本分配給表單上的按鈕。

我使用的數據源也有一個文件信息表,其中包含數據的文件名和文件日期。

當用戶單擊按鈕時,我希望他們知道在生成表格查詢字符串時使用了什麼數據源;這樣他們就知道腳本運行的是什麼數據。

我的做法是使用File Info表創建最終的Make Table查詢,將File Name和File Date放入它自己的表中。

然後,我會將這些字段添加到窗體中,併爲此最終的Make Table查詢添加DoCmd.RunSQL以進入該按鈕的VBA腳本底部;一旦所有的Make表已經運行,文件信息和文件日期字段就會在窗體上顯示/更新,告訴用戶上次腳本運行時使用了什麼數據文件。

這裏是(我已經總結了所有的FileInfo的一些虛假的「AllOtherMakeTables」之前運行make表腳本字符串爲簡便起見)

Private Sub Command0_Click() 

On Error GoTo Err_Command0_Click 

DoCmd.SetWarnings False 

Dim AllOtherMakeTables As String 
Dim FileInfoStamp As String 

AllOtherMakeTables = " SELECT SomeField INTO AnotherTable" _ 
& " FROM SomeTable" _ 

FileInfoStamp = " SELECT FileInfo.FileName, FileInfo.FileDate INTO FileInfoStamp" _ 
& " FROM FileInfo;" _ 

DoCmd.RunSQL AllOtherMakeTables 
DoCmd.RunSQL FileInfoStamp 

DoCmd.SetWarnings True 

Exit_Command0_Click: 
Exit Sub 

Err_Command0_Click: 
    MsgBox Err.Description 
    Resume Exit_Command0_Click 

End Sub 

點擊使用上述產量腳本的按鈕,這個代碼以下錯誤信息:

數據庫引擎無法鎖定表「FileInfoStamp」,因爲它是 已經被另一個人或程序

我認爲正在發生的事情是我添加到窗體(FileName和FileDate)的字段在窗體打開時鎖定FileInfoStamp表,所以當腳本嘗試重新創建FileInfoStamp時,它無法將其作爲表進行操作被鎖住了。

我想這可能只是通過在上面的腳本開始加入DoCmd.Close,然後在腳本的末尾添加DoCmd.OpenForm(基本上封閉形式,同時生成表固定命令運行,然後在最後重新打開表單)。

所有這些雖然是關閉窗體並調出相同的錯誤信息。所以我猜即使窗體是「關閉」,與窗體上的域的連接仍然以某種方式保持活動(...?)

任何有關我如何解決此問題的幫助將不勝感激。謝謝。

回答

0

每次都不要重新創建FileInfoStamp。使用這兩個步驟來代替:

  1. 丟棄現有的行
  2. 追加新數據
Dim db As DAO.database 
Dim FileInfoStamp As String 

FileInfoStamp = "INSERT INTO FileInfoStamp(FileName, FileDate)" & vbCrLf & _ 
    "SELECT fi.FileName, fi.FileDate FROM FileInfo AS fi;" 
Debug.Print FileInfoStamp 

Set db = CurrentDb 
' empty out FileInfoStamp 
db.Execute "DELETE FROM FileInfoStamp;", dbFailOnError 
' add new data to FileInfoStamp 
db.Execute FileInfoStamp, dbFailOnError 
Set db = Nothing 

添加錯誤處理程序來處理任何問題從dbFailOnError止跌回升。

而不是DoCmd.RunSQL,使用DAO數據庫.Execute方法爲您的其他查詢。用這種方法,你將不會有任何動機使用DoCmd.SetWarnings False。關閉SetWarnings是不明智的,因爲它抑制了診斷問題所需的信息。

+0

非常感謝。我對VBA訪問方面有點新鮮,因此,請欣賞方法和新代碼以查找並瞭解該方法的工作原理。您提供的上述方法似乎要求在新數據顯示在表單上的字段之前刷新表單。有沒有比我目前知道的更加優雅的命令('DoCmd.Close'和'DoCmd.OpenForm')? – 2013-03-06 17:04:23

+0

是的,在窗體的代碼模塊中使用VBA,可以說'Me.Requery'。實際上也有一個'.Refresh'方法,但是它只會向你顯示當前行的更新......而不是任何新行。 'Requery'獲得一切。 – HansUp 2013-03-06 17:09:46

相關問題