2016-08-18 51 views
0

我是微軟Access新手,但在過去的一週裏我一直在學習。但現在我被卡住了。我正在編寫VBA代碼,用於檢查用戶是否使用桌面上的當前數據庫版本與服務器上的數據庫版本進行比較。我在後端建立了一個表格,該表格保存每個用戶版本的數值,然後在服務器上存儲最新版本的數值(在更改時由管理員更改)。當前的代碼比較這些值以確定打開的副本是否爲最新版本。如果不是,則會打開服務器上的版本,然後更改後端表中的用戶版本。但我想更改桌面上的副本,以便下次用戶打開副本時,它是新版本,因爲代碼將識別版本是「更新的」。如何使用Access VBA覆蓋桌面上不是服務器上的文件的文件

我知道有My.Computer.FileSystem.CopyFile()可以用來複制一個文件到一個新的位置,並寫在那裏的文件,但如果我使用它將能夠寫入打開的文件並運行生成.CopyFile()命令的代碼?我已經在.CopyFile()命令之前訪問服務器上的版本,但我不知道它是否會真正執行。我也不確定是否喜歡在服務器版本打開後用戶需要重新輸入用戶名和密碼的事實。有沒有人知道如何在用戶不知道的情況下覆蓋桌面上的文件?

+0

爲什麼試圖隱藏有更新可用並將要安裝的事實? ible進程告訴用戶這將發生,關閉前端,安裝新版本並重新打開它。 – dbmitch

回答

1

我已經在之前的數據庫中做過這些工作,並且進行了一些修改,我認爲您可以使其適合您的需求。

我將從檢查版本的角度開始,並發現它是否是最新版本或舊版本。

If Not updated Then 
    Select Case MsgBox("An update is available for your client!!!" _ 
    + " You would be able to use this client version but without new features and support!" _ 
    + " Do you want to update now?", vbYesNo Or vbInformation Or vbDefaultButton1, "Available Update") 
     Case vbYes 
      'Call MsgBox("Please contact your administrator to receive your new client version!!!", vbExclamation Or vbDefaultButton1, "Available Update") 
      Shell "cmd /c ""<whatever path you want>\doupdate.cmd"", vbHide" 'calls a cmd script to do the dirty job of copy -> see below 
      Application.CloseCurrentDatabase 'closes the current database 
      Exit Sub 
     Case vbNo 
      <whatever you want on no> 
    End Select 
End If 

您可以刪除上面的代碼的選擇,它會運行每次變量更新爲False而不詢問用戶。

的CMD腳本代碼如下:

@Echo OFF 

SLEEP 3 
copy "\\server\groups\<whatever path>\file.accde" "%userprofile%\Desktop\file.accde" /Y 
call "%userprofile%\Desktop\file.accde" 
exit 

以上腳本當然不是完美的,因爲一個3秒忙等待的開始時,但我想,以確保訪問有時間關閉。 (問題會很大,如果acccess掛起關閉

你還可以做的是在數據庫的關閉事件上添加上面的命令或命令My.Computer.FileSystem.CopyFile(),但是在這種情況下更新將發生在用戶已經完成了舊版本的工作

請注意,在那種情況下,我希望更新的腳本與數據庫分開,原因是其他原因,即使使用vba進行更新,主要原理也是一樣的,你必須在覆蓋之前關閉文件

+0

我會試試看。我現在所擁有的工作,即使它有一個數據庫打開一秒鐘,然後關閉自己。第二個數據庫充當教程並更新本地計算機上的副本。 – StarkAE

+0

你在做什麼是類似於上述不同的是,上述是一個更「優雅的解決方案」。事實上,您無法覆蓋正在使用的文件。除了上述內容外,您還可以傳遞用戶名和密碼作爲參數,然後在重新打開數據庫時自動連接。然後你將擁有你想要的功能。 – Blenikos

相關問題